【Spring Boot】认识 JPA 的接口

认识 JPA 的接口

  • 1.JPA 接口 JpaRepository
  • 2.分页排序接口 PagingAndSortingRepository
  • 3.数据操作接口 CrudRepository
  • 4.分页接口 Pageable 和 Page
  • 5.排序类 Sort

JPA 提供了操作数据库的接口。在开发过程中继承和使用这些接口,可简化现有的持久化开发工作。可以使 Spring 找到自定义接口,并生成代理类,后续可以把自定义接口注入 Spring 容器中进行管理。在自定义接口过程中,可以不写相关的SQL操作,由代理类自动生成。

在这里插入图片描述
此前,在《分层开发 Web 应用程序》这篇博文中,已经讲述了 Repository 的概念,在此和大家一起回顾一下。

在 Spring 中有 Repository 的概念,Repository 原意指的是 仓库,即 数据仓库 的意思。Repository 居于 业务层数据层 之间,将两者隔离开来,在它的内部封装了数据查询和存储的逻辑。这样设计的好处有两个:

  • 降低层级之间的耦合:更换、升级 ORM 引擎(Hibernate)并不会影响业务逻辑。
  • 提高测试效率:如果在测试时能用 Mock 数据对象代替实际的数据库操作,运行速度会快很多。

DAO 是传统 MVC 中 Model 的关键角色,全称是 Data Access Object。DAO 直接负责数据库的存取工作,乍一看两者非常类似,但从架构设计上讲两者有着本质的区别。

Repository 蕴含着真正的 OO 概念,即一个数据仓库角色,负责所有对象的持久化管理。DAO 则没有摆脱数据的影子,仍然停留在数据操作的层面上。Repository 是相对对象而言,DAO 则是相对数据库而言,虽然可能是同一个东西 ,但侧重点完全不同。

在 Spring 和 Spring Data JPA 中,有三种 Repository 接口方便开发者直接操作数据仓库。它们之间的关系如下:
在这里插入图片描述

1.JPA 接口 JpaRepository

JpaRepository 继承自 PagingAndSortingRepository。该接口提供了 JPA 的相关实用功能, 以及通过 Example 进行查询的功能。Example 对象是 JPA 提供用来构造查询条件的对象。该接口的关键代码如下:

public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {}

在上述代码中,T 表示 实体对象,ID 表示 主键。ID 必须实现序列化。

JpaRepository 提供的方法如下表所示。

方法
描述
List<T> findAll();查找所有实体
List<T> findAll(Sort var1);排序、查找所有实体
List<T> findAllById(Iterable<ID> var1);返回制定一组 ID 的实体
<S extends T> List<S> saveAll(Iterable<S> var1);保存集合
void flush();执行缓存与数据库同步
<S extends T> S saveAndFlush(S var1);强制执行持久化
void deleteInBatch(Iterable<T> var1);删除一个实体集合
void deleteAllInBatch();删除所有实体
T getOne(ID var1);返回 ID 对应的实体。如果不存在,则返回空值
<S extends T> List<S> findAll(Example<S> var1);查询满足 Example 的所有对象
<S extends T> List<S> findAll(Example<S> var1, Sort var2);查询满足 Example 的所有对象,并且进行排序返回

2.分页排序接口 PagingAndSortingRepository

PagingAndSortingRepository 继承自 CrudRepository 提供的分页和排序方法。其关键代码如下:

@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort var1);Page<T> findAll(Pageable var1);
}

其方法有如下两种

  • Iterable<T> findAII(Sort sort):排序功能。它按照 sort 制定的排序返回数据。
  • Page<T> findAll(Pageable pageable):分页查询(含排序功能)。

3.数据操作接口 CrudRepository

CrudRepository 接口继承自 Repository 接口,并新增了增加、删除、修改和查询方法。 CrudRepository 提供的方法见下表:

方法
说明
<S extends T> S save(S entity)保存实体。当实体中包含主键时,JPA 会进行更新操作
<S extends T> Iterable<S> saveAll(Iterable<S> entities)保存所有实体。实体必须不为空
Optional<T> findById(ID id)根据主键 id 检索实体
boolean existsById(ID id)根据主键 id 检索实体,返回是否存在。值为布尔类型
Iterable<T> findAll()返回所有实体
Iterable<T> findAllById(Iterable<ID> ids)根据给定的一组 id 值返回一组实体
long count()返回实体的数量
void deleteById(ID id)根据 id 删除数据
void delete(T entity)删除给定的实体
void deleteAll(Iterable<? extends T> entities)删除实体
void deleteAll()删除所有实体

4.分页接口 Pageable 和 Page

Pageable 接口用于构造翻页查询,返回 Page 对象。Page 从 0 0 0 开始分页。

例如,可以通过以下代码来构建文章的翻页查询参数。

