MyBatis

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章