![Spring Data JPA从入门到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/731/26793731/b_26793731.jpg)
上QQ阅读APP看书,第一时间看更新
2.3 CrudRepository方法详解
通过类关系图可以看到CrudRepository提供了公共的通用的CRUD方法。
2.3.1 CrudRepository interface内容
![](https://epubservercos.yuewen.com/4D44C0/15253387904117506/epubprivate/OEBPS/Images/Figure-P31_2588.jpg?sign=1738906454-hnKws89Z8Shq9MgWafk6Upw6fihq55Ib-0-222849827cce5cf0550dbc5906a108f6)
(1)保存实体方法。我们通过刚才的类关系查看其他实现类。
SimpleJpaRepository里面的实现方法:
![](https://epubservercos.yuewen.com/4D44C0/15253387904117506/epubprivate/OEBPS/Images/Figure-P31_2589.jpg?sign=1738906454-O0S0txpY23cpLEe9eoBBpyMKjcnxYL0H-0-e91d02b58abdcc51a1766403efbf755d)
我们发现它是先检查传进去的实体是不是存在,然后判断是新增还是更新;是不是存在两种根据机制,一种是根据主键来判断,另一种是根据Version来判断(后面讲解Version的时候详解)。如果我们去看JPA控制台打印出来的SQL,最少会有两条,一条是查询,一条是insert或者update。
(2)批量保存。原理和步骤(1)相同。实现方法就是for循环调用上面的save方法。
(3)根据主键查询实体。
(4)根据主键判断实体是否存在。
(5)查询实体的所有列表。
(6)根据主键列表查询实体列表。
(7)查询总数。
(8)根据主键删除。我们通过刚才的类关系查看其他实现类。
SimpleJpaRepository里面的实现方法:
![](https://epubservercos.yuewen.com/4D44C0/15253387904117506/epubprivate/OEBPS/Images/Figure-P32_2808.jpg?sign=1738906454-kWq89kvR11QBamzgLjxo4KC3eBD8W2bT-0-bb1743251bd6ac9d4cde2a11a8d30966)
我们看到JPA会先去查询一下,再做保存,不存在抛出异常。
这里特别强调一下delete和save方法,因为在实际工作中有的人会画蛇添足,自己先去查询再做判断处理,其实Spring JPA底层都已经考虑到了。
2.3.2 CrudRepository interface的使用示例
使用也很简单,只需要自己的Repository继承CrudRepository即可。
第1章的示例我们修改如下:UserCrudRepository继承CrudRepository。
![](https://epubservercos.yuewen.com/4D44C0/15253387904117506/epubprivate/OEBPS/Images/Figure-P32_2809.jpg?sign=1738906454-Zkwpx3MTF03s3qQwuK9cJ2bLpaugiAhT-0-63d1e0554b8a8954cbf9471892883f28)
第1章的示例UserController修改如下:
![](https://epubservercos.yuewen.com/4D44C0/15253387904117506/epubprivate/OEBPS/Images/Figure-P32_2810.jpg?sign=1738906454-7JBy62f15U1KG3k3y6tfJlpH0UvAciYj-0-1c297beff4ee08e3b69d375069ff6df9)
然后启动运行就可以直接看效果了。