(转)CrudRepository JpaRepository PagingAndSortingRepository之间的区别
1. 简介
本文介绍三种不同的Spring Data repository和它们的功能,包含以下三种:
- CrudRepository
- PagingAndSortingRepository
- JpaRepository
简单地说,Spring Data中的每个repository都继承自Repository接口,但是,除此之外,它们每个又有不同的功能。
2. Spring Data Repositories
首先介绍JpaRepository,它继承自PagingAndSortingRepository,而PagingAndSortingRepository又继承自CrudRepository。
每个都有自己的功能:
- CrudRepository提供CRUD的功能。
- PagingAndSortingRepository提供分页和排序功能
- JpaRepository提供JPA相关的方法,如刷新持久化数据、批量删除。
由于三者之间的继承关系,所以JpaRepository包含了CrudRepository和PagingAndSortingRepository所有的API。
当我们不需要JpaRepository和PagingAndSortingRepository提供的功能时,可以简单使用CrudRepository。
下面我们通过例子更好地理解它们提供的API。
首先创建Product实体:
@Entity
public class Product {
@Id
private long id;
private String name;
// getters and setters
}
然后实现通过名称查询Product的操作:
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
Product findByName(String productName);
}
这样就实现了通过名称查询Product的方法,Spring Data Repository根据方法名自动生成相应的实现。
3. CrudRepository
先看下CrudRepository接口的源码:
public interface CrudRepository<T, ID extends Serializable>
extends Repository<T, ID> {
<S extends T> S save(S entity);
T findOne(ID primaryKey);
Iterable<T> findAll();
Long count();
void delete(T entity);
boolean exists(ID primaryKey);
}
方法功能介绍:
- save(...) – 保存多个对象。这里,我们可以传多个对象批量保存。
- findOne(...) – 根据传入的主键值获取单一对象。
- findAll(...) – 查询数据库中所有对象。
- count() – 返回表中记录总数。
- delete(...) – 根据传入的对象删除记录。
- exists(...) – 根据传入的主键值判断对象是否存在。
CrudRepository接口看起来非常简单,但实际上它提供了所有基本查询保存等操作。
4. PagingAndSortingRepository
PagingAndSortingRepository接口的源码如下:
public interface PagingAndSortingRepository<T, ID extends Serializable>
extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
}
该接口提供了findAll(Pageable pageable)这个方法,它是实现分页的关键。
使用Pageable时,需要创建Pageable对象并至少设置下面3个参数:
- 1、 每页包含记录数
- 2、 当前页数
- 3、 排序
假设我们要显示第一页的结果集,一页不超过5条记录,并根据lastName升序排序,下面代码展示如何使用PageRequest和Sort获取这个结果:
Sort sort = new Sort(new Sort.Order(Direction.ASC, "lastName"));
Pageable pageable = new PageRequest(0, 5, sort);
5. JpaRepository
JpaRepository接口源码:
public interface JpaRepository<T, ID extends Serializable> extends
PagingAndSortingRepository<T, ID> {
List<T> findAll();
List<T> findAll(Sort sort);
List<T> save(Iterable<? extends T> entities);
void flush();
T saveAndFlush(T entity);
void deleteInBatch(Iterable<T> entities);
}
简单介绍下每个方法的作用:
- findAll() – 获取数据库表中所有实体。
- findAll(…) – 根据条件获取排序后的所有实体。
- save(…) – 保存多个实体。这里可以传入多个对象批量保存。
- flush() – 将所有挂起的任务刷新到数据库。
- saveAndFlush(…) – 保存实体并实时刷新到数据库。
- deleteInBatch(…) – 删除多个实体。这里可以传入多个对象并批量删除。
显然,JpaRepository接口继承自PagingAndSortingRepository,PagingAndSortingRepository继承自CrudRepository,所以JpaRepository拥有CrudRepository所有的方法。
6. Spring Data Repositories的缺点
尽管Spring Data Repositories有很多优点,但是它们也有缺点:
- 这种方式把我们的代码和类库以及具体抽象(如:Page和Pageable)绑定。它们不是这个类库独有的,但是我们必须小心不要暴露这些内部实现的细节。
- 通过继承CrudRepository接口,我们暴露了所有方法。这可能满足大部分情况,但是我们可能会遇到这样的情况:我们希望获得对公开的方法的更细粒度的控制,例如创建一个不包含save(...)和delete(...)的ReadOnlyRepository,此时继承CrudRepository就不满足要求了。
(转)CrudRepository JpaRepository PagingAndSortingRepository之间的区别的更多相关文章
- 004 JpaRepository,CrudRepository,PagingAndSortingRepository的区别
很多程序都在使用,CrudRepository或者PagingAndSortingRepository,但是以前自己的程序使用的是JpaRepository,然后查了一下材料,记录一下. 1.类图 2 ...
- select、poll、epoll之间的区别总结
select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...
- 你真的会玩SQL吗?EXISTS和IN之间的区别
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- [转]ExtJs基础--Html DOM、Ext Element及Component三者之间的区别
要学习及应用好Ext框架,必须需要理解Html DOM.Ext Element及Component三者之间的区别. 每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的DOM ...
- iOS中assign,copy,retain之间的区别以及weak和strong的区别
@property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...
- javascrip中parentNode和offsetParent之间的区别
首先是 parentNode 属性,这个属性好理解,就是在 DOM 层次结构定义的上下级关系,如果元素A包含元素B,那么元素B就可以通过 parentElement 属性来获取元素A. 要明白 off ...
- 面试问题5:const 与 define 宏定义之间的区别
问题描述:const 与 define 宏定义之间的区别 (1) 编译器处理方式不同 define宏是在预处理阶段展开: const常量是编译运行阶段使用: (2) 类型和安全检查不同 ...
- 关于背景图相对父容器垂直居中问题 —— vertical-align 和 line-height 之间的区别
html css <div class="register-wrapper"> <div class="register"> &l ...
- 转:WCF、WebAPI、WCFREST、WebService之间的区别
WCF.WebAPI.WCFREST.WebService之间的区别 注明:转载 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API ...
随机推荐
- Vue管理系统前端系列六动态路由-权限管理实现
目录 为什么要使用动态路由? 主流的两种实现方式 前端控制 后端控制 后端控制路由 实现 添加菜单接口 及 菜单状态管理 根据得到的菜单生成动态路由 根据 vuex 中的暂存的菜单生成侧边菜单栏 退出 ...
- zookeeper简单实现注册与发现以及其他基本操作
添加依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookee ...
- Web自动化必会知识:「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」
1.web 基础-html.dom 对象.js 基本语法 Dom 对象里面涉及元素定位以及对元素的修改.因为对元素操作当中涉及的一些 js 操作,js 基本语法要会用.得要掌握前端的基本用法.为什么要 ...
- .NetCore使用Redis,StackExchange.Redis队列,发布与订阅,分布式锁的简单使用
环境:之前一直是使用serverStack.Redis的客服端,今天来使用一下StackExchange.Redis(个人感觉更加的人性化一些,也是免费的,性能也不会差太多),版本为StackExch ...
- SQL语句中IF的简单使用 - 关联leetcode 627.交换工资
MySQL的IF既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用: IF表达式 IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 & ...
- Java 的开发效率究竟比 C++ 高在哪里?
有几个原因 大师助手解决你的烦恼1. 语言上,Java是一个比C++更容易parse得多的语言,所以相应的工具链IDE会更容易做,无论多大的Java的项目,就是新手写完都不会有编译错误.但是写 ...
- 现在的市场对 C++ 的需求大吗?
分享 大师助手 先说结论:需求还是很大,但是没有什么初级程序员能干的岗位. 游戏引擎,存储,推荐引擎,infra,各种各样的性能敏感场景.这些都是C++的刚需场景,别的语言基本替代不了的.除了pin ...
- 不要盲目使用新技术,说的就是你,JWT!
其实我更想聊标题的前半部分,后半部分只是拉出来做典型的. 简历上写上一句,"热衷于学习新技术",孬管是不是真的,至少加分项是可以有的. 再看看标题,我是来搞笑的? 学习与使用,两回 ...
- RabbitMQ配置文件(rabbitmq.conf)
rabbitmq.conf配置文件示例: #====================================== #RabbitMQ经纪人部分 #======================= ...
- 利用分块传输吊打所有WAF--学习笔记
在看了bypassword的<在HTTP协议层面绕过WAF>之后,想起了之前做过的一些研究,所以写个简单的短文来补充一下文章里“分块传输”部分没提到的两个技巧. 技巧1 使用注释扰乱分块数 ...