使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

本项目代码在https://github.com/SysuCodeMan/SpringMVC-Hibernate-IntellijIDEA

一、使用Intellij创建Maven工程,勾选Create from archetype,选择webapp那一项

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

填写组织名称和包名,之后就一路Next可以了

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

之后Maven会自动下载一系列的依赖,等待。。。下载结束后在main文件夹下新建一个Java文件夹,并右键Mark As选择Sources Root,最终的目录结构应为:

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

二、在pom.xml中加入SpringMVC和Hibernate以及相关MySQL的驱动还有Json解析器等依赖:

<properties>
  <java-version>1.8</java-version>
  <org.springframework-version>4.2.6.RELEASE</org.springframework-version>
  <org.aspectj-version>1.6.10</org.aspectj-version>
  <org.slf4j-version>1.6.6</org.slf4j-version>
</properties>

<dependencies>
  <!-- Spring -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${org.springframework-version}</version>
    <exclusions>
      <!-- Exclude Commons Logging in favor of SLF4j -->
      <exclusion>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${org.springframework-version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${org.springframework-version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.0.4.RELEASE</version>
  </dependency>

  <!-- spring orm -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>4.2.3.RELEASE</version>
  </dependency>

  <!-- Hibernate -->
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.2.5.Final</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.2.5.Final</version>
  </dependency>

  <!-- datasource源jar相关 -->
  <dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
  </dependency>

  <!-- Gson -->
  <dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.1</version>
  </dependency>

  <!-- Logging -->
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${org.slf4j-version}</version>
  </dependency>
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>${org.slf4j-version}</version>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${org.slf4j-version}</version>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.15</version>
    <exclusions>
      <exclusion>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
      </exclusion>
      <exclusion>
        <groupId>javax.jms</groupId>
        <artifactId>jms</artifactId>
      </exclusion>
      <exclusion>
        <groupId>com.sun.jdmk</groupId>
        <artifactId>jmxtools</artifactId>
      </exclusion>
      <exclusion>
        <groupId>com.sun.jmx</groupId>
        <artifactId>jmxri</artifactId>
      </exclusion>
    </exclusions>
    <scope>runtime</scope>
  </dependency>

  <!-- Servlet -->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
  </dependency>
  <!--FastJson-->

  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.9</version>
  </dependency>
  <!-- Test -->
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
  </dependency>

  <!-- MySQL -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.25</version>
  </dependency>
</dependencies>


三、编写SpringMVC和Hibernate的配置文件,最终的文件目录结构为:

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

1.其中root-context的主要信息可以为空

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
   
   <!-- Root Context: defines shared resources visible to all other web components -->
</beans>
  2.重点是servlet-context,存放了SpringMVC以及Hibernate的配置信息

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:context="http://www.springframework.org/schema/context"
             xmlns:mvc="http://www.springframework.org/schema/mvc"
             xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>

    <context:component-scan base-package="com.chris" />

    <!-- 配置hibernate与datasource,datasource使用apache dbcp管理 -->
    <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
                destroy-method="close"><!-- 设置为close使Spring容器关闭同时数据源能够正常关闭,以免造成连接泄露 -->
        <beans:property name="driverClassName" value="${jdbc.driver}" />
        <beans:property name="url" value="${jdbc.url}" />
        <beans:property name="username" value="${jdbc.username}" />
        <beans:property name="password" value="${jdbc.password}" />
        <beans:property name="defaultReadOnly" value="false" /><!-- 设置为只读状态,配置读写分离时,读库可以设置为true
        在连接池创建后,会初始化并维护一定数量的数据库安连接,当请求过多时,数据库会动态增加连接数,
        当请求过少时,连接池会减少连接数至一个最小空闲值 -->
        <beans:property name="initialSize" value="0" /><!-- 在启动连接池初始创建的数据库连接,默认为0 -->
        <beans:property name="maxActive" value="20" /><!-- 设置数据库同一时间的最大活跃连接默认为8,负数表示不闲置 -->
        <beans:property name="maxIdle" value="15"/><!-- 在连接池空闲时的最大连接数,超过的会被释放,默认为8,负数表示不闲置 -->
        <beans:property name="minIdle" value="0" /><!-- 空闲时的最小连接数,低于这个数量会创建新连接,默认为0 -->
        <beans:property name="maxWait" value="20000" /><!--连接被用完时等待归还的最大等待时间,单位毫秒,超出时间抛异常,默认为无限等待 -->
    </beans:bean>

    <!-- 配置我们的会话工厂-->
    <beans:bean id="sessionFactory"
                class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <beans:property name="dataSource">
            <beans:ref bean="dataSource" />
        </beans:property>
        <beans:property name="annotatedClasses">
            <beans:list>
                <beans:value>com.chris.demo.entity.User</beans:value>
            </beans:list>
        </beans:property>
        <beans:property name="hibernateProperties">
            <beans:props>
                <!-- MySQL的方言 -->
                <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</beans:prop>
                <beans:prop key="javax.persistence.validation.mode">none</beans:prop>
                <!-- 必要时在数据库新建所有表格 -->
                <beans:prop key="hibernate.hbm2ddl.auto">update</beans:prop>
                <beans:prop key="hibernate.show_sql">true</beans:prop>
                <!-- 配置current session的上下文环境,方便我们调用sessionFactory获取当前线程统一个session对象 -->
                <beans:prop key="current_session_context_class">thread</beans:prop>
                <!-- 用更漂亮的格式显示sql语句-->
                <!-- <prop key="hibernate.format_sql">true</prop> -->
            </beans:props>
        </beans:property>
        <beans:property name="packagesToScan" value="com.chris"></beans:property>
    </beans:bean>

    <!-- db connection -->
    <beans:bean id="DBconfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <beans:property name="locations">
            <beans:value>classpath:dbconn.properties</beans:value>
        </beans:property>
    </beans:bean>

    <beans:bean id = "userDAO" class="com.chris.demo.dao.UserDAO">
        <beans:property name="sessionFactory" ref="sessionFactory"></beans:property>
    </beans:bean>

    <beans:bean id = "userService" class="com.chris.demo.service.UserService">
        <beans:property name="userDAO" ref="userDAO"></beans:property>
    </beans:bean>

    <beans:bean id ="transmanager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <beans:property name="sessionFactory" ref="sessionFactory"></beans:property>
    </beans:bean>
</beans:beans>

 注意其中最后的dbconn.properties是连接数据库时使用的驱动、用户名、密码等信息,在resource文件夹下新建文件即可

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://127.0.0.1/demo?characterEncoding=UTF-8
jdbc.username = //实际用户名
jdbc.password = //实际密码

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

其中内容为,数据库的url以及username和password属性根据实际而定

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

四、创建数据库表

sql脚本文件如下:

CREATE SCHEMA IF NOT EXISTS `demo`;

CREATE TABLE IF NOT EXISTS `demo`.`user` (
    `userId` INT NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(50) NOT NULL,
    `password` VARCHAR(50) NOT NULL,
    PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
使用MySQL WorkBench执行后结果如下

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

五、在项目中创建与数据库表对应的Java实体类,使用Hibernate的注解使之与数据库中的字段一一对应:

@Entity
@Table(name="user")
public class User {
    private Integer userId;
    private String username;
    private String password;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="userId")
    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    @Basic
    @Column(name="username")
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Basic
    @Column(name = "password")
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

 六、编写DAO层,用于与数据库交互

@Component
public class UserDAO {
    @Autowired
    private SessionFactory sessionFactory;
    private Session session;

    public void add(User user) {
        session = sessionFactory.openSession();
        session.beginTransaction();
        session.save(user);
        session.getTransaction().commit();
    }

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
}
七、编写Service层封装服务,供Controller使用

@Service
public class UserService {
    @Autowired
    UserDAO userDAO;

    public void add(User user) {
        userDAO.add(user);
    }

    public UserDAO getUserDAO() {
        return userDAO;
    }

    public void setUserDAO(UserDAO userDAO) {
        this.userDAO = userDAO;
    }
}
 八、编写Controller,用于处理请求,这里接收一个GET方法,在数据库中添加一个 用户,最后将添加的用户以Json形式返回

@Controller
public class UserController {
    @Autowired
    private UserService userService;

    @ResponseBody
    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public User add(String username, String password) {
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        userService.add(user);
        return user;
    }

}
九、部署到Tomcat上,Intellij部署Tomcat十分方便,另有文章介绍,不再赘述,最后在浏览器访问localhost:8080/add?username=test&password=123,结果如下:

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台

十、查看数据库,可以看到数据成功插入

使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台