首頁 >Java >java教程 >SpringBoot怎麼整合JPA框架

SpringBoot怎麼整合JPA框架

王林
王林轉載
2023-05-19 09:52:501904瀏覽

    一. Spring Boot資料存取概述

    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的啟動器
    #

    二. Spring Data JPA簡介

    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的基本使用進行簡單介紹。

    2.1 編寫ORM實體類別

    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屬性搭配使用,表示類別屬性對應的表格欄位名稱。

    2.2 編寫Repository接口

    針對不同的表資料操作編寫各自對應的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介面編寫時的特殊要求,壹哥跟大家解釋一下。

    2.2.1 繼承XXRepositoryffbe4eed12645b467bc428156552ef14介面

    我們在使用Spring Data JPA自訂Repository介面時,必須繼承XXRepositoryffbe4eed12645b467bc428156552ef14介面,其中的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介面。

    2.2.2 操作資料的多種方式

    在使用Spring Data JPA進行資料操作時,可以有多種實作方式,主要方式如下。

    (1).如果自訂介面繼承了JpaRepository接口,則預設包含了一些常用的CRUD方法。

    (2).自訂Repository介面中,可以使用@Query註解配合SQL語句進行資料的查、改、刪操作。

    (3).自訂Repository介面中,可以直接使用方法名稱關鍵字進行查詢操作。

    其中,Spring Data JPA中支援的方法名稱關鍵字及對應的SQL片段說明,如下表所示。

    2.2.3 @Transactional事務管理

    在自訂的Repository介面中,針對資料的變更操作(修改、刪除),無論是否使用了@Query註解,都必須在方法上方新增@Transactional註解進行事務管理,否則程式執行就會出現InvalidDataAccessApiUsageException異常。如果在呼叫Repository介面方法的業務層Service類別上已經新增了@Transactional註解進行事務管理,那麼Repository介面檔案中就可以省略@Transactional註解。

    2.2.4 @Moditying註解

    在自訂的Repository介面中,使用@Query註解方式執行資料變更操作(修改、刪除),除了要使用@Query註解,還必須新增@Moditying註解表示資料變更。

    2.3.5 複雜條件查詢

    JPA也支援使用Example實例進行複雜條件查詢。例如,針對JpaRepository介面中已存在的findAll(Example1eefd63bbe027a2807ccada294a3372c var1)方法進行查詢。

    三. 使用Spring Boot整合JPA

    使用Spring Boot整合JPA,具體步驟如下。

    3.1 新增Spring Data JPA依賴啟動器

    在專案的pom.xml檔案中加入Spring Data JPA依賴啟動器。

    注意:

    我們並沒有寫Spring Data JPA對應的版本號,這是因為Spring Boot對Spring Data JPA的版本號進行了統一管理。

    3.2 編寫ORM實體類

    為了方便操作,以先前建立的資料庫表t_comment為例編寫對應的實體類,將先前建立的Comment類複製一份並重新命名為Discuss,同時加入JPA對應的註解進行映射配置。

    3.3 編寫Repository介面

    在com.cy.repository套件下建立一個用於對資料庫表t_comment進行操作的Repository介面DiscussRepository。

    3.4 寫單元測試進行介面方法測試

    將Chapter03ApplcationTests測試類別在目前位置複製一份並重新命名為JpaTests,用來編寫JPA相關的單元測試,並對內容稍微修改後編寫DiscussRepository介面對應的測試方法。

    測試方法中分別使用了JpaRepository預設方法、方法名稱關鍵字、@Query註解和Example封裝參數的形式進行了資料運算。

    3.5 整合測試

    選擇JpaTests測試類別中單元測試方法進行效果的示範。

    以上是SpringBoot怎麼整合JPA框架的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除