iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
Mobile Development

Spring Boot+Android 30天 實戰開發 系列 第 14

【Day - 14】Spring Boot 整合Spring Data JPA:輕鬆處理資料庫操作 (下)

  • 分享至 

  • xImage
  •  

6. 自訂查詢方法

Spring Data JPA 提供了方法命名約定來根據方法名自動生成查詢,但有時候我們需要執行更複雜的查詢,這時就需要自訂查詢方法。本節將介紹如何在 Spring Data JPA Repository 中定義自訂查詢方法。

6.1 方法命名約定

在 Spring Data JPA 中,方法命名約定是一種快速建立查詢方法的方式。例如,如果要根據姓氏和名字查詢 Employee 記錄,可以按照以下方式命名方法:

List<Employee> findByLastNameAndFirstName(String lastName, String firstName);

Spring Data JPA 將根據方法名自動生成 SQL 查詢,查詢姓氏和名字同時匹配的 Employee 記錄。

除了使用 And 連接多個條件,還可以使用 OrBetweenGreaterThan 等關鍵詞來建立方法名。這樣可以快速生成各種複雜的查詢方法。

6.2 使用 @Query 註解

除了方法命名約定,Spring Data JPA 還允許使用@Query註解來定義自訂 JPQL(Java Persistence Query Language) 或 SQL 查詢。

@Query("SELECT e FROM Employee e WHERE e.lastName = :lastName")
List<Employee> findCustomByLastName(@Param("lastName") String lastName);

上述程式碼使用 @Query 註解定義了一個自訂查詢,查詢姓氏為指定值的 Employee 記錄。@Param 註解用於指定參數名稱。

6.3 Native SQL 查詢

如果需要執行原生 SQL 查詢,可以使用 nativeQuery 屬性將查詢指定為原生 SQL。

@Query(value = "SELECT * FROM employees WHERE last_name = :lastName", nativeQuery = true)
List<Employee> findCustomByLastName(@Param("lastName") String lastName);

上述程式碼中,nativeQuery = true表示這是一個原生 SQL 查詢。

6.4 方法名與@Query混合使用

有時候,我們需要將方法名約定和@Query註釋混合使用以滿足更複雜的查詢需求。

@Query("SELECT e FROM Employee e WHERE e.lastName = :lastName AND e.age >= :minAge")
List<Employee> findCustomByLastNameAndMinAge(@Param("lastName") String lastName, @Param("minAge") int minAge);

上述程式碼中,我們同時使用了方法名約定和 @Query 註釋來創建查詢方法,查詢姓氏為指定值且年齡大於等於指定值的 Employee 記錄。

通過自定義查詢方法,你可以靈活地執行各種查詢操作,無論是簡單的條件查詢還是複雜的連接查詢。

6.5 使用命名化查詢

命名化查詢是一種將查詢語句定義在 XML 文件或屬性文件中的方式,然後在 Repository 接口中通過方法名引用這些查詢。這使得查詢語句與程式碼分離,方便維護和管理。

首先,在resources目錄下創建一個命名化查詢的 XML 文件,例如EmployeeQueries.xml

<?xml version="1.0" encoding="UTF-8"?>
<queries>
    <query name="findCustomByLastNameAndMinAge">
        <![CDATA[
        SELECT e FROM Employee e WHERE e.lastName = :lastName AND e.age >= :minAge
        ]]>
    </query>
</queries>

接下來,在 Repository 接口中使用@Query註釋引用這個命名化查詢:

@Query(name = "findCustomByLastNameAndMinAge")
List<Employee> findCustomByLastNameAndMinAge(@Param("lastName") String lastName, @Param("minAge") int minAge);

上述程式碼中,name屬性指定了要使用的命名化查詢的名稱。

通過命名化查詢,你可以將複雜的查詢語句獨立出來,提高了程式碼的可維護性和可讀性。

6.6 小結

自定義查詢方法是 Spring Data JPA 強大的功能之一,它允許你根據需求創建各種靈活的查詢。你可以使用方法命名約定、@Query註釋、原生 SQL 查詢、命名化查詢等多種方式來定義自定義查詢方法。這些方法讓你可以輕鬆地執行複雜的資料庫查詢操作,與 Spring Data JPA 的其他功能結合使用,可以大幅提高資料存取層的開發效率。

7. 數據關聯與映射

在實際應用程式中,數據之間的關係通常比單個實體更複雜。Spring Data JPA 提供了豐富的功能來管理實體之間的關聯關係,包括一對一、一對多、多對一和多對多。本節將介紹如何在實體類中定義關聯關係以及如何使用 Spring Data JPA 註解來映射這些關係。

7.1 什麼是關聯映射?

關聯映射指的是實體類之間的關係如何映射到資料庫表之間的關係。常見的資料庫關聯包括一對一、一對多、多對一和多對多關聯。

