SpringBoot整合JPA框架实现过程讲解
作者:一一哥Sun
一. Spring Boot数据访问概述
Spring Data是Spring提供的一个用于简化数据库访问、支持云服务的开源框架。它是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案,其设计目的是使我们可以快速且简单地使用各种数据访问技术。Spring Boot默认采用整合Spring Data的方式统一处理数据访问层,通过添加大量自动配置,引入各种数据访问模板xxxTemplate以及统一的Repository接口,从而达到简化数据访问层的操作。
Spring Data提供了多种类型数据库支持,Spring Boot对Spring Data支持的数据库进行了整合管理,提供了各种依赖启动器。通过一张表罗列Spring Boot提供的常见数据库依赖启动器。
名称 | 描述 |
mybatis-spring-boot-starter | MyBatis启动器 |
mybatis-plus-boot-starter | MyBatis-Plus启动器 |
spring-boot-starter-data-jpa | Spring Data JPA与Hibernate的启动器 |
spring- boot starter-data-redis | Redis键值数据存储与Spring Data Redis和Jedis客户端的启动器 |
spring-boot-starter-data-neo4j | Neo4j图数据库和Spring Data Neo4j的启动器 |
spring-boot-starter-data-mongodb | MongoDB和Spring Data MongoDB的启动器 |
二. Spring Data JPA简介
JPA(Java Persistence API,Java持久化API )是Sun公司官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关系映射的工具管理Java中的关系型数据,其主要目的是简化现有的持久化开发工作和整合ORM(Object Relational Mapping,对象/关系映射)技术。Spring Data在JPA规范的基础上,充分利用其优点,提出了Spring Data JPA模块对具有ORM关系数据进行持久化操作。
Spring Data JPA是Spring在ORM框架、JPA规范的基础上封装的一套JPA应用框架,提供了增删改查等常用功能,使开发者可以用较少的代码实现数据操作,同时还易于扩展。在介绍Spring Boot整合JPA之前,先针对Spring Data JPA的基本使用进行简单介绍。
2.1 编写ORM实体类
Spring Data JPA框架是针对具有ORM关系的数据进行操作,所以在使用Spring Data JPA时,首先需要编写一个实体类与数据表进行映射,并且配置好映射关系。
@Entity(name = "t_comment") // 设置ORM实体类,并指定映射的表名 public class Discuss { @Id // 表明映射对应的主键id @GeneratedValue(strategy = GenerationType.IDENTITY) // 设置主键自增策略 @Column(name = "article_id") // 指定映射的表字段名 private Integer articleId; // Generate: Getter and Setter、toString() }
针对上述代码,壹哥把用到的注解给大家进行简要说明。
@Entity:标注要与数据库做映射的实体类,默认情况下,数据表的名称就是首字母小写的类名。当然,还可以使用name属性指定映射的表名。
@ld:标注在类属性或者getter方法上,表示某一个属性对应表中的主键。
@GeneratedValue:与@ld注解标注在同一位置,用于表示属性对应主键的生成策略,可省略。Spring Data JPA支持的主键生成策略包括有TABLE(使用一个特定的数据库表格来保存主键)、SEQUENCE(不支持主键自增长的数据库主键生成策略)、IDENTITY(主键自增)和AUTO(JPA自主选择前面3种合适的策略,是默认选项)。
@Column:标注在属性上,当类属性与表字段名不同时,能够配合name属性表示类属性对应的表字段名。
2.2 编写Repository接口
针对不同的表数据操作编写各自对应的Repository接口,并根据需要编写对应的数据操作方法。
public interface DiscussRepository extends JpaRepository<Discuss, Integer> { // 1.查询author非空的Discuss评论集合(JPA支持的方法名关键字查询方式) List<Discuss> findByAuthorNotNull(); // 2.根据文章id分页查询Discuss评论集合 @Query("SELECT c FROM t_comment c WHERE c.articleId = ?1") List<Discuss> getDiscussPaged(Integer articleid, Pageable pageable); // 3.使用元素SQL语句,根据文章id分页查询Discuss评论集合,nativeQuery为true表示用来编写原生SQL语句 @Query(value = "SELECT * FROM t_comment WHERE article_Id = ?1", nativeQuery = true) List<Discuss> getDiscussPaged2(Integer articleid, Pageable pageable); //4.根据评论id修改评论作者author @Transactional // 表示支持事务管理 @Modifying // 表示支持数据变更 @Query("UPDATE t_comment c SET c.author = ?1 WHERE c.id = ?2") Integer updateDiscuss(String author, Integer id); // 5.根据评论id删除评论 @Transactional @Modifying @Query("DELETE t_comment c WHERE c.id = ?1") Integer deleteDiscuss(Integer id); }
针对Repository接口编写时的特殊要求,壹哥给大家解释一下。
2.2.1 继承XXRepository<T, ID>接口
我们在使用Spring Data JPA自定义Repository接口时,必须继承XXRepository<T, ID>
接口,其中的T代表要操作的实体类,ID代表实体类主键数据类型。在上述示例中,选择继承了JpaRepository接口,JpaRepository的继承结构如下图所示。
下面对JpaRepository接口继承结构中涉及的接口进行说明,具体如下。
(1) Repository是Spring Data JPA提供的用于自定义Repository接口的顶级父接口,该接口中没有声明任何方法。
(2) CrudRepository接口是Repository的继承接口之一,包含了一些基本的CRUD方法。
(3) PagingAndSortingRepository接口继承CrudRepository接口的同时,提供了分页和排序两个方法。
(4) QueryByExampleExecutor接口是进行条件封装查询的顶级父接口,允许通过Example实例执行复杂条件查询。
JpaRepository接口同时继承了PagingAndSortingRepository接口和QueryByExampleExecutor接口,并额外提供了一些数据操作方法。自定义Repository接口文件时,通常会直接选择继承JpaRepository接口。
2.2.2 操作数据的多种方式
在使用Spring Data JPA进行数据操作时,可以有多种实现方式,主要方式如下。
(1).如果自定义接口继承了JpaRepository接口,则默认包含了一些常用的CRUD方法。
(2).自定义Repository接口中,可以使用@Query注解配合SQL语句进行数据的查、改、删操作。
(3).自定义Repository接口中,可以直接使用方法名关键字进行查询操作。
其中,Spring Data JPA中支持的方法名关键字及对应的SQL片段说明,如下表所示。
2.2.3 @Transactional事务管理
在自定义的Repository接口中,针对数据的变更操作(修改、删除),无论是否使用了@Query注解,都必须在方法上方添加@Transactional注解进行事务管理,否则程序执行就会出现InvalidDataAccessApiUsageException异常。如果在调用Repository接口方法的业务层Service类上已经添加了@Transactional注解进行事务管理,那么Repository接口文件中就可以省略@Transactional注解。
2.2.4 @Moditying注解
在自定义的Repository接口中,使用@Query注解方式执行数据变更操作(修改、删除),除了要使用@Query注解,还必须添加@Moditying注解表示数据变更。
2.3.5 复杂条件查询
JPA还支持使用Example实例进行复杂条件查询。例如,针对JpaRepository接口中已存在的findAll(Example<S> var1)
方法进行查询。
三. 使用Spring Boot整合JPA
使用Spring Boot整合JPA,具体步骤如下。
3.1 添加Spring Data JPA依赖启动器
在项目的pom.xml文件中添加Spring Data JPA依赖启动器。
注意:
我们并没有编写Spring Data JPA对应的版本号,这是因为Spring Boot对Spring Data JPA的版本号进行了统一管理。
3.2 编写ORM实体类
为了方便操作,以之前创建的数据库表t_comment为例编写对应的实体类,将之前创建的Comment类复制一份并重命名为Discuss,同时添加JPA对应的注解进行映射配置。
3.3 编写Repository接口
在com.cy.repository包下创建一个用于对数据库表t_comment进行操作的Repository接口DiscussRepository。
3.4 编写单元测试进行接口方法测试
将Chapter03ApplcationTests测试类在当前位置复制一份并重命名为JpaTests,用来编写JPA相关的单元测试,并对内容稍微修改后编写DiscussRepository接口对应的测试方法。
测试方法中分别使用了JpaRepository默认方法、方法名关键字、@Query注解和Example封装参数的形式进行了数据操作。
3.5 整合测试
选择JpaTests测试类中单元测试方法进行效果的演示。
以上就是SpringBoot中整合JPA框架的过程,你学会了吗?如果还有其他疑问,可以在评论区留言哦。
到此这篇关于SpringBoot整合JPA框架实现过程讲解的文章就介绍到这了,更多相关SpringBoot整合JPA内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!