使用Intellij IDEA通过Maven+Hibernate+Spring Mvc构建Java后台
本项目代码在https://github.com/SysuCodeMan/SpringMVC-Hibernate-IntellijIDEA
一、使用Intellij创建Maven工程,勾选Create from archetype,选择webapp那一项
填写组织名称和包名,之后就一路Next可以了
之后Maven会自动下载一系列的依赖,等待。。。下载结束后在main文件夹下新建一个Java文件夹,并右键Mark As选择Sources Root,最终的目录结构应为:
二、在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的配置文件,最终的文件目录结构为:
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 = //实际密码
其中内容为,数据库的url以及username和password属性根据实际而定
四、创建数据库表
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执行后结果如下
五、在项目中创建与数据库表对应的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,结果如下:
十、查看数据库,可以看到数据成功插入