在 Spring Data JPA 中,我們使用 JPA 註解來定義實體類之間的關聯關係,然後 JPA 將自動處理這些關聯的映射。

7.2 示範一對一關聯

一對一關聯映射是指兩個實體類之間存在唯一的關聯,例如,一個人只能有一個護照號碼,而一個護照號碼也只能對應一個人。下面是一個示例,展示如何在 Spring Data JPA 中實現一對一關聯。

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToOne(mappedBy = "person", cascade = CascadeType.ALL)
    private Passport passport;

    // 省略其他屬性和方法
}
@Entity
public class Passport {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String number;

    @OneToOne
    @JoinColumn(name = "person_id")
    private Person person;

    // 省略其他屬性和方法
}

上述示例中,Person 實體類和 Passport 實體類之間建立了一對一關聯。Person 類中的 passport 屬性使用 @OneToOne 註解來定義關聯,並使用 mappedBy 屬性指定關聯關係由 Passport 類的 person 屬性來維護。這樣,當保存或刪除 Person 實例時,相應的 Passport 實例也會被保存或刪除。

7.3 示範一對多關聯

讓我們以一對多關聯關係為例,假設我們有兩個實體類:Author 作者和 Book 書籍。一個作者可以寫多本書,而一本書只有一個作者。以下是示例程式碼:

@Entity
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "author")
    private List<Book> books;

    // 省略其他屬性和方法
}
@Entity
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;

    @ManyToOne
    @JoinColumn(name = "author_id")
    private Author author;

    // 省略其他屬性和方法
}

在上述程式碼中,Author 實體類使用 @OneToMany 註解來定義了一對多關聯關係,mappedBy 屬性指定了在 Author 實體中與之關聯的屬性是 books。而 Book 實體類使用 @ManyToOne 註解來定義多對一關聯關係,並通過 @JoinColumn 註解指定了外鍵列的名稱。

這個關係描述了一個作者可以寫多本書,而一本書也只能有一個作者。

7.4 示範多對多關聯

讓我們再看一個多對多的關聯關係的示例,假設我們有兩個實體類:Student 學生和 Course 課程。一個學生可以選修多門課程,一門課程也可以被多個學生選修。以下是示例程式碼:

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @ManyToMany
    @JoinTable(
        name = "student_course",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id")
    )
    private List<Course> courses;

    // 省略其他屬性和方法
}
@Entity
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;

    @ManyToMany(mappedBy = "courses")
    private List<Student> students;

    // 省略其他屬性和方法
}

在上述程式碼中,Student 實體類和 Course 實體類都使用 @ManyToMany 註解來定義了多對多關聯關係。通過 @JoinTable 註解,我們定義了一個名為 student_course 的中間表來維護這個關係。joinColumns 屬性指定了學生表的外鍵列,inverseJoinColumns 屬性指定了課程表的外鍵列。

這個關係描述了一個學生可以選修多門課程,而一門課程也可以被多個學生選修。

8. 總結

本文深入探討了 Spring Boot 整合 Spring Data JPA 的方法,使您能夠更輕鬆地處理資料庫操作。以下是我們在本文中學到的重要知識點:

  • Spring Data JPA 是 Spring Framework 的一部分,用於簡化資料庫存取層的開發。
  • Spring Data JPA 提供了豐富的注解和功能,使資料庫操作更容易。
  • 使用 Spring Data JPA 可以大大減少樣板程式碼,提高生產力。
  • Spring Data JPA 支援多種資料庫,讓您能夠在不同的項目中輕鬆切換資料庫。
  • Spring Boot 項目可以輕鬆整合 Spring Data JPA,只需添加相關的依賴和配置即可。
  • 實體類可以使用 JPA 注解來映射資料庫表格,並定義與其他實體類的關聯。
  • Spring Data JPA Repository 提供了簡便的方法來執行基本的 CRUD 操作。
  • 您可以使用方法命名約定來定義自定義查詢方法,也可以使用@Query注解定義自定義 JPQL 或 SQL 查詢。
  • 數據關聯在實體類中的定義和映射可以幫助您處理複雜的資料模型。

總之,Spring Data JPA 是一個強大的工具,可用於簡化和加速資料庫操作,並幫助您構建更強大的應用程式。我們鼓勵您深入學習和實踐這一技術,以提高應用程式的效率和可維護性,同時保持資料庫操作的一致性和準確性。希望本文能為您在 Spring Boot 項目中使用 Spring Data JPA 提供了有價值的指南和示例。


上一篇
【Day - 13】Spring Boot 整合Spring Data JPA:輕鬆處理資料庫操作 (上)
下一篇
【Day - 15】Spring Boot 集成郵件發送:spring-boot-starter-mail
系列文
Spring Boot+Android 30天 實戰開發 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言