背景
由于项目组的开发任务不是很多,便被安排去支持其他项目组进行项目重构,由于架构师的建议,重构项目采用Spring Boot,放弃了传统的Mybatis持久层框架,选择了Spring Data JPA的方式,因为一直以来对JPA只是简单学习过,并没有过多的实际开发经验,借此机会来学习一下~
简介
JPA 是 JDK 5.0 新增的协议,通过相关持久层注解(@Entity 里面的各种注解)来描述对象和关系型数据里面的表映射关系,并将 Java 项目运行期的实体对象,通过一种Session持久化到数据库中。
JPA 的内容分类
(1)一套 API 标准定义了一套接口,在 javax.persistence 的包下面,用来操作实体对象,执行 CRUD 操作,而实现的框架(Hibernate)替代我们完成所有的事情,让开发者从烦琐的 JDBC 和 SQL 代码中解脱出来,更加聚焦自己的业务代码,并且使架构师架构出来的代码更加可控。
(2)定义了一套基于对象的 SQL:Java Persistence Query Language(JPQL),像 Hibernate 一样,我们通过写面向对象(JPQL)而非面向数据库的查询语言(SQL)查询数据,避免了程序与数据库 SQL 语句耦合严重,比较适合跨数据源的场景(一会儿 MySQL,一会儿 Oracle 等)。
(3)ORM(Object/Relational Metadata)对象注解映射关系,JPA 直接通过注解的方式来表示 Java 的实体对象及元数据对象和数据表之间的映射关系,框架将实体对象与 Session 进行关联,通过操作 Session 中不通实体的状态,从而实现数据库的操作,并实现持久化到数据库表中的操作,与 DB 实现同步。
JPA 的开源实现
JPA 的宗旨是为 POJO 提供持久化标准规范,可以集成在 Spring 的全家桶使用,也可以直接写独立 application 使用,任何用到 DB 操作的场景,都可以使用,极大地方便开发和测试,所以 JPA 的理念已经深入人心了。Spring Data JPA、Hibernate 3.2+、TopLink 10.1.3 以及 OpenJPA、QueryDSL 都是实现 JPA 协议的框架,他们之间的关系结构如下图所示:
简单学习使用
Repository 接口
使用过的人都应该了解,Repository 是Spring Data JPA中的顶级接口,查看 Common 里面的 Resposiory 源码,了解一下里面实现了什么。如下所示:
package org.springframework.data.repository;
import org.springframework.stereotype.Indexed;
@Indexed
public interface Repository<T, ID> {
}
里面什么方法都没有,但是如果任何接口继承它,就能得到一个 Repository,还可以实现 JPA 的一些默认实现方法。只要是它的子类或者实现类,再利用 T 类以及 T 类的 主键 ID 类型作为泛型的类型参数,就可以来标记出来、并捕获到要使用的实体类型,就能帮助使用者进行数据库操作。
查看其类关系图如下:
根据网上其他人的记载,比较常用的有如下接口:
Repository(org.springframework.data.repository),没有暴露任何方法;
CrudRepository(org.springframework.data.repository),简单的 Curd 方法;
PagingAndSortingRepository(org.springframework.data.repository),带分页和排序的方法;
QueryByExampleExecutor(org.springframework.data.repository.query),简单 Example 查询;
JpaRepository(org.springframework.data.jpa.repository),JPA 的扩展方法;
JpaSpecificationExecutor(org.springframework.data.jpa.repository),JpaSpecification 扩展查询;
QueryDslPredicateExecutor(org.springframework.data.querydsl),QueryDsl 的封装。
和两个实现类:
SimpleJpaRepository(org.springframework.data.jpa.repository.support),JPA 所有接口的默认实现类;
QueryDslJpaRepository(org.springframework.data.jpa.repository.support),QueryDsl 的实现类。
先简单理解一些JPA的概念和基本结构,后续对JPA的实现进行细致学习,再做补充~