【Spring Boot】认识 JPA 的接口

news2024/11/25 4:07:47

认识 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.coloradmin.cn/o/1879397.html

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

相关文章

电路笔记(电源模块): 基于FT2232HL实现的jtag下载器硬件+jtag的通信引脚说明

JTAG接口说明 JTAG 接口根据需求可以选择20针或14针的配置&#xff0c;具体选择取决于应用场景和需要连接的功能。比如之前的可编程逻辑器件XC9572XL使用JTAG引脚&#xff08;TCK、TDI、TDO、TMS、VREF、GND&#xff09;用于与器件进行调试和编程通信。更详细的内容可以阅读11…

(超详细)数据结构——“栈”的深度解析

前言&#xff1a; 在前几章我们介绍了线性表的基本概念&#xff0c;也讲解了包括顺序表&#xff0c;单链表&#xff0c;双向链表等线性表&#xff0c;相信大家已经对线性表比较熟悉了&#xff0c;今天我们要实现线性表的另一种结构——栈。 1.栈的概念 栈&#xff1a;一种特殊…

AI是如何与快充技术结合的?

针对AI技术在快充领域的运用&#xff0c;我们可以进一步深入探讨AI如何与快充技术结合&#xff0c;提升充电效率和用户体验。以下是一些具体的AI技术在快充领域的应用场景&#xff1a; 一、智能充电算法 学习充电模式&#xff1a;AI算法可以学习用户的充电习惯&#xff0c;比…

批量文件名修改软件:一键解决同一编码多型号文件分类与命名难题,高效管理文件

在数字化时代&#xff0c;图片文件已经成为我们工作中不可或缺的一部分。然而&#xff0c;当面对成百上千个同一编码下不同型号的图片文件时&#xff0c;如何快速、准确地进行分类和命名&#xff0c;成为了许多职场人士头疼的问题。现在&#xff0c;我们为您带来了一款神奇的批…

智能环境监测与数据分析系统

项目名称&#xff1a;智能环境监测与数据分析系统 一、引言 随着科技的发展和人们环保意识的增强&#xff0c;对环境监测的需求日益增加。传统的环境监测手段往往存在数据收集不及时、数据分析不准确等问题。因此&#xff0c;设计一个智能环境监测与数据分析系统具有重要的现…

如何在 SQL 中删除一条记录?

如何在 SQL 中删除一条记录&#xff1f; 在 SQL 中&#xff0c;您可以使用DELETE查询和WHERE子句删除表中的一条记录。在本文中&#xff0c;我将向您介绍如何使用DELETE查询和WHERE子句删除记录。我还将向您展示如何一次从表中删除多条记录 如何在 SQL 中使用 DELETE 这是使…

GMSB文章八:微生物中介分析

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 中介分析&#xff08;Mediation Analysis&#xff09;是一种统计方法&#xff0c;用于研究一…

Linux基础篇——目录结构

基本介绍 Linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录"/"&#xff0c;然后在根目录下再创建其他的目录 在Linux中&#xff0c;有一句经典的话&#xff1a;在Linux世界里&#xff0c;一切皆文件 Linux中根目录下的目录 具体的…

新能源行业知识体系-------主目录-----持续更新

本文相当于目录方便快速检索内容&#xff0c;没有实际内容&#xff0c;只做索引 文章目录 一、电力市场概论二、蒙西电网需求侧响应三、蒙西电网市场结算V2.0 一、电力市场概论 是学习清华大学电力市场概论(2024年春)的学习笔记&#xff0c;详细了解电力市场是如何利用经济学知…

远程桌面无法复制粘贴文件到本地怎么办?

远程桌面不能复制粘贴问题 Windows远程桌面为我们提供了随时随地访问文件和数据的便捷途径&#xff0c;大大提升了工作和生活的效率。然而&#xff0c;在使用过程中&#xff0c;我们也可能遇到一些问题。例如&#xff0c;在通过远程桌面传输文件时&#xff0c;常常会出现无法复…

