【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.pswp.cn/diannao/38147.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38147.shtml
英文地址,請注明出處:http://en.pswp.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…

橫穿自動駕駛

如果有一條線&#xff0c;可以穿起來所有自動駕駛的核心模塊&#xff0c;那么我感覺它就是最優化&#xff0c;選擇優化變量、構造優化問題、求解優化問題&#xff0c;這幾個步驟貫穿了自動駕駛的始終。 先從我的自身接觸順序寫起。最開始做個一點深度學習&#xff0c;那還是20…

編碼大模型系列:Meta創新的“代碼編譯優化”的LLM

魯班號導讀正式上線。移步“魯班秘笈”&#xff0c;查閱更多內容。 大型語言模型 (LLM) 已在各種軟件工程和編碼任務中展現出卓越的能力。然而&#xff0c;它們在代碼和編譯器優化領域的應用仍未得到充分探索。訓練LLM需要大量資源&#xff0c;需要大量的 GPU時間和大量的數據…

23、架構-服務網格之透明通信涅槃

通信成本 在現代分布式系統中&#xff0c;服務之間的通信是不可避免的。然而&#xff0c;這種通信帶來了額外的復雜性和成本。傳統的通信方式如RPC&#xff08;Remote Procedure Call&#xff09;和REST&#xff08;Representational State Transfer&#xff09;&#xff0c;雖…

Hive 實操案例五:統計每個類別中 Top10 的視頻熱度

一、數據表結構 視頻表 t_video 字段注釋描述videoId視頻唯一 id&#xff08;String&#xff09;11 位字符串uploader視頻上傳者&#xff08;String&#xff09;上傳視頻的用戶名 Stringage視頻年齡&#xff08;int&#xff09;視頻在平臺上的整數天category視頻類別&#xff0…

一個合理的前端應用文件結構

在大型應用中&#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 …

MySQL入門學習-MySQL日志.錯誤日志

錯誤日志是 MySQL 中一種記錄服務器運行過程中錯誤信息的日志文件。它可以幫助管理員或開發人員快速定位和解決問題。 一、MySQL 中的錯誤日志具有以下特點&#xff1a; - 記錄錯誤信息&#xff1a; 錯誤日志主要記錄服務器在運行過程中發生的錯誤信息&#xff0c;包括但不限…

【算法 之選擇排序 原理及案例】

選擇排序&#xff08;Selection Sort&#xff09; 是一種簡單直觀的排序算法。它的工作原理是&#xff1a;首先在未排序序列中找到最小&#xff08;或最大&#xff09;元素&#xff0c;存放到排序序列的起始位置&#xff0c;然后&#xff0c;再從剩余未排序元素中繼續尋找最小…

Memcached的API使用指南:常用操作與示例代碼

Memcached 是一個高性能、分布式內存對象緩存系統&#xff0c;常用于加速動態Web應用程序&#xff0c;減輕數據庫負載。本文將介紹如何使用Memcached的API進行常用操作&#xff0c;并提供示例代碼。 1. 安裝Memcached客戶端庫 在使用Memcached之前&#xff0c;需要安裝相應的…

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…

Spring MVC數據綁定和響應——復雜數據綁定(四)JSON數據綁定

一、消息轉換器—HttpMessageConverter接口 客戶端不同的請求&#xff0c;HttpServletRequest中數據的MediaType可能會不同&#xff0c;如果想將HttpServletRequest中的數據轉換成指定對象&#xff0c;或者將對象轉換成指定格式的數據&#xff0c;就需要使用對應的消息轉換器來…

服務器硬件以及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…