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有很多优点,但是它们也有缺点:

  1. 这种方式把我们的代码和类库以及具体抽象(如:Page和Pageable)绑定。它们不是这个类库独有的,但是我们必须小心不要暴露这些内部实现的细节。
  2. 通过继承CrudRepository接口,我们暴露了所有方法。这可能满足大部分情况,但是我们可能会遇到这样的情况:我们希望获得对公开的方法的更细粒度的控制,例如创建一个不包含save(...)和delete(...)的ReadOnlyRepository,此时继承CrudRepository就不满足要求了。

(转)CrudRepository JpaRepository PagingAndSortingRepository之间的区别的更多相关文章

  1. 004 JpaRepository,CrudRepository,PagingAndSortingRepository的区别

    很多程序都在使用,CrudRepository或者PagingAndSortingRepository,但是以前自己的程序使用的是JpaRepository,然后查了一下材料,记录一下. 1.类图 2 ...

  2. select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...

  3. 你真的会玩SQL吗?EXISTS和IN之间的区别

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  4. [转]ExtJs基础--Html DOM、Ext Element及Component三者之间的区别

    要学习及应用好Ext框架,必须需要理解Html DOM.Ext Element及Component三者之间的区别. 每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的DOM ...

  5. iOS中assign,copy,retain之间的区别以及weak和strong的区别

    @property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...

  6. javascrip中parentNode和offsetParent之间的区别

    首先是 parentNode 属性,这个属性好理解,就是在 DOM 层次结构定义的上下级关系,如果元素A包含元素B,那么元素B就可以通过 parentElement 属性来获取元素A. 要明白 off ...

  7. 面试问题5:const 与 define 宏定义之间的区别

    问题描述:const 与 define 宏定义之间的区别 (1) 编译器处理方式不同     define宏是在预处理阶段展开:     const常量是编译运行阶段使用: (2) 类型和安全检查不同 ...

  8. 关于背景图相对父容器垂直居中问题 —— vertical-align 和 line-height 之间的区别

       html css <div class="register-wrapper"> <div class="register"> &l ...

  9. 转:WCF、WebAPI、WCFREST、WebService之间的区别

    WCF.WebAPI.WCFREST.WebService之间的区别   注明:转载 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API ...

随机推荐

  1. 记录一次idae和maven设置的巨坑

    这个忽略pom.xml文件千万别勾选,不然会导致项目的pom.xml怎么填写都无法导入新的依赖包!

  2. DML语言(数据操纵语言)

    #DML语言/*数据操作语言:插入:insert修改:update删除:delete */ #一.插入语句#方式一:经典的插入/*语法:insert into 表名(列名,...) values(值1 ...

  3. 7.深入k8s:任务调用Job与CronJob及源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 在使用job中,我会结合源码进行一定的讲解,我们也可以从源码中一窥究竟,一些细节k8s是 ...

  4. latex:公式的序号

    1.排序单位 在文类book或report中,行间公式是以章为排序单位的,即每一新章节开始,公式序号计数器equation就被清零.比如第1章第3个公式的序号是(1.3),第2章第1个公式的序号是(2 ...

  5. QString 字符串操作

    Qt QString字符串分割.截取(转载) 在做项目中不可避免的会使用到一串字符串中的一段字符,因此常常需要截取字符串. 有两种方式可以解决这个问题: 方法一:QString分割字符串: QStri ...

  6. CVPR2020 面向密集多角度物体检测的动态修正网络(DRN)

    论文链接:https://arxiv.org/pdf/2005.09973.pdf code:https://github.com/Anymake/DRN_CVPR2020 文章概要: 本文是中科院自 ...

  7. 1008 Elevator (20 分)(模拟)

    The highest building in our city has only one elevator. A request list is made up with N positive nu ...

  8. JVM学习第二天(垃圾回收器和内存分配策略)大章

    说道垃圾回收器大家应该都会有所了解,GC白,当然说道具体的可能就不是很清楚了,今天我们就来玩一玩; GC要做的事情: 第一步:确定堆中需要回收的对象; 第二步:什么时候回收; 第三步:怎样回收 为什么 ...

  9. Zabbix如何监控Linux防火墙服务

    今天在巡检的时候,突然想到Zabbix能否监控Linux的防火墙服务呢? 显然是可以的,但是Zabbix 5下默认的模板"Template OS Linux by Zabbix agent& ...

  10. C:将算术表达式的符号和数分开

    程序: #include <stdio.h> #include <string.h> static int pos=; static char* line; void test ...