iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
Mobile Development

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

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

  • 分享至 

  • xImage
  •  

1. 引言

Spring Data JPA 在現代應用程式開發中的關鍵作用不容忽視。它簡化了資料庫訪問層的開發,提供了一個高效且強大的方式來操作資料庫,同時減少了冗長的程式碼。本文旨在介紹 Spring Data JPA 的基礎概念、使用方式以及它如何與 Spring Boot 結合,以提高開發人員的生產力。讓我們開始深入了解 Spring Data JPA 的精髓。

本文主要的內容包括: Spring Data JPA 的基礎概念、主要優勢、在 Spring Boot 專案中的設定、實體類和 Repository 的創建、資料庫基本 CRUD 操作、自定義查詢方法、數據關聯與映射以及總結。

2. Spring Data JPA的基礎

2.1 什麼是Spring Data JPA?

核心概念
Spring Data JPA是Spring框架家族中的一員,專注於簡化數據持久層的開發。它建立在Java Persistence API(JPA)的基礎上,提供了一個高層次的抽象,使開發人員能夠更輕鬆地與資料庫進行交互,而不必處理複雜的 JDBC 程式碼或 SQL 查詢。它的核心概念包括:

  • 實體(Entity):實體表示應用程式中的數據模型,通常對應於資料庫中的表格。每個實體類都應標記為@Entity,並定義其屬性以映射到表格中的列。
  • 儲存庫(Repository):儲存庫是一個介面,它提供了對資料庫的基本操作方法,如新增、刪除、更新和查詢。Spring Data JPA自動為每個實體生成儲存庫,不需要手動實現。
  • 查詢方法(Query Methods):Spring Data JPA允許您通過方法命名約定自動生成查詢,而無需編寫JPQL或SQL查詢語句。

簡化數據訪問
Spring Data JPA的主要目標之一是簡化數據訪問層的開發。它實現了一個基本的CRUD(Create、Read、Update、Delete)模型,使開發人員能夠更輕鬆地執行這些操作。例如,要查詢特定實體的所有記錄,只需在儲存庫接口中定義一個方法,如findAll(),Spring Data JPA會自動生成相應的SQL查詢。

2.2 2.2 Spring Data JPA的主要優勢

Spring Data JPA帶來了許多優勢,使得它成為現代應用程式開發的理想選擇。以下是一些主要優勢:

  • 減少樣板程式碼
    傳統的數據訪問層常常需要大量的樣板程式碼,如連接資料庫、處理事務、解析結果集等。使用Spring Data JPA,許多這些工作都由框架自動處理,從而減少了冗長的程式碼。
  • 提高生產力
    由於Spring Data JPA自動生成基本的CRUD操作,開發人員能夠專注於業務邏輯的實現,而不必花費太多時間在數據訪問層的開發上。這提高了開發效率並加快了產品上市速度。
  • 多資料庫支持
    Spring Data JPA支持多種關聯式資料庫,包括但不限於MySQL、PostgreSQL、Oracle、SQL Server等。這使得應用程式更具靈活性,可以輕鬆切換或兼容不同的資料庫。
  • 關聯映射: 易於定義和管理不同實體類之間的關聯,提供了資料庫結構的靈活性。
  • 開源社區支持
    Spring Data JPA是Spring框架的一部分,擁有強大的開源社區支持。這意味著您可以輕鬆獲取解答、示例程式碼和擴展,並參與社區的討論和貢獻。

3. Spring Boot專案配置

在本節中,我們將示範如何在Spring Boot專案中配置Spring Data JPA,以便開始使用這個強大的框架。

步驟一:添加相依性

添加Spring Data JPA的相關依賴。在pom.xml文件中,確保以下依賴被包含:

<dependencies>
    <!-- 其他相關依賴... -->
    
    <!-- Spring Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- 資料庫驅動依賴(以PostgreSQL資料庫為例) -->
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
    </dependency>
</dependencies>

注意:您可以根據您的資料庫選擇相應的驅動依賴。

步驟二:配置資料庫連接

編輯application.propertiesapplication.yml文件,並配置與您的資料庫相關的屬性,如資料庫URL、使用者名稱和密碼。

# 配置資料庫連接
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=your_name
spring.datasource.password=your_password
spring.datasource.driver-class-name=org.postgresql.Driver

# 配置 Spring Data JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

4. 創建實體類和Repository

在Spring Data JPA中,實體類用於映射資料庫表,而Repository用於執行與資料庫的交互操作。在本節中,我們將示範如何創建這兩個元件。

4.1 創建實體類(Entity)

