Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法
public interface Repository<T, ID extends Serializable> { }
Spring Data可以让我们只定义接口,只要遵循 Spring Data的规范,就无需写实现类。
与继承 Repository 等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClass 和 idClass 属性。如下两种方式是完全等价的
Respository子接口
Respository子接口
基础的 Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下:
1.Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类
2.CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法
3.PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法
4.JpaRepository: 继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法
自定义的 XxxxRepository 需要继承 JpaRepository,这样的 XxxxRepository 接口就具备了通用的数据访问控制层的能力。
JpaSpecificationExecutor: 不属于Repository体系,实现一组 JPA Criteria 查询相关的方法
/**Repository---仓库
*
* 1.Repository是一个空接口,即是一个标记接口
* 2.若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个Repository Bean
* 纳入到IOC容器中,进而可以在该接口中定义满足一定规范的方法
*
* 3.实际上,也可以通过@RepositoryDefinition注解来代替Repository接口
* */
/**
* .在Repository子接口中声明方法
* 1.不是随便声明的,而需要符合一定的规范
* 2.查询方法以find|read|get开头
* 3.涉及条件查询时,条件的属性用条件关键字连接,
* 4.要注意的是:条件属性以首字母大写
* 5.支持属性的级联查询,若当前类有符合条件的属性,则优先使用,而不使用级联属性
* 若需要使用级联属性,则属性之间使用_进行连接
* */
/*@RepositoryDefinition( domainClass = Person.class,idClass=Integer.class)*/
public interface PersonRepository extends Repository<Person,Integer>{
//根据lastName来获取对应的Person
Person getByLastName(String lastName);
}
}