文章目录

  • Spring Data JPA是什么?
  • Spring Data JPA的配置
    • 配置pom.xml
    • 配置applicationContext.xml
  • Spring Data JPA的使用
  • Spring Data JPA的运行原理

Spring Data JPA是Spring数据家族的一部分,它使得实现基于JPA访问数据库变得很容易。它增强了对JPA的支持,使得构建使用数据访问技术的spring驱动的应用程序变得更加容易。

Spring Data JPA是什么?

上一期我们讲过了JDBC和原生JPA,而JPA的使用还比较麻烦,每次访问数据库,我们都需要创建EntityManagerFactory工厂类、获得EntityManager、创建事务、提交事务,最后释放资源。这样的操作明显是很繁琐的。

于是,Spring Data JPA出现了。Spring Data JPA是基于原生JPA的封装,它使得我们使用JPA变得更加简单,且拥有更强大的功能。

Spring Data JPA的配置

配置pom.xml

引入以下依赖:

  • Slf4j日志
  • Spring核心
  • Spring Data JPA支持
  • Druid连接池
  • Hibernate核心和JPA支持
  • MySQL驱动
  • *Junit单元测试
  • *Lombok
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.koorye</groupId><artifactId>hellospringdatajpa</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- Slf4j --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version><scope>test</scope></dependency><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.2.7.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.2.7.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.2.7.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.7.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring</artifactId><version>5.2.7.RELEASE</version><type>pom</type></dependency><!-- Spring Data JPA --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-commons</artifactId><version>2.3.1.RELEASE</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId><version>2.3.1.RELEASE</version></dependency><!-- Druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.21</version></dependency><!-- Hibernate --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.10.Final</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>5.4.10.Final</version></dependency><!-- MySQL --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.20</version></dependency><!-- Test --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.2.7.RELEASE</version><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version></dependency></dependencies>
</project>

配置applicationContext.xml

配置Spring Data JPA分为6步:

  • 配置连接池,此时选用Druid

  • 配置EntityManagerFactory,其中需要指定:

    • dataSource 连接池

    • packageToScan 实体类包的位置

    • persistenceProvider 持久化提供者,此处选择Hibernate提供的持久化

    • jpaVendorAdapter JPA供应商适配器,其中需要提供一个bean,包含一个jpaVendorAdapter类,而bean有一些配置:

      • generateDdl 是否自动创建数据表
      • database 指定数据库类型
      • showSql 是否显示sql语句
      • databasePlatform 配置数据库方言
    • jpaDialect JPA方言

  • 配置transcationManager事务管理器,指定一个JPATranscationManager类,并提供EntityManagerFactory

  • 整合springDataJPA,使用jpa:repository标签,指定以下内容:

    • base-package 指定JPA方法类包的位置

    • transaction-manager-ref 引用transactionManager

    • entity-manager-factory-ref 引用entityManagerFactory

  • 配置自动装配,使用component-scan标签

<?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:jpa="http://www.springframework.org/schema/data/jpa"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"><!-- Data source --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/><property name="username" value="root"/><property name="password" value="root"/></bean><!-- Entity manager factory, provided by hibernate --><bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="dataSource" ref="dataSource"/><property name="packagesToScan" value="org.koorye.pojo"/><property name="persistenceProvider"><bean class="org.hibernate.jpa.HibernatePersistenceProvider"/></property><!-- Adapter --><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"><property name="generateDdl" value="false"/><property name="database" value="MYSQL"/><property name="showSql" value="true"/><!-- SQL dialect --><property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/></bean></property><!-- JPA dialect --><property name="jpaDialect"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/></property></bean><!-- Transaction manager --><bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory"/></bean><!-- Spring data JPA --><jpa:repositories base-package="org.koorye.dao"transaction-manager-ref="transactionManager"entity-manager-factory-ref="entityManagerFactory"/><!-- Component scan --><context:component-scan base-package="org.koorye"/>
</beans>

Spring Data JPA的使用

Spring Data JPA的使用分为3步:

  • 根据数据表编写实体类,并配置实体类与表、类属性与表字段的映射关系
  • 编写持久层接口,不需要编写实现类!
  • 调用接口方法

首先来实现一个实体类,大部分内容与上一期相同,不再介绍:

package org.koorye.pojo;import lombok.Getter;
import lombok.Setter;import javax.persistence.*;@Getter
@Setter
@Entity
@Table(name = "user")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "u_id")private int id;@Column(name = "u_name")private String name;@Overridepublic String toString() {return "ID: " + id + ", Name: " + name;}
}

接下来编写一个接口类,注意此处继承了两个接口:

  • JpaRepository<实体类名, 主键类型> 提供基本的CRUD功能
  • JpaSpecificationExecutor<实体类名> 提供多条件查询的支持
package org.koorye.dao;import org.koorye.pojo.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;public interface UserDao extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {}

最后来测试一下:

package org.koorye;import org.junit.Test;
import org.junit.runner.RunWith;
import org.koorye.dao.UserDao;
import org.koorye.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class SpringDataJPATest {@Autowiredprivate UserDao userDao;@Testpublic void TestFindAll() {List<User> userList = userDao.findAll();for (User user : userList) {System.out.println(user);}}
}

注意到,我们的接口类并没有findAll方法,该方法继承自JpaRepository接口。

输出结果,测试成功:

Hibernate: select user0_.u_id as u_id1_0_, user0_.u_name as u_name2_0_ from user user0_
ID: 1, Name: 冬马和纱
ID: 2, Name: 小木曾雪菜Process finished with exit code 0

