Spring中的基礎知識

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 映射

  1. 基於 XML(接口和對應的 XML 映射文件)
  2. 基於註解(接口和註解)- 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 數據持久化到關係數據庫的幾種方案

  1. MyBatis - SQL 映射
  2. Spring Data JPA - ORM 映射
  3. Spring Data JDBC - 底層 / SQL 映射
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章