MyBatis
JDBC、Hibernate和MyBatis對比
這一部分主要來自《深入淺出MyBatis 技術原理與實戰》楊開振的一本書
JDBC
JDBC是由SUN公司提出的一系列規範,只定義接口規範,具體的實現由各數據庫廠商去實現。JDBC是一種典型的橋架模式。
使用JDBC步驟
- 連接數據庫,註冊驅動和數據庫信息
- 操作Connection,打開Statement對象
- 通過Statement執行SQL,返回ResultSet對象
- 使用ResultSet讀取數據,通過代碼轉化爲POJO對象
- 關閉數據庫相關資源
弊端
- 工作量相對較大。需要先連接,然後處理JDBC底層事物,處理數據類型。還需要操作Connection對象,Statement對象和ResultSet對象去拿到數據,並準確關閉它們。
- 需要對JDBC編程可能產生的異常進行捕捉處理並正確關閉資源
Hibernate
全表映射模型,只需要提供POJO和映射關係,最致命的問題是性能。適用於場景不太複雜,要求性能不太苛刻的時候使用。
好處
- 消除了代碼的映射規則
- 無需再管理數據庫連接
- 一個會話中,不要操作多個對象,只要操作Session對象
- 關閉資源只需要關閉一個Session
缺點
- 全表映射帶來的不便,比如更新時需要發送所有的字段
- 無法根據不同的條件組裝不同的SQL
- 對多表關聯和複雜SQL查詢支持較差,需要自己寫SQL,返回後,需要自己將數據組裝成POJO
- 不能有效支持存儲過程
- HQL性能較差,不能滿足互聯網優化SQL的需求
MyBatis
半自動映射框架,手動提供POJO、SQL和映射關係
優缺點參考:淺談mybatis優缺點
MyBatis執行大致流程
- 拿到的mapper是JDK動態代理生成的
- 執行查詢等方法時,
MapperMethod
通過命令模式執行,拿MapperMethod
是有緩存的 executor
執行查詢方法時,先根據MappedStatement
拿到已經變成?
作爲佔位符的SQL語句- 查數據庫前會先查緩存,如果有,直接返回
StatementHandler
將SQL語句轉變爲PreparedStatement
,並填充參數- 執行
PreparedStatement
resultSetHandler
處理查詢結果
遺留問題
- 解析sql時的流程
先替換include,然後計算動態sql部分,然後把${}
替換掉,把#{}
替換掉
- 什麼時候把
#{}
換成?
的?
在org.apache.ibatis.builder.SqlSourceBuilder#parse
中在org.apache.ibatis.parsing.GenericTokenParser#parse
方法中,用org.apache.ibatis.parsing.TokenHandler#handleToken