1. 概述
2. 快速入門
3. 分頁操作
4. 基于方法名查詢
5. 基于注解查詢
666. 彩蛋
本文,我們基于 Spring Boot 2.X 版本。
我們,咱們來學習下 Spring Data JPA 。
相信不少胖友之前有了解過 JPA、Hibernate ,那麼 JPA、Hibernate、Spring Data JPA 這三者是什麼關系呢?我們來一起理一理。
JPA ,全稱 Java Persistence API ,是由 Java 定義的 Java ORM 以及實體操作 API 的标準。正如最早學習 JDBC 規範,Java 自身并未提供相關的實作,而是 MySQL 提供 MySQL mysql-connector-java 驅動,Oracle 提供 oracle-jdbc 驅動。而實作 JPA 規範的有:
Hibernate ORM
Oracle TopLink
Apache OpenJPA
Spring Data JPA ,是 Spring Data 提供的一套簡化的 JPA 開發的架構。
内置 CRUD、分頁、排序等功能的操作。
根據約定好的方法名規則,自動生成對應的查詢操作。
使用 @Query 注解,自定義 SQL 。
是以,絕大多數情況下,我們無需編寫代碼,直接調用 JPA 的 API 。也是以,在我們使用的 Spring Data JPA 的項目中,如果想要替換底層使用的 JPA 實作架構,在未使用到相關 JPA 實作架構的特殊特性的情況下,可以透明替換。
關于這一點,我們在 《芋道 Spring Boot Redis 入門》 中,已經看到 Spring Data Redis 也是已經看到這樣的好處。
總的來說,就是如下一張圖:
FROM 《spring data jpa hibernate jpa 三者之間的關系》![]()
芋道 Spring Boot JPA 入門(一)之快速入門
當然,絕大多數情況下,我們使用的 JPA 實作架構是 Hibernate ORM 。是以整個調用過程是:
示例代碼對應倉庫:lab-13-jpa 。
本小節,我們會使用 spring-boot-starter-data-jpa 自動化配置 Spring Data JPA 。同時,示範 Spring Data JPA 的 CRUD 的操作。
在 pom.xml 檔案中,引入相關依賴。
具體每個依賴的作用,胖友自己認真看下艿艿添加的所有注釋噢。
另外,在 spring-boot-starter-data-jpa 中,已經預設引入了 Hibernate 的依賴。
建立 Application.java 類,配置 @SpringBootApplication 注解即可。代碼如下:
在 application.yml 中,添加 JPA 配置,如下:
datasource 配置項,配置 datasource 資料源配置内容。
jpa 配置項,配置 Spring Data JPA 配置内容,對應 `org.springframework.boot.autoconfigure.orm.jpa.JpaProperties.java` 類。
hibernate 配置項,配置 Hibernate 配置内容,對應 org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties.java 類。
create :每次加載 hibernate 時都會删除上一次的生成的表,然後根據你的 model 類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導緻資料庫表資料丢失的一個重要原因。
create-drop :每次加載 hibernate 時根據 model 類生成表,但是 sessionFactory 一關閉,表就自動删除。
update :最常用的屬性,第一次加載 hibernate 時根據 model 類會自動建立起表的結構(前提是先建立好資料庫),以後加載 hibernate 時根據 model 類自動更新表結構,即使表結構改變了但表中的行仍然存在不會删除以前的行。要注意的是當部署到伺服器後,表結構是不會被馬上建立起來的,是要等應用第一次運作起來後才會。
validate :每次加載 hibernate 時,驗證建立資料庫表結構,隻會和資料庫中的表進行比較,不會建立新表,但是會插入新值。
建議,生産環境下,建議配置 none ,不使用 Hibernate Auto DDL 功能。???? 啟動個項目,就自動變更資料庫表結構,多危險啊~
實際項目無需配置 hibernate 配置項,這裡僅僅是示範,讓胖友知道這回事。
ddl-auto 配置項,設定 Hibernate DDL 處理政策。一共有 none、create、create-drop、update、validate 五個選項。
FROM 《jpa 的 hibernate.ddl-auto 的幾個屬性值差別》
在 cn.iocoder.springboot.lab13.jpa.dataobject 包路徑下,建立 UserDO.java 類,使用者 DO 。代碼如下:
關于 JPA 的注解的詳細說明,胖友後面再看看 《Spring Data JPA 中常用的注解詳解》 文章。我們,繼續往下看。
對應的建立表的 SQL 如下:
在 cn.iocoder.springboot.lab13.mybatis.repository 包路徑下,建立 UserRepository01 接口。代碼如下:
繼承 org.springframework.data.repository.CrudRepository 接口,第一個泛型設定對應的實體是 UserDO ,第二個泛型設定對應的主鍵類型是 Integer 。
因為實作了 CrudRepository 接口,Spring Data JPA 會自動生成對應的 CRUD 的代碼。具體 CrudRepository 提供了哪些操作,胖友點選 `CrudRepository.java` 檢視。
建立 UserRepository01Test 測試類,我們來測試一下簡單的 UserRepository01 的每個操作。代碼如下:
具體的,胖友可以自己跑跑,妥妥的。
Spring Data 提供 org.springframework.data.repository.PagingAndSortingRepository 接口,繼承 CrudRepository 接口,在 CRUD 操作的基礎上,額外提供分頁和排序的操作。代碼如下:
在 cn.iocoder.springboot.lab13.mybatis.repository 包路徑下,建立 UserRepository02 接口。代碼如下:
實作 PagingAndSortingRepository 接口,第一個泛型設定對應的實體是 UserDO ,第二個泛型設定對應的主鍵類型是 Integer 。
建立 UserRepository02Test 測試類,我們來測試一下簡單的 UserRepository02 的每個操作。代碼如下: