Spring整合JPA开发框架

本文介绍了如何使用Spring整合JPA来管理数据库连接、EntityManagerFactory和事务控制,通过配置数据库连接池、AOP事务控制,降低JPA开发的复杂度。详细步骤包括创建数据库脚本、新建Maven项目、配置pom.xml、database.properties、persistence.xml和spring-jpa.xml文件,以及实现数据层、业务层接口和测试。通过这种方式,开发者可以专注于业务逻辑,提高开发效率。
摘要由CSDN通过智能技术生成

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开发框架的管理,并且从整体实现效果来讲已经帮助用户简化了事务控制、连接管理等操作,用户可以只关注于核心业务实现过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追Star仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值