这篇文章是在SpringMVC的基础上对数据持久层JPA的整合,实现了应用层和数据库的数据交互。在整合JPA前,请先参照下面第一篇博文搭建好SpringMVC框架。
SpringMVC框架的搭建和配置详解请参考:http://blog.csdn.net/jianyuerensheng/article/details/51258942。
JPA的ORM框架原理介绍请参考:http://blog.csdn.net/jianyuerensheng/article/details/50804360。
JPA生命周期、映射关系详解请参考:http://blog.csdn.net/jianyuerensheng/article/details/50819155。
项目整体结构如下: 1.在web.xml文件中进行配置
<!-- 引入 applicationContext.xml配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value> </context-param> <!-- 解决JPA因EntityManager关闭导致的延迟加载例外(异常) --> <filter> <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 123456789101112131415 1234567891011121314152. 添加spring上下文配置文件applicationContext.xml.
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd "> <context:component-scan base-package="com.zjn.service" /> <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="locations"> <list> <value>classpath*:META-INF/spring/*.properties</value> </list> </property> </bean> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"> <property name="properties" ref="configProperties"></property> </bean> <!-- 当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有@Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。 --> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> <!-- Jpa 事务配置 --> <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <!--jpaVendorAdapter:指定实现JPA的适配器 --> <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="true" /> <property name="database" value="${database}" /> <property name="databasePlatform" value="org.hibernate.dialect.MySQLMyISAMDialect" /> </bean> <!-- JPA实体管理工厂的配置 --> <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="persistenceUnitName" value="persistenceUnit" /> <property name="dataSource" ref="dataSource" /> <property name="jpaVendorAdapter" ref="jpaVendorAdapter" /> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${database.driverClassName}" /> <property name="url" value="${database.url}" /> <property name="username" value="${database.username}" /> <property name="password" value="${database.password}" /> <property name="testOnBorrow" value="true" /> <property name="testOnReturn" value="true" /> <property name="testWhileIdle" value="true" /> <property name="timeBetweenEvictionRunsMillis" value="1800000" /> <property name="numTestsPerEvictionRun" value="3" /> <property name="minEvictableIdleTimeMillis" value="1800000" /> <property name="defaultAutoCommit" value="false" /> </bean> <!-- Spring Data Jpa配置 --> <jpa:repositories base-package="com.zjn.repository" entity-manager-factory-ref="entityManagerFactory"></jpa:repositories> </beans> 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778793. 添加JPA配置文件 persistence.xml。
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.jdbc.batch_size" value="30" /> <property name="hibernate.use_sql_comments" value="true" /> <!--自动输出schema创建DDL语句 --> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" /> <property name="hibernate.connection.charSet" value="UTF-8" /> </properties> </persistence-unit> </persistence> 123456789101112131415161718 1234567891011121314151617184. 数据库配置文件 database.properties
database=MYSQL database.url=jdbc:mysql://localhost:3306/spring?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8&characterSetResults=UTF-8 database.username=root database.password=smit0296139 database.driverClassName=com.mysql.jdbc.Driver 123456 1234565.UserRepository.Java
package com.zjn.repository; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import com.zjn.entity.User; public interface UserRepository extends JpaRepository<User, Long> { @Query("select u from User u where id = :id") public User findById(@Param("id") Long id); @Query("select u from User u ") public List<User> findAlls(); @Query("select count(id) from User u ") public Long countId(); } 12345678910111213141516171819202122 123456789101112131415161718192021226.UserController.java
package com.zjn.controller; import java.util.List; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import com.zjn.entity.User; import com.zjn.repository.UserRepository; /** * 用户管理 * * @author zjn */ @Controller public class UserController { @Autowired UserRepository userRepository; @RequestMapping("") public String Create(Model model) { return "create"; } @RequestMapping("/save") public String Save(@ModelAttribute("form") User user, Model model) { // user:视图层传给控制层的表单对象;model:控制层返回给视图层的对象 User user2 = userRepository.saveAndFlush(user); model.addAttribute("user", user2); return "detail"; } } 12345678910111213141516171819202122232425262728293031323334353637 123456789101112131415161718192021222324252627282930313233343536377.运行结果 初始化界面: 输入内容: 点击创建运行结果: