跟 SQL say goodbye 好適合聽 James Bay 的新歌 Goodbye Never Felt So Bad
強推 James 所有歌曲的 live/acoustic 版本,絕對是聽覺上的享受!
Java Persistence API (JPA) 是 Java 平台上的一套 ORM 標準規範。
一般來說,談及資料庫會想到 SQL 和 table,但在 Java 開發情境下更常以物件的角度思考。JPA 就是提供一個橋樑,將這兩個世界(資料表 ↔︎ 物件)連接起來。
ORM 允許我們使用物件導向的方式來操作資料庫,讓我們不必直接與 SQL 互動,而是改由操作 Java 物件更直觀地進行資料存取。這意味著我們可以用 Java class 來代表資料庫 table,並用類別的屬性
來代表資料表的欄位
。
這是一個基本的 JPA entity,代表一個 User
,該 entity 會 mapping 到 table name 為 user
的表。
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private String email;
// 省略 getters, setters 還有其他方法
}
使用 ORM 可以提高開發效率,不需再寫大量的 SQL 程式碼。但沒有絕對完美的解方,相對它也有一些缺點:
Spring Boot 提供了一系列的 starters,其中包含專為 JPA 設計的 spring-boot-starter-data-jpa
。
整合的好處如下:
簡化設定:只要幾行設定,就可以定義資料庫連接、選擇 JPA 提供者(ex: Hibernate)等。
在 pom.xml
/ build.gradle
中加入 dependency:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.h2</groupId>
<artifactId>h2</artifactId> // 這邊用 h2 in memory database
<scope>runtime</scope>
</dependency>
設定資料庫連線:在 application.properties
中,設定資料庫連線資訊:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username= dbmeowmeow
spring.datasource.password= pwmeowmeow
spring.jpa.hibernate.ddl-auto=update
Repository:Spring Data JPA 提供了 Repository,讓 CRUD 操作變簡單。以下為 interface 繼承關係:
Repository
↘
CrudRepository -> 提供基本的 CRUD 功能
↘
PagingAndSortingRepository -> 提供分頁和排序功能
↘
JpaRepository -> 提供 flush()、batch 操作等
import org.springframework.data.repository.CrudRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
優化查詢:可以使用方法名自動產生查詢,或者使用 @Query
注解自定義。
交易管理:Spring Boot 簡化了交易管理的流程,只需要使用 @Transactional
註解即可
異常處理:Spring Data JPA 將資料庫相關的異常轉化為 Spring 專用的異常,使異常處理更加一致。