Spring整合JPA开发框架
JPA框架虽然具备合理的数据层处理逻辑,但重复度依然很高。利用Spring整合JPA可以很方便的进行数据库连接管理EntityManagerFactory管理和业务层事务控制,极大的简化了JPA开发的复杂度。下面使用数据库连接池、AOP事务控制等配置文件整合二者。
项目源码地址:https://gitee.com/tirklee/lea-spring-jpa
- 创建数据库脚本
DROP DATABASE if EXISTS lea_spring_jpa;
create database lea_spring_jpa character set UTF8;
use lea_spring_jpa;
create TABLE dept(
deptno BIGINT AUTO_INCREMENT,
dname VARCHAR(50),
constraint deptno primary key (deptno)
)ENGINE=InnoDB;
- 新建项目lea-spring-jpa
在pom.xml文件配置spring、c3p0、aop以及spring-orm依赖库。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xiyue</groupId>
<artifactId>Lea-spring-jpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Lea-spring-jpa</name>
<description>Lea-spring-jpa</description>
<properties>
<c3p0.version>0.9.1.2</c3p0.version>
<spring.version>5.0.3.RELEASE</spring.version>
<mysql.version>8.0.23</mysql.version>
<junti.version>4.12</junti.version>
<compiler.version>3.6.1</compiler.version>
<jdk.version>1.8</jdk.version>
<project.build.sourceEnoding>UTF-8</project.build.sourceEnoding>
<hibernate.version>5.2.13.Final</hibernate.version>
</properties>
<dependencies>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junti.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>${hibernate.version}</version>
</dependency>
</dependencies>
<build>
<finalName>leaspring</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler.version}</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>${project.build.sourceEnoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
- src/main/resources/dev/config/database.properties配置数据库信息
database.driverClass=com.mysql.cj.jdbc.Driver
database.url=jdbc:mysql://192.168.1.6:3306/lea_spring_jpa
database.user=root
database.password=123456
- src/main/resources/META-INF/persistence.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="LEA_SPRING_JPA"><!-- 定义持久化单元 -->
<!-- <shared-cache-mode/>元素可以使用的配置项如下。
ALL:所有的实体类都被缓存。
NONE:所有的实体类都不被缓存。
ENABLE_SELECTIVE:标识@Cacheable(true) 注解的实体类将被缓存。
DISABLE_SELECTIVE:缓存除标识@Cacheable(false) 以外的所有实体类。
UNSPECIFIED:默认值,JPA 产品默认值将被使用。
-->
<!-- <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> -->
<properties>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
- src/main/resources/spring/spring-jpa.xml配置文件,进行dataSource、EntityManagerFactory以及事务transaction的配置。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="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-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<context:component-scan base-package="com.xiyue.leaspring"/>
<context:property-placeholder location="classpath:dev/config/database.properties"/>
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${database.driverClass}"/>
<property name="jdbcUrl" value="${database.url}"/>
<property name="user" value="${database.user}"/>
<property name="password" value="${database.password}"/>
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/><!-- 数据源 -->
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/><!-- JPA核心配置文件 -->
<property name="persistenceUnitName" value="LEA_SPRING_JPA"/><!-- 持久化单元名称 -->
<property name="packagesToScan" value="com.xiyue.leaspring"/><!-- PO类扫描包 -->
<property name="persistenceProvider"><!-- 持久化提供类,本次为hibernate -->
<bean class="org.hibernate.jpa.HibernatePersistenceProvider"/>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
</property>
</bean>
<!-- 定义事务管理的配置,必须配置PlatformTransactionManager接口子类 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
- 建立IDeptDAO数据层接口。
package com.xiyue.leaspring.dao;
import java.util.List;
import com.xiyue.leaspring.po.Dept;
public interface IDeptDao {
/**
* 新增新的部门数据
* @param vo
* @return
*/
public boolean doCreate(Dept vo);
/**
* 查询全部部门数据
* @return
*/
public List<Dept> findAll();
}
- 定义IDeptDAO接口的子类DeptDAOImpl。
package com.xiyue.leaspring.dao.impl;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.xiyue.leaspring.dao.IDeptDao;
import com.xiyue.leaspring.po.Dept;
@Repository
public class DeptDaoImpl implements IDeptDao {
@PersistenceContext//获得EntityManager(配置文件只配置了EntityManagerFactory)
private EntityManager entityManager;//JPA操作对象
@Transactional
@Override
public boolean doCreate(Dept vo) {
return this.entityManager.merge(vo)!=null;
}
@Override
public List<Dept> findAll() {
String jpql = "select d from Dept as d";
TypedQuery<Dept>query = this.entityManager.createQuery(jpql,Dept.class);
return query.getResultList();
}
}
- 定义IDeptService业务接口。
package com.xiyue.leaspring.service;
import java.util.List;
import com.xiyue.leaspring.po.Dept;
public interface IDeptService {
/**
* 新增部门数据调用IDeptDao.doCreate方法处理
* @param vo 持久化类对象,没有设置主键
* @return 增加成功返回true,否则返回false
*/
public boolean add(Dept vo);
/**
* 查询dept表中得全部数据
* @return Dept持久化对象集合
*/
public List<Dept> list();
}
- 定义IDeptService接口实现子类DeptServiceImpl。
package com.xiyue.leaspring.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.xiyue.leaspring.dao.IDeptDao;
import com.xiyue.leaspring.po.Dept;
import com.xiyue.leaspring.service.IDeptService;
@Service
public class DeptServiceImpl implements IDeptService {
@Autowired//注入IDeptDaos接口实例
private IDeptDao deptDao;
@Override
public boolean add(Dept vo) {
// TODO Auto-generated method stub
return this.deptDao.doCreate(vo);//增加实例
}
@Override
public List<Dept> list() {
// TODO Auto-generated method stub
return this.deptDao.findAll();//数据查询
}
}
- 建立测试类,实现IDeptService增加业务测试。
package com.xiyue.leaspring.service;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.xiyue.leaspring.po.Dept;
@ContextConfiguration(locations = {"classpath:spring/spring-*.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class IDeptServiceTest {
@Autowired
private IDeptService deptService;
@Test
public void testAdd() {
Dept vo = new Dept();
vo.setDname("市场部");
System.out.println(this.deptService.add(vo));
}
}
Hibernate:
insert
into
dept
(dname)
values
(?)
true
- 测试IDeptService接口查询功能。
package com.xiyue.leaspring.service;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.xiyue.leaspring.po.Dept;
@ContextConfiguration(locations = {"classpath:spring/spring-*.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class IDeptServiceTest {
@Autowired
private IDeptService deptService;
@Test
public void testList() {
List<Dept> allDepts = this.deptService.getlist();
allDepts.forEach((dept)->{
System.out.println(dept);
});
}
}
Hibernate:
select
dept0_.deptno as deptno1_0_,
dept0_.dname as dname2_0_
from
dept dept0_
Dept [deptno=1, dname=财务部]
Dept [deptno=2, dname=销售部]
Dept [deptno=3, dname=市场部]
Dept [deptno=4, dname=市场部]
此时,程序利用Spring实现了JPA开发框架的管理,并且从整体实现效果来讲已经帮助用户简化了事务控制、连接管理等操作,用户可以只关注于核心业务实现过程。
本文介绍了如何使用Spring整合JPA来管理数据库连接、EntityManagerFactory和事务控制,通过配置数据库连接池、AOP事务控制,降低JPA开发的复杂度。详细步骤包括创建数据库脚本、新建Maven项目、配置pom.xml、database.properties、persistence.xml和spring-jpa.xml文件,以及实现数据层、业务层接口和测试。通过这种方式,开发者可以专注于业务逻辑,提高开发效率。
722

被折叠的 条评论
为什么被折叠?