Day7:.翻转字符串里的单词 151 卡码网:55.右旋转字符串

题目 151. 反转字符串中的单词 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:// 移除多余空格void moveSpace(string& s) {// 定义快慢指针int slow 0;int fast 0;// 删除前导空格while (s.size() > 0 && fast < s.size() &&…

第2章-Python编程基础

#本章目标 1&#xff0c;了解什么是计算机程序 2&#xff0c;了解什么是编程语言 3&#xff0c;了解编程语言的分类 4&#xff0c;了解静态语言与脚本语言的区别 5&#xff0c;掌握IPO程序编写方法 6&#xff0c;熟练应用输出函数print与输入函数input 7&#xff0c;掌握Python…

204.贪心算法:分发饼干(力扣)

以下来源于代码随想录 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {// 对孩子的胃口进行排序sort(g.begin(), g.end());// 对饼干的尺寸进行排序sort(s.begin(), s.end());int index s.size() - 1; // 从最大的饼…

MySQL之索引失效的情况

什么情况下索引会失效&#xff1f; 违反最左前缀原则范围查询右边的列不能使用索引不要在索引列上进行运算操作字符串不加单引号导致索引失效以%开头的like模糊查询 什么情况下索引会失效&#xff1f; 示例&#xff0c;有user表如下 CREATE TABLE user (id bigint(20) NOT NU…

大语言模型(LLMs)全面学习指南,初学者入门,一看就懂!

大语言模型&#xff08;LLMs&#xff09;作为人工智能&#xff08;AI&#xff09;领域的一项突破性发展&#xff0c;已经改变了自然语言处理&#xff08;NLP&#xff09;和机器学习&#xff08;ML&#xff09;应用的面貌。这些模型&#xff0c;包括OpenAI的GPT-4o和Google的gem…

docker安装sqlserver2019

1、背景 由于要学习flink cdc&#xff0c;并且数据源是sqlserver&#xff0c;所以这里采用docker安装sqlserver。 2、安装步骤 &#xff08;1&#xff09;建目录 // 创建指定的目录 mkdir sqlserver// 进入该目录 cd sqlserver// 创建/data/mssql目录 mkdir -p /data/mssql…

电子电路学习笔记(3)三极管

部分内容参考链接&#xff1a; 电子电路学习笔记&#xff08;5&#xff09;——三极管_三极管 箭头-CSDN博客 模拟电子技术基础笔记&#xff08;4&#xff09;——晶体三极管_集电结的单向导电性-CSDN博客 硬件基本功-36-三极管Ib电流如何控制Ic电流_哔哩哔哩_bilibili 部分…

力扣最新详解5道题:两数之和三数之和四数之和

目录 一、查找总价格为目标值的两个商品 题目 题解 方法一&#xff1a;暴力枚举 方法二&#xff1a;对撞指针 二、两数之和 题目 题解 方法一&#xff1a;暴力枚举 方法二&#xff1a;哈希表法 三、三数之和 题目 题解 方法一&#xff1a;排序暴力枚举set去重 …

【JVM基础篇】垃圾回收

文章目录 垃圾回收常见内存管理方式手动回收&#xff1a;C内存管理自动回收(GC)&#xff1a;Java内存管理自动、手动回收优缺点 应用场景垃圾回收器需要对哪些部分内存进行回收&#xff1f;不需要垃圾回收器回收需要垃圾回收器回收 方法区的回收代码测试手动调用垃圾回收方法Sy…

二叉树第二期:堆的实现与应用

若对树与二叉树的相关概念&#xff0c;不太熟悉的同学&#xff0c;可移置上一期博客 链接&#xff1a;二叉树第一期&#xff1a;树与二叉树的概念-CSDN博客 本博客目标&#xff1a;对二叉树的顺序结构&#xff0c;进行深入且具体的讲解&#xff0c;同时学习二叉树顺序结构的应用…