三者皆為 Java 持久層技術,層層封裝,核心差異在於SQL 控制權、物件關係映射程度、效能與開發效率權衡。
| 維度 | JDBC | MyBatis | Hibernate |
|---|---|---|---|
| 本質 | Java 標準 API(介面),驅動廠商實作 | 半自動 ORM,SQL 與物件映射分離 | 全自動 ORM,物件為中心,自動生成 SQL |
| SQL 控制 | 完全手寫,靈活度最高 | XML/註解寫 SQL,可精細優化 | 自動生成(HQL/Criteria),難以微調 |
| 映射配置 | 手動 ResultSet → Object | ResultMap / 自動映射 | 註解/XML 映射關係,自動建表 |
| 學習曲線 | 低(但樣板碼多) | 中 | 高(延遲載入、快取、會話管理複雜) |
| 效能 | 最高(無額外開銷) | 高(接近 JDBC,可優化 SQL) | 中(反射、代理、脏檢查開銷) |
| 多資料庫支援 | 需自行處理方言差異 | 需寫不同 SQL 或用方言適配 | 優秀(Dialect 自動適配) |
| 適用場景 | 簡單查詢、批次處理、極致效能、存儲過程 | 複雜查詢、需 SQL 優化、團隊偏好寫 SQL、遺遷專案 | 領域模型豐富、快速開發、多資料庫、CRUD 為主 |
應用程式
│
├─→ MyBatis / Hibernate
│ │
│ └─→ JDBC API (java.sql.*)
│ │
│ └─→ JDBC Driver (mysql-connector-j, ojdbc, etc.)
│ │
│ └─→ 資料庫
│
└─→ 直接用 JDBC (罕見於業務代碼)
<association>/<collection> 支援一對一、一對多延遲/立即載入。根據團隊技術棧、專案複雜度、效能要求綜合選型,無絕對優劣,只有更適合。