前言
这是在对慕课网的SpringBoot博客站实战课程学习中遇到JpaRepository
接口时就想要写的,但是一直没动手,毕竟懒癌,最近延毕了,所以有点空闲时间就来开篇了。仅仅是匆忙地做个记录,还不清楚到底主旨是要表达什么,所以先用“JPA与Spring-data-Jpa”这个标题好了,后面可能再做修改。
1. JPA
JPA是Java Persistence API的缩写,它的本质是一种ORM(Object Relational Mapping,描述对象和表的关系)的规范,它虽然没有实现具体的ORM框架,但它为所有的ORM框架定义了标准的API,提供了一系列的接口,显然接口是无法直接使用的,虽然说可以面向接口编程,但是,每个开发者都自说自话地做一套实现是很不利于项目的移植扩展的。所以JPA最大的贡献是为ORM实现提供了统一的规范,这其中包括了Hibernate、TopLink等。
我从SpringData Jpa、Hibernate、Jpa 三者之间的关系这篇文章中看到一张图,十分形象地反映了JPA和各种ORM框架的关系。
2. Spring Data JPA
早先Spring在持久层的业务逻辑并没有太多的帮助,但在Spring Data JPA出现之后,各种实体类的持久性业务开发也变得轻松了起来。Spring Data JPA 在JPA的规范下提供了Repository层的实现,但Spring并没有指定使用什么样的ORM框架,因此这里依然需要开发者自行决定。
这带来的最大便利是:虽然ORM都实现了JPA的规范,但是不同框架之间的差异化依然使得切换是需要成本的(重写持久化业务逻辑代码),Spring Data JPA使得我们能够免去这部分成本,唯一要做的,就只是声明持久层的接口。
3. Spring Data JPA的使用
Spring Data JPA 中定义了一个访问底层数据模型的超级接口Repository
,而将其对于数据的具体操作在它的子接口中定义
public interface Repository<T, ID extends Serializable> {
}
所有继承这个接口的interface
都被spring管理,只要遵循Spring Data规范,就无需为它编写实现类。
3.1 Repository
Repository的中文语义是资源库,这里表示实体与数据映射层交互,也可以理解为DAO层。
Spring Data中提供了几个Repository,并依据层次扩展了具体功能,分别是:
Repository
:仅仅是一个标识,表明任何继承它的接口均为仓库类,方便Spring扫描;CrudRepository
:继承自Repository
,从名称上就可以看出它实现了一组CRUD方法;PagingAndSortingRepository
:继承自CrudRepository
,实现了一组分页、排序相关的方法;JpaRepository
:继承自PagingAndSortingRepository
,实现了一组JPA规范的方法;JpaSpecificationExecutor
:它并不属于Repository
的体系,实现一组JPA Criteria查询相关的方法 。
我们自定义的Repository
通常要继承自JpaRepository
,这样我们自定义的XXXRepository
就具有了数据访问层的能力。
3.2 Repository的基本功能
3.2.1 CrudRepository
T save(T entity);//保存单个实体
Iterable<T> save(Iterable<? extends T> entities);//保存集合
T findOne(ID id);//根据id查找实体
boolean exists(ID id);//根据id判断实体是否存在
Iterable<T> findAll();//查询所有实体,不用或慎用!
long count();//查询实体数量
void delete(ID id);//根据Id删除实体
void delete(T entity);//删除一个实体
void delete(Iterable<? extends T> entities);//删除一个实体的集合
void deleteAll();//删除所有实体,不用或慎用