★ Spring Data的价值
高度统一:只需要一套API: Spring Data,可以同时访问SQL数据和NoSQL数据库。
真正掌握Spring Data之后,你可以做到随心所欲地访问任意的SQL数据库和NoSQL数据库。
开发者:只需要面向通用的Spring Data API编程,程序就可以自由地在各种SQL或NoSQL技术之间切换。
★ Spring Data及其子项目
从结构上来说,Spring Data相当于是一个总的项目,Spring Data包括如下子项目:
Spring Data JDBC:Spring Data对传统JDBC的封装。
Spring Data JPA:Spring Data对JPA的封装。
Spring Data MongoDB:Spring Data对MongoDB的封装。
Spring Data Redis:Spring Data对Redis的封装。
...
从逻辑关系上来说,Spring Data相当于Spring Data Xxx子项目的抽象层,而Spring Data Xxx是具体实现。
实际上Spring Data还包括一个Spring Data Commons子项目,该子项目就是Spring Data的通用抽象层。
习惯:常常所说的,面向Spring Data编程,其实是面向Spring Data Commons子项目编程,
该子项目才是Spring Data的通用抽象层。
★ 强大的Spring Data
▲ 从代码简化的角度来说,DAO组件(官方叫Repository组件)的各种通用CRUD方法完全不需要开发者编写任何代码,
Spring Data能通过动态代理的方式动态地生成CRUD方法。
如果你要简单,Spring Data说:OK,你不需要写任何代码。我就能帮你搞定通用的CRUD操作。
▲ 从功能强大的角度来说,Spring Data既允许开发者自定义SQL或NoSQL查询语句来执行查询、从而优化查询。
如果你要优化SQL语句,Spring Data说:OK,你只要用注解提供SQL语句,剩下的查询过程我就能帮你搞定。
▲ 也允许开发者直接调用相应技术的底层API来实现数据访问,完全是鱼和熊掌可以得兼。
如果你要完全接管数据库访问方法的代码实现,Spring Data说:OK,剩下的交给你了。
★ Repository接口
DAO组件(官方叫Repository组件),没什么区别,名字不一样而已。
▲ Repository接口是Spring Data通用抽象层的核心API,所有DAO组件都应该继承它或它的子接口。
Repository接口派生了如下两个子接口:
- CrudRepository:主要提供了各种CRUD方法,继承该接口的DAO组件不用编写任何代码
就可执行各种通用的CRUD数据访问及各种数据查询 。
- ReactiveCrudRepository:类似于CrudRepository接口,只不过它的方法都是反应式的,
因此它的方法的返回值都是Mono或Flux。
PagingAndSortingRepository 接口继承了CrudRepository接口,增加了分页和排序功能。
(额外增加了分页和排序的方法)
------补充一点,其实CrudRepository本身也可做分页和排序(通过传入额外参数),
因此实际上CrudRepository用得更多一些。
ReactiveSortingRepository 接口则继承了ReactiveCrudRepository接口,
它相当于PagingAndSortingRepository的反应式版本。
ReactiveSortingRepository 这个是反应式 API ,就是那个 webFlux ,不需要做分页,
因为这种反应式的API,拿到的不是数据,拿到的是 Flux(集合数据用这个接收) 或者是 Mono(单个数据用这个接收) ,
Flux 里面有方法可以每次批量获取一定量的数据,所以也不需要分页。
★ 具体Repository接口
前面4个XxxRepository属于Spring Data Commons子项目,属于Spring Data的通用抽象层,
如果让DAO组件继承它们,这样DAO组件的底层就可以在任意持久化技术、甚至任意数据存储技术
(不管是SQL数据库也好,还是NoSQL数据库也好)之间自由切换。
四个是这几个:CrudRepository、ReactiveCrudRepository
PagingAndSortingRepository 、ReactiveSortingRepository
此外,各Spring Data Xxx子项目也提供了对应的XxxRepository,比如:
Spring Data JPA 提供了 JpaRepository、
Spring Data MongoDB 提供了 MongoRepository......
这些针对特定技术的Spring Data Xxx子项目提供的XxxRepository都是PagingAndSortingRepository
或ReactiveSortingRepository的子接口。
一般,并不建议面向XxxRepository接口编程,因为这种接口是属于Spring Data Xxx子项目。不是Spring Data抽象层。