Spring Data JPA的运行原理

为什么我们仅仅编写了接口,就可以使用其方法呢?

首先我们来明确几点:

  • Java必须通过实现类调用方法
  • Java动态代理可以生成接口的实现类

事实上,Spring Data JPA就是通过动态代理实现接口,再装配到我们的持久层类上的。

在调用userDao.findAll方法时,Spring Data JPA实际上调用JdkDynamicAopProxy创建动态代理对象。

而这个动态代理对象就是UserDao接口的实现类,名为simpleJpaRepository,这个实现类实现了UserDao继承的接口,从而拥有方法。

simpleJpaRepository中实现的方法,正是通过EntityManager的各种方法实现的。

【Spring Data JPA自学笔记二】初识Spring Data JPA相关推荐

  1. 【Spring Data JPA自学笔记三】Spring Data JPA的基础和高级查询方法

    文章目录 调用接口的基础方法查询 Repository CrudRepository PagingAndSortingRepository JPARepository JpaSpecification ...

  2. Spring Boot 框架学习笔记(二)(配置文件与数据注入 yaml基本语法 JSR303数据验证 多环境切换 )

    Spring Boot 框架学习笔记(二) 六.appliaction.properties配置与数据注入 6.1 `@Value`注解 测试注入数据 读取输入流 6.2 读取配置文件数据注入 单文件 ...

  3. 数据结构自学笔记二、栈

    数据结构自学笔记二.栈 栈的定义 栈的作用 栈的顺序存储与随机存储 栈的基本功能的实现 先以顺序存储结构的栈为例. 然后再说说随机存储结构的栈吧 两栈共享空间 栈的一个重要应用--四则运算 算式的后缀 ...

  4. Spring Boot基础学习笔记17:Spring Boot默认缓存

    文章目录 零.学习目标 一.缓存概述 (一)引入缓存管理的重要性 (二)Spring Boot的缓存管理 二.Spring Boot默认缓存 (一)数据准备 (二)创建Spring Boot项目 - ...

  5. Spring Boot基础学习笔记06:Spring Boot整合MyBatis

    文章目录 零.学习目标 1.了解Spring Boot数据访问概述 2.掌握使用注解的方式整合MyBatis 3.掌握使用配置文件的方式整合MyBatis 一.Spring Boot数据访问概述 二. ...

  6. 【Spring Data JPA自学笔记五】一对多、多对多和级联

    文章目录 数据库表的关系 一对多 多对多 Spring Data JPA实现一对多 基本配置 实现一对多 放弃维护权 Spring Data JPA实现多对多 基本配置 实现多对多 级联 之前的所有操 ...

  7. 【Spring Data JPA自学笔记一】JPA是什么?JPA访问数据库初体验

    文章目录 JPA是什么? JDBC的诞生 JPA的诞生 如何使用JPA? 配置JPA 配置pom.xml 配置persistence.xml 实现POJO类 调用JPA方法 关于EntityManag ...

  8. Spring Data JPA使用必备(二):Spring Data JPA方法命名规则实现SQL自动生成

    Spring data JPA是一个好东西,但是对于很多习惯于写SQL,直接怼数据库的人来说,这个真的用不习惯,还被一致认为是一个不易于程序员发展的技术.因为JPA提供了标准的封装,在操作数据库的时候 ...

  9. Spring Boot基础学习笔记07:Spring Boot整合JPA

    文章目录 零.学习目标 1.熟悉Spring Data JPA基本语法和使用 2.掌握Spring Boot与JPA的整合使用 一.Spring Data JPA概述 1.Spring Data JP ...

最新文章

  1. runnable和handler联合实现计时循环
  2. 6.2 K-Means 算法步骤-机器学习笔记-斯坦福吴恩达教授
  3. zzuli 2525: 咕咕的搜索序列
  4. 给csdn-blog开发组的建议(Kevins)
  5. Linux中7个用来浏览网页和下载文件的命令
  6. Intellij IDEA 系统路径配置
  7. MarkDown(七)——LaTeX数学公式符号标记
  8. 解决React Native使用Fetch API请求网络报Network request failed
  9. Visual Studio 自定义控件不显示在工具箱
  10. 期刊论文发表的格式详细介绍
  11. 笔记本电脑频繁自动重启_电脑一直自动重启,教您电脑一直自动重启怎么解决...
  12. DHCP中继配置(思科)
  13. 老师用计算机教我们画画拼音,《ang eng ing ong》教案
  14. java dma_Kernel DMA
  15. 2021年,我推荐你学习的编程语言,各类语言横向对比
  16. BIM模型文件下载——某幼儿园设计方案Revit模型
  17. 在window下查看占用tomcat进程,杀死进程并启用tomcat
  18. matlab解常微分方程
  19. 神经肿瘤组学基础知识、工作流程及应用
  20. 子曾经曰过,今天应该要振奋精神了。

热门文章

  1. ad hoc模式的wifi网简介及其搭建
  2. 前端开发需要什么技术?
  3. iqoo8如何添加桌面原子组件
  4. 计算机系统中输入汉字的方法有,有关中小学计算机汉字输入方法的思考
  5. base64加密原理解析
  6. 从3,5,7游戏看为佐夫博弈
  7. flume自定义sink
  8. 3306. 有钱人买钻石
  9. python学习笔记——flask之flask-wtf
  10. 嵌入式成长轨迹27 【Linux应用编程强化】【中嵌第二阶段】【进程管理】