Hibernate、JPA 等 ORM 框架承諾:「用物件思維操作關聯式資料庫,屏蔽 SQL 細節,開發效率倍增」。初期確實爽快——CRUD 幾行註解搞定,關聯導航點到為止。但隨著系統上線、數據量增長、查詢複雜度提升,性能問題、調優困難、DBA 介入受阻 接踵而至。
慢查詢分析顯示問題 SQL,開發回應:「SQL 是 Hibernate 生成的,我改不了。」DBA 只能被動加索引、調參數,無法從根源重寫查詢邏輯。責任邊界模糊 成了跨團隊協作的梗阻。
報表、多表關聯、窗口函數、資料庫特有語法(Oracle Hint、PostgreSQL CTE),ORM 要麼不支援,要麼寫起來比原生 SQL 更繞。結果:專案裡混雜 HQL/JPQL、Criteria API、Native SQL、Stored Procedure,維護成本反而上升。
Connection c = null; PreparedStatement ps = null; ResultSet rs = null;
try { c = ds.getConnection(); ps = c.prepareStatement(sql); rs = ps.executeQuery();
return mapRow(rs); } finally { close(rs, ps, c); }
資源管理繁瑣、異常處理易漏、映射邏輯分散。
核心思想:SQL 寫在 XML/註解,Java 只管參數綁定與結果映射。
<if>, <choose>, <foreach>)優雅處理條件組裝| 層級 | 技術選型 | 職責 | 由誰維護 |
|---|---|---|---|
| Repository / DAO | JPA Repository / MyBatis Mapper | 單表 CRUD、簡單關聯、分頁 | 開發 |
| Custom Query | MyBatis XML / JdbcTemplate | 複雜報表、多表統計、資料庫特有優化 | 開發 + DBA 協作 |
| Performance Tuning | Explain Plan / Index / Partition / Hint | 慢 SQL 根因分析、執行計劃優化 | DBA 主導 |
| Transaction Boundary | @Transactional / Spring 事務管理 | ACID 保證、隔離級別、傳播行為 | 架構師定義、開發使用 |
hibernate.show_sql + p6spy 記錄實際執行語句ORM 不是銀彈,「物件與關聯本質不同」 是無法跨越的鴻溝。成熟團隊的共識:核心域模型用 ORM 提升表達力,邊緣複雜查詢交給 SQL 專家。工具服務於架構,而非架構為工具妥協。當 DBA 能直接調優映射檔中的 SQL 時,開發與運維的界限才真正被打通。