前言
在《Spring 框架组件之 Spring Data》中,讲述 Spring 框架组件 SpringData 使用时提到了到 Spring Data 组件一个很重要的接口 Repository 接口,本篇文章在《Spring 框架组件之 Spring Data》的基础上着重讲述一下 Repository 接口。
Repository 接口概述
Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法;
1
| public interface Repository<T, ID extends Serializable> { }
|
Spring Data 可以让我们自定义接口,只要遵循 Spring Data 的规范,就无需写实现类,例如:
1 2
| public interface PersonRepsotory extends Repository<Person,Integer>{ }
|
与继承 Repository 等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClass 和 idClass 属性。如下两种方式是完全等价的,如下图

Repository 的子接口
基础的 Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下:

- -Repository:仅仅是一个标识,表明任何继承它的均为仓库接口类
- -CrudRepository<:继承 Repository,实现了一组 CRUD 相关的方法
- -PagingAndSortingRepository:继承 CrudRepository,实现了一组分页排序相关的方法
- -JpaRepository:继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法
- - 自定义的 XxxxRepository:需要继承 JpaRepository,这样的 XxxxRepository 接口就具备了通用的数据访问控制层的能力
- -JpaSpecificationExecutor:不属于 Repository 体系,实现一组 JPA Criteria 查询相关的方法。
CrudRepository 接口
CrudRepository 接口提供了最基本的对实体类的添删改查操作
- T save(T entity); // 保存单个实体
- Iterablesave(Iterable<? extends T> entities);// 保存集合
- T findOne(ID id);// 根据 id 查找实体
- boolean exists(ID id);// 根据 id 判断实体是否
- IterablefindAll();// 查询所有实体,不用或慎用!
- long count();// 查询实体数量
- void delete(ID id);// 根据 Id 删除实体
- void delete(T entity);// 删除一个实体
- void delete(Iterable<? extends T> entities);// 删除一个实体的集合
- void deleteAll();// 删除所有实体,不用或慎用!
PagingAndSortingRepository 接口
该接口提供了分页与排序功能
- IterablefindAll(Sort sort);// 排序
- PagefindAll(Pageable pageable);// 分页查询(含排序功能)
JpaRepository 接口
该接口提供了 JPA 的相关功能
- ListfindAll(Sort sort);// 排序、查找所有实体
- Listsave(Iterable<? extends T> entities);// 保存集合
- void flush();// 执行缓存与数据库同步
- T saveAndFlush(T entity);// 强制执行持久化
- void deleteInBatch(Iterableentities);// 删除一个实体集合
JpaSpecificationExecutor 接口
该接口不属于 Repository 体系,它实现一组 JPA Criteria 查询相关的方法

- -Specification:封装 JPA Criteria 查询条件。通常使用匿名内部类的方式来创建该接口的对象
自定义 Repository 方法
为某一个 Repository 上添加自定义方法,详见《SpringData 组件之自定义 Repository 方法》。