JPA
Java 持久化 API,是官方定義的基於註解形式的技術規範,
進行對象關係映射(ORM),對象與表的映射,對象之間的關係與表之間關係的映射
封裝了 JDBC 操作(在其基礎之上)
存在多種技術實現,如 hibernate、toplink,
API 架構基於 抽象工廠設計模式
JPA vs JDBC
JPA 中有哪些註解,他們的意義?
// 實體類,狀態需要持久化的類
@Entity
// 映射當前類到特定的數據庫(schema)、表(table)
@Table
// 映射主鍵(PK)
@Id
// 映射到表的列(字段)
@Column
// 一對一
@OneToOne
// 一對多
@OneToMany
// 瞬時,該字段不持久化(不往表裏存,表中無對應的列)
@Transient
// 不在 JPA 中,是 Spring/Spring Data 中最核心的註解
@Repository
// 相關接口 `Repository`
自定義的 Repository
接口通常繼承哪些接口?
Repository
- 定義持久化定義的根,空接口CrudRepository
- 定義基礎增刪改查操作PagingAndSortingRepository
- 定義分頁和排序操作JpaRepository
- 額外增加了基於 JPA 的查詢操作
JPA 與 MyBatis 的關係 / 使用場景 / 優缺點?
JPA 是官方的 ORM 技術規範,有多種實現(hibernate, toplink),
不需要寫 SQL,定義了一組標準的 Java API 高度底層封裝了 JDBC 操作
自動化
入門容易,性能優化及高階特定學習曲線高
數據模型相對簡單,使用起來很方便;數據模型複雜,難度較大
也可以嵌套 SQL 語句,但是有獨立的查詢語言
MyBatis 是一個第三方框架,實現了 Java 的 SQL 映射,
需要寫 SQL,封裝了 JDBC 操作
半自動化
相對容易掌握和使用
適用與各種場景和需求(可優化 SQL 語句)
MyBatis 進行 SQL 映射
- 基於 XML(接口和對應的 XML 映射文件)
- 基於註解(接口和註解)- Java 5 / 2004
MyBatis 中有哪些常用的註解?
@Mapper
// 基礎 CRUD 操作
@Insert
@Select
@Delete
@Update
// 動態 SQL
@InsertProvider
@SelectProvider
@DeleteProvider
@UpdateProvider
// 參數別名,非 POJO 的多個參數
@Param
// 字段映射
@Results
@Result
@ResultMap
// 連接表
@One
@Many
Spring MVC 中的註解
// TODO 你去繼續完成
Spring Data 很重要
Spring Data 包含以下子項目:
- Spring Data JDBC - Spring 提供的 SQL 映射技術,進行了 JDBC 封裝
- Spring Data JPA / MyBatis
- Spring Data MongoDB
- Spring Data Redis
- Spring Data …
Spring Data 中的 Repository
接口及註解是通用的公共的根
文檔
Spring Data JPA/MongoDB 基於方法名的查詢
interface PersonRepository extends CrudRepository<Person, Long> {
// 約定優於配置
// 方法名就是查詢的過濾條件或排序規則
List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
// Enables the distinct flag for the query
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
// Enabling ignoring case for an individual property
List<Person> findByLastnameIgnoreCase(String lastname);
// Enabling ignoring case for all suitable properties
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);
// Enabling static ORDER BY for a query
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}
屬性表達式
// 方案一
List<Person> findByAddressZipCode(ZipCode zipCode);
// 方案二
List<Person> findByAddress_ZipCode(ZipCode zipCode);
Spring Boot 數據持久化到關係數據庫的幾種方案
- MyBatis - SQL 映射
- Spring Data JPA - ORM 映射
- Spring Data JDBC - 底層 / SQL 映射