在使用 Spring Data JPA 進行資料庫操作之前,我們首先需要創建實體類,它將映射到資料庫表。以下是創建實體類的關鍵步驟:

  • 定義類: 創建一個普通的 Java 類來表示資料庫表。這個類可以包含屬性,這些屬性將對應於表中的列。
  • 添加註釋: 使用 JPA 註釋來標識實體類,以告訴 Spring Data JPA 如何映射它到資料庫表。一些常見的註釋包括:
    • @Entity: 標識這個類是一個 JPA 實體。
    • @Table: 指定與實體關聯的資料庫表的名稱。
  • 定義主鍵: 使用 @Id 註釋來指定實體的主鍵屬性。主鍵屬性的值必須是唯一的,它將用於在資料庫中標識每個記錄。
  • 映射屬性: 使用不同的註釋來映射屬性,如 @Column 用於指定屬性與表中列的映射關係。
  • 關聯關係: 如果實體類之間存在關聯關係(例如,一對多或多對多關係),可以使用註釋來定義這些關係。
  • 示範程式碼
    @Entity
    @Table(name = "employees")
    @Data //Lombok註解,詳細介紹在這系列的第8天文章
    public class Employee {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(name = "first_name")
        private String firstName;
    
        @Column(name = "last_name")
        private String lastName;
    

4.2 創建 Spring Data JPA Repository

Spring Data JPA Repository 是用於執行資料庫操作的介面。Spring Data JPA 將自動為我們生成實現這些操作的程式碼,從而減少了重複性工作。

  • 創建介面: 首先,我們需要創建一個介面,該介面將擴展 JpaRepository或其它 Spring Data JPA 提供的介面。這個介面將定義一組方法,這些方法將用於執行各種資料庫操作,如增、刪、改、查。
  • 定義方法: 在介面中定義方法,根據需要添加不同的方法簽名。Spring Data JPA 將根據方法的命名約定自動生成查詢,或者你可以使用@Query註釋定義自訂查詢。
  • 示範程式碼:
    public interface EmployeeRepository extends   JpaRepository<Employee, Long> {
        List<Employee> findByLastName(String lastName);
    }
    

在上面的範例中,EmployeeRepository介面繼承了 JpaRepository,它具有許多已定義的方法,如 save、findByIddelete 等。同時,我們自定義了一個查詢方法 findByLastName,它將根據姓氏查找員工。

現在,我們已經創建了實體類和相應的 Repository 介面,可以使用 Spring Data JPA 執行資料庫操作,如新增、查詢、更新和刪除記錄。在接下來的章節中,我們將詳細介紹如何執行這些操作。

5. 資料庫基本CRUD操作

在 Spring Data JPA 中,執行基本的 CRUD (Create, Read, Update, Delete) 操作非常簡單。Spring Data JPA 為我們提供了 Repository 接口,它包含了許多常用的操作方法,同時我們也可以自定義方法來滿足特定需求。在這一節中,我們將詳細介紹如何執行這些基本操作。

5.1 新增記錄 (Create)

要向資料庫中插入新的記錄,可以使用 Spring Data JPA 提供的 save 方法。以下是示例程式碼:

Employee newEmployee = new Employee();
newEmployee.setFirstName("Ian");
newEmployee.setLastName("Liu");
employeeRepository.save(newEmployee);

上述程式碼創建了一個新的 Employee 對象,將其屬性設置為 Ian Doe,然後使用 employeeRepository.save 方法將其保存到資料庫中。

5.2 查詢記錄 (Read)

Spring Data JPA 提供了多種方式來查詢記錄。一種常見的方式是使用方法命名約定。例如,要根據姓氏查找 Employee,可以創建以下方法:

List<Employee> employees = employeeRepository.findByLastName("Liu");

Spring Data JPA 將自動生成 SQL 查詢,根據方法名 findByLastName 查詢姓氏為 "Liu" 的 Employee 記錄。

除了方法命名約定,你還可以使用 @Query 註解來定義自定義查詢。例如:

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

上述程式碼使用 JPQL(Java Persistence Query Language)定義了一個自定義查詢,查詢姓氏為指定值的 Employee 記錄。

5.3 更新記錄 (Update)

要更新資料庫中的記錄,首先需要查詢出要更新的記錄,然後修改其屬性並保存回資料庫。示例如下:

// 查詢要更新的紀錄
Employee existingEmployee = employeeRepository.findByLastName("Liu");

// 更新紀錄的屬性
existingEmployee.setFirstName("Jane");

// 保存更新後的紀錄
employeeRepository.save(existingEmployee);

上述程式碼首先查詢姓氏為 "Liu" 的 Employee 記錄,然後將其名字從 "Ian" 更新為 "Jane" 並保存回資料庫。

5.4 刪除記錄 (Delete)

要刪除資料庫中的記錄,可以使用 Spring Data JPA 提供的 delete 方法。以下是示例程式碼:

Employee employeeToDelete = employeeRepository.findByLastName("Doe");
employeeRepository.delete(employeeToDelete);

上述程式碼首先查詢姓氏為 "Liu" 的 Employee 記錄,然後使用 delete 方法將其從資料庫中刪除。

以上就是 Spring Data JPA 中執行基本的 CRUD 操作的方法。Spring Data JPA 簡化了這些操作,減少了編寫重複程式碼的工作,使資料存取更加便捷。在實際應用中,你可以根據需要組合這些操作來滿足複雜的資料處理需求


上一篇
【Day - 12】使用 Docker Compose 管理團隊開發環境 (下)
下一篇
【Day - 14】Spring Boot 整合Spring Data JPA:輕鬆處理資料庫操作 (下)
系列文
Spring Boot+Android 30天 實戰開發 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言