一、前言
- 工作三年了,各種開發框架也用的十分熟練。現在學習的時候漸漸也不滿足使用上,所以開始涉獵源碼,也是希望自己的技術能力能更近一步,自己想法也是從Mybatis框架源碼開始,在博客上記錄下,和大家一步進步
二、ORM框架
- 傳統JDBC常見的步驟:
- 註冊數據庫驅動類
- 通過DriverManager打開數據庫連接
- 通過連接創建相應的Statement
- 通過Statement執行相應的SQL語句,若是查詢語句則得到ResultSet
- 通過ResultSet讀取數據,並轉化爲相應的JavaBean
- 關閉資源
- 上述操作中我們關注點只有SQL語句的執行,其它操作重複且繁雜。早期的時候爲了提高代碼的可複用性,通常將重複性代碼封裝到一個類似DBUtils的工具類中。但是關係模型到對象模型的轉換依然複雜,所以ORM框架應運而生
- ORM的提供的功能:
- 根據映射配置文件,實現對象模型和關係模型之間的映射,同時也屏蔽了上述重複代碼
- Hibernate:
- 通過hbm.xml文件維護對象模型和關係模型之間的映射。通過該映射,開發人員可以通過看待Java的角度去看待數據庫中的數據行
- 優點:
- HIbernate還能夠屏蔽數據庫的底層差異,以至於可以切換不同的數據庫而程序不受影響。
- API沒有侵入性,業務邏輯不需要繼承Hibernate的任何接口
- 缺點
- 並不是數據庫中所有的概念在面向對象的世界中都能找到對應關係,比如索引、存儲過程以及函數等
- SQL優化比較困難
- Spring JDBC:
- 並不算一個ORM框架,僅僅使用模板方法的設計模式對原生JDBC進行了一層薄封裝,它沒有映射文件、緩存等概念,而是直接執行原生SQL語句
- 優點:
- 屏蔽了數據庫連接創建等重複性代碼,提升了開發效率
- 提供了很多template類,可以將對象中的屬性映射爲SQL中的參數
- 提供了很多ORM化的callback,可以將ResultSet轉化成相應的對象列表
- Spring JDBC本身就位於核心包中,和Spring框架無縫連接
- Mybatis:
- Mybatis是對JDBC的一層封裝,幫助開發人員屏蔽了底層代碼的重複性
- 優點:
- 相比於Hibernate更加輕量級,可控性也更高
- 可以進行SQL優化
三、Mybatis整體架構簡述
- MyBatis整體架構分爲三層:接口層、核心處理層、基礎支持層
- 接口層:
- 核心是SqlSession接口,它暴露了Mybatis提供給開發人員的API,接口層在接收到相應的請求時,會調用核心處理層的相應模塊來完成具體操作
- 核心處理層:
- 核心處理層實現了Mybatis核心處理流程,其中包括Mybatis的初始化以及完成一次數據庫操作涉及的全部流程
- 組成:
- 配置解析,解析配置文件如核心配置文件解析成功後會生成Configuration對象
- SQL解析,用於解析動態SQL
- SQL執行,用於執行SQL,其涉及到多個模塊Executor、ParameterHandler、StatementHandler以及ResultSetHandler
- 插件,可以通過添加自定義插件的方式對Mybatis進行擴展
- 基礎支持層:
- 爲核心處理層提供了良好的支持,並提供了可觀的代碼複用
- 組成:
- 反射模塊,對JDK反射的封裝
- 類型轉換模塊,別名機制是類型轉換模塊中重要機制,實現了JDBC類型和JAVA類型之間的轉換
- 日誌模塊,用於日誌記錄
- 資源加載模塊,對類加載器的封裝
- 解析器模塊,一是對XPath的封裝,爲初始化加載解析配置文件提供支持。二是爲處理動態SQL語句中的佔位符提供支持
- 數據源模塊,mybatis提供了相應的數據源實現,也提供了與第三方數據源集成的接口
- 事務管理模塊,對數據庫中的事務進行了抽象,其自身提供了相應的事務接口和簡單實現。
- 緩存模塊,提供了一級緩存二級緩存
- binding模塊,將用戶自定義的mapper接口與映射配置文件關聯起來