介绍Spring Data Common里面的公用基本方法

(1)Spring Data Common的Repository

  Repository位于Spring Data Common的lib里面,是Spring Data里面做数据库操作的最底层的抽象接口、最顶级的父类,源码里面其实什么方法都没有,仅仅起到一个标识作用。管理域类以及域类的id类型作为类型参数,此接口主要作为标记接口捕获要使用的类型,并帮助你发现扩展此接口的接口。Spring底层做动态代理的时候发现只要是它的子类或者实现类,都代表储存库操作

  Repository的源码如下

  有了这个类,我们就能顺藤摸瓜,找到好多Spring Data JPA提供的基本接口和操作类,及其实现方法。这个接口定义了所有Repostory操作的实体和ID两个泛型参数。我们不需要继承任何接口,只要继承这个接口,就可以使用Spring JPA里面提供的很多约定的方法查询和注解查询。

(2)CrudRepository方法详解  

  通过类关系图可以看到CrudRepository提供了公共的通用的CRUD方法。

  CrudRepository interface内容

(1)保存实体方法。我们通过刚才的类关系查看其他实现类。SimpleJpaRepository里面的实现方法

  

    我们发现它是先检查传进去的实体是不是存在,然后判断是新增还是更新;是不是存在两种根据机制,一种是根据主键来判断,另一种是根据Version来判断(后面讲解Version的时候详解)。如果我们去看JPA控制台打印出来的SQL,最少会有两条,一条是查询,一条是insert或者update。

(2)批量保存。原理和步骤(1)相同。实现方法就是for循环调用上面的save方法。

(3)根据主键查询实体。
(4)根据主键判断实体是否存在。
(5)查询实体的所有列表。
(6)根据主键列表查询实体列表。
(7)查询总数。
(8)根据主键删除。我们通过刚才的类关系查看其他实现类。SimpleJpaRepository里面的实现方法:

    我们看到JPA会先去查询一下,再做保存,不存在抛出异常。这里特别强调一下delete和save方法,因为在实际工作中有的人会画蛇添足,自己先去查询再做判断处理,其实Spring JPA底层都已经考虑到了。

 

(3)PagingAndSortingRepository方法详解

  通过类的关系图,我们可以看到PagingAndSortingRepository继承CrudRepository所有的基本方法,它增加了分页和排序等对查询结果进行限制的基本的、常用的、通用的一些分页方法。

  PagingAndSortingRepository interface内容

    (1)根据排序取所有对象的集合。

    (2)根据分页和排序进行查询,并用Page对象封装。Pageable对象包含分页和Sort对象。

  PagingAndSortingRepository和CrudRepository都是Spring Data Common的标准接口,如果我们采用JPA,那它对应的实现类就是Spring Data JPA的model里面的SimpleJpaRepository。如果是其他NoSQL的实现Mongodb,那它的实现就在Spring Data Mongodb的model里面。

(4)JpaRepository方法详解

  JpaRepository到这里可以进入分水岭了,上面的那些都是Spring Data为了兼容NoSQL而进行的一些抽象封装,从JpaRepository开始是对关系型数据库进行抽象封装。从类图可以看得出来它继承了PagingAndSortingRepository类,也就继承了其所有方法,并且实现类也是SimpleJpaRepository。从类图上还可以看出JpaRepository继承和拥有了QueryByExampleExecutor的相关方法。

  通过源码和CrudRepository相比较,它支持Query By Example,批量删除,提高删除效率,手动刷新数据库的更改方法,并将默认实现的查询结果变成了List。

 

(5)Repository的实现类SimpleJpaRepository

  SimpleJpaRepository是JPA整个关联数据库的所有Repository的接口实现类。如果想进行扩展,可以继承此类,如QueryDsl的扩展,还有默认的处理机制。如果将此类里面的实现方法看透了,基本上JPA的API就能掌握大部分。同时也是Spring JPA动态代理的实现类,包括我们后面讲的Query Method。

最新文章

  1. kvc(键-值编码)
  2. XML基础学习01
  3. js 继承
  4. getbyclass
  5. paramiko堡垒机、线程及锁
  6. XMLHTTPRequest的属性和方法简介
  7. C#委托的语法
  8. Java笔记(二十五)……其他常用API
  9. AlarmManager.setRepeating将不再准确
  10. Oralce 字符串截取
  11. .net概述1
  12. Android基础学习之context
  13. Oracle EBS-SQL (INV-4):检查负库存记录数.sql
  14. 反射以及 getDeclaredMethods()和getMethods()区别
  15. js表格排序 & 去除字符串空格
  16. HashMap源码深入研究
  17. ionic开发环境搭建之android及问题
  18. JAVA如何实现深拷贝
  19. SpringMVC项目读取不到外部CSS文件的解决办法及总结
  20. 【Python selenium自动化环境配置】4步搞定ChromeDriver版本选择

热门文章

  1. [转帖]基于VIM漏洞CVE-2019-12735的VIM宏后门病毒详解
  2. Objective-C中的自动释放池
  3. 使用批处理选择运行控制台程序(简易cui)
  4. form表单添加富文本编辑器
  5. html元素标签时间格式化
  6. React中构造函数constractor,为什么要用super(props)
  7. HTML-简单动画
  8. Python 安装cx_Oracle模块折腾笔记
  9. oracle获取年、月、日
  10. python语音提示