Spring Data JPA, JDBC Template, Mybatis 比較
今天就來認識一下使用 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
參考資料:
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Sean's Blog!
評論
GiscusDisqus