@RequestMapping("/article")
public ModelAndView articleList(@RequestParam(value = "start", defaultvalue = "0") Integer start, @RequestParam(value = "limit", defaultvalue = "10") Integer limit) {start = start < 0 ? 0 : start;  Sort sort = new Sort(Sort.Direction.DESC, "id");Pageable pageable = PageRequest.of(start, limit, sort);Page<Article> page = articleRepository.findAll(pageable);ModelAndView mav = new ModelAndView("admin/article/list");mav.addObject("page", page);return mav;
}

然后,再调用它的参数获取总页数、上一页、下一页和末页,见以下代码。

<div><a th:href="@(/article(start=0)}">[首页]</a><a th:if="$(not page.isFirst())" th:href="@{/article(start=${page.number-1})}">[上页]</a><a th:if="$(not page.isLast())" th:href="@(/article(start=$(page.number+1})}">[下页]</a><a th:href="@{/article(start=$(page.totalPages-1}))">[末页]</a>
</div>

5.排序类 Sort

Sort 类专门用来处理排序。最简单的排序就是先传入一个属性列,然后根据属性列的值进行排序。默认情况下是升序排列。它还可以根据提供的多个字段属性值进行排序。

例如以下代码是通过 Sort.Order 对象的 List 集合来创建 Sort 对象的:

List<Sort.Order> orders = new ArrayList<>();
orders.add(new Sort.Order(Sort.Direction.DESC, "id"));
orders.add(new Sort.Order(Sort.Direction.ASC, "view"))Pageable pageable = PageRequest.of(start, limit, sort);
Pageable pageable = PageRequest.of(start, limit, Sort.by(orders));

Sort 排序的方法还有下面几种:

  • 直接创建 Sort 对象,适合对单一属性做排序。
  • 通过 Sort.Order 对象创建 Sort 对象,适合对单一属性做排序。
  • 通过属性的 List 集合创建 Sort 对象,适合对多个属性采取同一种排序方式的排序。
  • 通过 Sort.Order 对象的 List 集合创建 Sort 对象,适合所有情况,比较容易设置排序方式。
  • 忽略大小写排序。
  • 使用 JpaSort.unsafe 进行排序。
  • 使用聚合函数进行排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/38147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot学习,如何用redission实现分布式锁

目录 一、springboot框架介绍二、redission是什么三、什么是分布式锁四、如何用redission实现分布式锁 一、springboot框架介绍 Spring Boot是一个开源的Java框架&#xff0c;由Pivotal团队&#xff08;现为VMware的一部分&#xff09;于2013年推出。它旨在简化Spring应用程序…

大数据面试题之Spark(1)

目录 Spark的任务执行流程 Spark的运行流程 Spark的作业运行流程是怎么样的? Spark的特点 Spark源码中的任务调度 Spark作业调度 Spark的架构 Spark的使用场景 Spark on standalone模型、YARN架构模型(画架构图) Spark的yarn-cluster涉及的参数有哪些? Spark提交jo…

编码大模型系列:Meta创新的“代码编译优化”的LLM

鲁班号导读正式上线。移步“鲁班秘笈”&#xff0c;查阅更多内容。 大型语言模型 (LLM) 已在各种软件工程和编码任务中展现出卓越的能力。然而&#xff0c;它们在代码和编译器优化领域的应用仍未得到充分探索。训练LLM需要大量资源&#xff0c;需要大量的 GPU时间和大量的数据…

一个合理的前端应用文件结构

在大型应用中&#xff0c;最关键且最具挑战性的方面之一就是拥有一个良好且合理的文件结构。在考虑通过微前端将代码库拆分成多个应用之前&#xff0c;可以遵循一些步骤来改善项目级别的架构&#xff0c;并在您考虑这一路径时使过渡更容易。 我们的目标是应用某种模块化方法&am…

MSPM0G3507——定时器例程讲解4——timx_timer_mode_periodic

以下示例以周期模式配置TimerG并切换LED。周期从500ms开始&#xff0c;每次切换减少50ms&#xff0c;直到周期为100ms&#xff0c;然后重复。设备在等待中断时保持待机模式 #include "ti_msp_dl_config.h"/* ((32KHz / (321)) * 0.5s) 45 - 1 495 due to N1 ticks …

Qt中用QLabel创建状态灯

首先ui设计中分别创建了4个大灯和4个小灯。 编辑.h文件 #ifndef LED_H #define LED_H#include <QWidget> #include <QLabel>QT_BEGIN_NAMESPACE namespace Ui { class Led; } QT_END_NAMESPACEclass Led : public QWidget {Q_OBJECTpublic:Led(QWidget *parent n…

服务器硬件以及RAID配置

目录 一、RAID磁盘阵列原理&#xff08;嘎嘎重要&#xff09; 1、RAID的概述 2、常用的RAID 2.1、RAID 0 2.2、RAID 1 2.3、RAID 5 2.5、RAID 10 3、阵列卡介绍 二、建立软件RAID磁盘阵列 1、添加硬盘 2、使用fdisk分区&#xff0c;类型为fd 3、mdata命令使用参数 …

安全与加密常识(3)什么是数字签名和数字证书

文章目录 数字签名工作原理关键特点应用实例 数字证书数字证书和数字签名趣味实例 数字签名 数字签名是一种通过密码运算生成的数据&#xff0c;用于验证信息的完整性和来源&#xff0c;确保数据在传输过程中未被篡改&#xff0c;同时提供发送者的身份认证和防止抵赖的功能。它…

Qt: QPushButton 按钮实现 上图标下文字

效果如下&#xff1a; 实现有如下几种方式&#xff1a; 1. 使用 QPushButton 设置 setStyleSheet 例&#xff1a; ui->recorder->setStyleSheet("QPushButton{"\"border: 1px solid #00d2ff; "\"min-height: 60px; "\"col…

python多继承的3C算法

python多继承的3C算法 有很多地方都说python多继承的继承顺序&#xff0c;是按照深度遍历的方式&#xff0c;其实python多继承顺序的算法&#xff0c;不是严格意义上的深度遍历&#xff0c;而是基于深度遍历基础上优化出一种叫3C算法 python多继承的深度遍历 class C:def ru…

MySQL高级-MVCC-原理分析(RR级别)

文章目录 1、RR隔离级别下&#xff0c;仅在事务中第一次执行快照读时生成ReadView&#xff0c;后续复用该ReadView2、总结 1、RR隔离级别下&#xff0c;仅在事务中第一次执行快照读时生成ReadView&#xff0c;后续复用该ReadView 而RR 是可重复读&#xff0c;在一个事务中&…

Django 配置静态文件

1&#xff0c;DebugTrue 调试模式 Test/Test/settings.py DEBUG True...STATICFILES_DIRS [os.path.join(BASE_DIR, static),] STATIC_URL /static/ 1.1 创建静态文件 Test/static/6/images/Sni1.png 1.2 添加视图函数 Test/app6/views.py from django.shortcuts impor…

uniapp,uni-fab组件拖动属性,替代方案

文章目录 1. 背景2. 替代方案2.1 方案一2.2 方案二 参考 1. 背景 最近基于uniapp开发一款设备参数调试的APP软件&#xff0c;其中有使用到悬浮按钮&#xff0c;快速开发阶段&#xff0c;为了能尽快上线&#xff0c;直接使用了uni-ui的扩展组件uni-fab&#xff0c;参考【1】&am…

Configure C/C++ debugging

Configure C/C debugging launch.json 文件用于在 Visual Studio Code 中配置调试器。 Visual Studio Code 会生成一个 launch.json (位于项目的 .vscode 文件夹下),其中几乎包含了所有必需的信息。要开始调试,您需要填写 program 字段,指定要调试的可执行文件的路径。这必须…

【从零开始学架构 架构基础】四 架构设计的复杂度来源:可扩展性复杂度来源

架构设计的复杂度来源其实就是架构设计要解决的问题&#xff0c;主要有如下几个&#xff1a;高性能、高可用、可扩展、低成本、安全、规模。复杂度的关键&#xff0c;就是新旧技术之间不是完全的替代关系&#xff0c;有交叉&#xff0c;有各自的特点&#xff0c;所以才需要具体…

新书速览|Linux C与C++一线开发实践

《Linux C与C一线开发实践》 本书内容 Linux C/C编程在Linux应用程序开发中占有重要的地位&#xff0c;掌握这项技术将在就业竞争中立于不败之地。《Linux C与C一线开发实践》内容针对初中级读者&#xff0c;贴近软件公司一线开发实践。全书厚达620多页&#xff0c;知识点丰富…

51单片机第6步_stdlib.h库函数

本章重点学习stdlib.h库函数。 #include <REG51.h> //包含头文件REG51.h,使能51内部寄存器; #include <stdlib.h> //float atof (char *s1); //参数s1字符串可包含正负号,小数点或E(e)来表示指数部分,如123.456或123e-2; //若首字符是非数据字符,或为正负号…

[NSSCTF]-Reverse:[SWPUCTF 2021 新生赛]easyapp(安卓逆向,异或)

无壳 把后缀名改为zip&#xff0c;找到apk 查看jadx 这里调用了MainActivity的lambda$onCreate$0$MainActivity&#xff0c;然后又调用了Encoder进行异或。 exp&#xff1a; result棿棢棢棲棥棷棊棐棁棚棨棨棵棢棌 key987654321 flag for i in range(len(result)):flagchr(…

HarmonyOS开发:应用完整性校验

简介 为了确保应用的完整性和来源可靠&#xff0c;OpenHarmony需要对应用进行签名和验签。 应用开发阶段&#xff1a; 开发者完成开发并生成安装包后&#xff0c;需要开发者对安装包进行签名&#xff0c;以证明安装包发布到设备的过程中没有被篡改。OpenHarmony的应用完整性校…

关于响应式编程的理解与SpringCloudGateway的理解

关于响应式编程的理解与SpringCloudGateway的理解 一. 响应式编程与函数式编程的区别二. 响应式编程中常用的组件2.1 RxJava定义2.2 Rxjava基本概念2.3 RxJava 用法 三 SpringcloudGateway四 常见的四种限流规则 一. 响应式编程与函数式编程的区别 总的来说&#xff0c;响应式编…