Spring Data是一個開源框架,旨在簡化資料庫訪問,並且支持雲端服務,由Spring提供。它是一個繖形項目,包含了大量關係型資料庫及非關係型資料庫的資料存取解決方案,其設計目的是使我們可以快速且簡單地使用各種資料存取技術。 Spring Boot預設採用整合Spring Data的方式統一處理資料存取層,透過新增大量自動配置,引入各種資料存取範本xxxTemplate以及統一的Repository接口,從而達到簡化資料存取層的操作。
Spring Data提供了多種類型資料庫支持,Spring Boot對Spring Data支援的資料庫進行了整合管理,提供了各種依賴啟動器。可以透過一張表格列出Spring Boot常用的資料庫依賴啟動器。
名稱 | #描述 |
mybatis-spring -boot-starter | MyBatis啟動器 |
mybatis-plus-boot-starter | MyBatis-Plus啟動器 |
#spring-boot-starter-data-jpa | Spring Data JPA與Hibernate的啟動器 |
spring- boot starter-data-redis | Redis鍵值資料儲存與Spring Data Redis和Jedis客戶端的啟動器 |
spring-boot-starter-data-neo4j | #Neo4j圖資料庫和Spring Data Neo4j的啟動器 |
spring-boot-starter-data-mongodb | MongoDB和Spring Data MongoDB的啟動器 |
JPA(Java Persistence API,Java持久化API )是Sun公司官方提出的Java持久化規範,它為Java開發人員提供了一種物件/關係映射的工具管理Java中的關係型數據,其主要目的是簡化現有的持久化開發工作和整合ORM(Object Relational Mapping,物件/關係映射)技術。 Spring Data在JPA規範的基礎上,充分利用其優點,提出了Spring Data JPA模組對具有ORM關係資料進行持久化操作。
Spring Data JPA是Spring在ORM框架、JPA規範的基礎上封裝的一套JPA應用框架,提供了增刪改查等常用功能,使開發者可以用較少的程式碼實現資料操作,同時也易於擴充。在介紹Spring Boot整合JPA之前,先針對Spring Data JPA的基本使用進行簡單介紹。
Spring Data JPA框架是針對具有ORM關係的資料進行操作,所以在使用Spring Data JPA時,首先需要編寫一個實體類別與資料表進行映射,並且配置好映射關係。
@Entity(name = "t_comment") // 设置ORM实体类,并指定映射的表名 public class Discuss { @Id // 表明映射对应的主键id @GeneratedValue(strategy = GenerationType.IDENTITY) // 设置主键自增策略 @Column(name = "article_id") // 指定映射的表字段名 private Integer articleId; // Generate: Getter and Setter、toString() }
針對上述程式碼,壹哥把用到的註解給大家簡單說明。
使用註解@Entity來表示要將實體類別對應到資料庫,此時資料庫表的名稱預設為類別名稱的首字母小寫形式。當然,也可以使用name屬性指定映射的表名。
@ld:標註在類別屬性或getter方法上,表示某一個屬性對應表中的主鍵。
@GeneratedValue註解可以省略,它標註在與@ld註解相同位置,用於定義屬性對應的主鍵產生策略。 Spring Data JPA支援的主鍵產生策略包括有TABLE(使用一個特定的資料庫表格來保存主鍵)、SEQUENCE(不支援主鍵自成長的資料庫主鍵產生策略)、IDENTITY(主鍵自增)和AUTO(JPA自主選擇前面3種合適的策略,是預設選項)。
在類別屬性與表格欄位名稱不同時,@Column註解可與name屬性搭配使用,表示類別屬性對應的表格欄位名稱。
針對不同的表資料操作編寫各自對應的Repository接口,並根據需要編寫對應的資料操作方法。
public interface DiscussRepository extends JpaRepository<Discuss, Integer> { // 1.查询author非空的Discuss评论集合(JPA支持的方法名关键字查询方式) List<Discuss> findByAuthorNotNull(); // 2.根据文章id分页查询Discuss评论集合 @Query("SELECT c FROM t_comment c WHERE c.articleId = ?1") List<Discuss> getDiscussPaged(Integer articleid, Pageable pageable); // 3.使用元素SQL语句,根据文章id分页查询Discuss评论集合,nativeQuery为true表示用来编写原生SQL语句 @Query(value = "SELECT * FROM t_comment WHERE article_Id = ?1", nativeQuery = true) List<Discuss> getDiscussPaged2(Integer articleid, Pageable pageable); //4.根据评论id修改评论作者author @Transactional // 表示支持事务管理 @Modifying // 表示支持数据变更 @Query("UPDATE t_comment c SET c.author = ?1 WHERE c.id = ?2") Integer updateDiscuss(String author, Integer id); // 5.根据评论id删除评论 @Transactional @Modifying @Query("DELETE t_comment c WHERE c.id = ?1") Integer deleteDiscuss(Integer id); }
針對Repository介面編寫時的特殊要求,壹哥跟大家解釋一下。
我們在使用Spring Data JPA自訂Repository介面時,必須繼承XXRepository<T, ID>
介面,其中的T代表要操作的實體類,ID代表實體類主鍵資料類型。在上述範例中,選擇繼承了JpaRepository接口,JpaRepository的繼承結構如下圖所示。
下面對JpaRepository介面繼承結構中涉及的介面進行說明,具體如下。
(1) Repository是Spring Data JPA提供的用於自訂Repository介面的頂級父接口,該接口中沒有聲明任何方法。
(2) CrudRepository介面是Repository的繼承介面之一,包含了一些基本的CRUD方法。
(3) PagingAndSortingRepository介面繼承CrudRepository介面的同時,提供了分頁和排序兩個方法。
(4) QueryByExampleExecutor介面是進行條件封裝查詢的頂級父接口,允許透過Example實例執行複雜條件查詢。
JpaRepository介面同時繼承了PagingAndSortingRepository介面和QueryByExampleExecutor接口,並額外提供了一些資料操作方法。通常在編寫自訂Repository介面檔時,我們會直接選擇繼承JpaRepository介面。
在使用Spring Data JPA進行資料操作時,可以有多種實作方式,主要方式如下。
(1).如果自訂介面繼承了JpaRepository接口,則預設包含了一些常用的CRUD方法。
(2).自訂Repository介面中,可以使用@Query註解配合SQL語句進行資料的查、改、刪操作。
(3).自訂Repository介面中,可以直接使用方法名稱關鍵字進行查詢操作。
其中,Spring Data JPA中支援的方法名稱關鍵字及對應的SQL片段說明,如下表所示。
在自訂的Repository介面中,針對資料的變更操作(修改、刪除),無論是否使用了@Query註解,都必須在方法上方新增@Transactional註解進行事務管理,否則程式執行就會出現InvalidDataAccessApiUsageException異常。如果在呼叫Repository介面方法的業務層Service類別上已經新增了@Transactional註解進行事務管理,那麼Repository介面檔案中就可以省略@Transactional註解。
在自訂的Repository介面中,使用@Query註解方式執行資料變更操作(修改、刪除),除了要使用@Query註解,還必須新增@Moditying註解表示資料變更。
JPA也支援使用Example實例進行複雜條件查詢。例如,針對JpaRepository介面中已存在的findAll(Example<S> var1)
方法進行查詢。
使用Spring Boot整合JPA,具體步驟如下。
在專案的pom.xml檔案中加入Spring Data JPA依賴啟動器。
注意:
我們並沒有寫Spring Data JPA對應的版本號,這是因為Spring Boot對Spring Data JPA的版本號進行了統一管理。
為了方便操作,以先前建立的資料庫表t_comment為例編寫對應的實體類,將先前建立的Comment類複製一份並重新命名為Discuss,同時加入JPA對應的註解進行映射配置。
在com.cy.repository套件下建立一個用於對資料庫表t_comment進行操作的Repository介面DiscussRepository。
將Chapter03ApplcationTests測試類別在目前位置複製一份並重新命名為JpaTests,用來編寫JPA相關的單元測試,並對內容稍微修改後編寫DiscussRepository介面對應的測試方法。
測試方法中分別使用了JpaRepository預設方法、方法名稱關鍵字、@Query註解和Example封裝參數的形式進行了資料運算。
選擇JpaTests測試類別中單元測試方法進行效果的示範。
以上是SpringBoot怎麼整合JPA框架的詳細內容。更多資訊請關注PHP中文網其他相關文章!