今天就來認識一下使用 Spring Boot 的時候可能會碰到的三種資料存取框架 Spring Data JPA、JDBC Template 和 MyBatis ,他們都各有其特色和適合的應用場景,當你需要碰到資料庫的處理,肯定需要來了解一下。

Spring Data JPA

特點:

  • ORM 的框架:將資料庫表格映射到我們定義的 Java 物件上面,並提供自動化的資料庫操作。資料操作可以用物件的概念還進行操作,程式碼具物件特性和可讀性。
  • 簡化資料存取:透過 JPA((Java Persistence API),可自動根據操作的慣例來減少手動撰寫 SQL 的需求,例如 findById, findAll 等等的直觀方法可以直接進行操作,不需要另外定義。
  • 支援 JPQL (Java Persistence Query Language): 提供類似 SQL 的查詢語言,但更強調物件導向,使用的是物件屬性而非資料庫欄位。
  • 與 Spring 整合:由於是 Spring Framework 的一部分,與 Spring 框架可自然引入整合。

優點:

  • 減少 SQL 操作的細節,並專注於物件導向設計時。
  • 資料庫結構相對穩定,不需要頻繁修改時操作方便。

缺點:

  • 對複雜查詢支持不夠靈活。 雖提供 JPQL 但對於複雜的操作上較侷限,可能仍需使用 Native Query 使用原生 SQL 進行。
  • 在高效能需求下,可能因自動生成的 SQL 語句效能不佳。

JDBC Template

特點:

  • 簡化原生 JDBC 操作:JDBC Template 封裝了原生 JDBC API,簡化了連接、資源管理和錯誤處理等繁瑣細節。
  • 高度控制 SQL 語句:需要開發者手動撰寫 SQL 語句,讓開發者完全掌握 SQL 的細節和效能。
  • 簡單易用:支援查詢單一資料、多筆資料、更新、插入和批次操作,容易學習和掌握。
  • 與 Spring 整合: 由於是 Spring Framework 的一部分,與 Spring 框架可自然引入整合。

優點:

  • 靈活撰寫 SQL
  • 可應對資料庫結構不斷變動或查詢需求複雜的系統。

缺點:

  • 需要手動撰寫和維護 SQL 語句,增加代碼量。
  • 不如 JPA 那樣自動處理關聯或物件映射。

MyBatis

特點:

  • 類 ORM:因為 ORM 的設計概念就是要減少 SQL 的使用,自動透過語法去產生 SQL,MyBatis 支援將 SQL 查詢結果自動映射到 Java 物件這樣類似 ORM 的概念,但 SQL 需要開發者自行撰寫,所以不算 ORM。
  • 高靈活性:開發者可以完全掌控 SQL 語句,適合處理複雜查詢或動態 SQL 的場景,例如可以在 SQL 中加入特定條件判斷,選擇性的執行語句。
  • XML 和註解配置: 可以使用 XML 或註解配置 SQL 語句,適合團隊協作和代碼重用。也將 SQL 結果自動映射到 Java 類別,減少手動處理的麻煩。

適用場景:

  • 靈活撰寫 SQL
  • 可應對資料庫結構不斷變動或查詢需求複雜的系統。

缺點:

  • XML 配置可能過於冗長,增加代碼複雜度。
  • 需要維護大量自訂 SQL,若不加以管理,可能導致代碼難以維護。

JPA、JDBC Template 和 MyBatis 的比較與選擇指引

特性 JPA JDBC Template MyBatis
SQL 控制 低(自動生成) 高(手動撰寫) 高(手動撰寫)
資料庫操作簡易度 高(自動化映射與操作) 中(簡化資源管理與操作) 中(映射支援,但 SQL 需自行處理)
ORM 支援 完整支援 無(需要手動處理) 半自動化(SQL 自訂,結果自動映射)
複雜查詢 一般(使用 JPQL,靈活性有限) 高(完全自訂 SQL) 高(動態 SQL 支援)
學習曲線 中(需理解 ORM 概念) 低(適合熟悉 SQL 的開發者) 中(需學習 XML 或註解配置)
效能 中(依賴 ORM 實現) 高(手動優化 SQL) 高(可完全控制 SQL)

使用心得分享:

目前我工作上有碰過的就是 JPA 和 MyBatis 這兩種,自己使用的心得會覺得,如果資料庫簡單,多半都是進行比較單純的 CRUD 操作時,因為物件關係明確時,JPA 會比較方便去操作,像是自己做一些小專案可以很快地建立起操作資料的連結或;當資料庫比較複雜需要較多 SQL 操作,並且對 SQL 熟悉,有高度掌控需求時,MyBatis 會更適合,JDBC 雖然我沒用過,但看過一些用法也是著重原生 SQL 的特性,所以也會比較接近 MyBatis 的應用場景。

小總結:

  • 若開發專案重視物件導向設計與簡化 CRUD 操作,並且不太需要控制 SQL 細節,選擇 JPA。
  • 若專案需要靈活控制 SQL 並希望減少手動管理 JDBC 資源的複雜度,選擇 JDBC Template
  • 若專案需要高度靈活的 SQL 控制,並且涉及大量複雜查詢和動態 SQL,選擇 MyBatis

參考資料: