MyBatis 源碼分析----MyBatis 整體架構概要說明

MyBatis整體架構

MyBatis的整體架構分爲三層1:基礎支持層,2:核心處理層,3:接口層

 

1:基礎支持層:

1-1反射模塊:

該模塊對Java 原生的反射進行了良好的封裝,提供了更加簡潔易用的API ,方便上層使調用,並且對反射操作進行了一系列優化,例如緩存了類的元數據,提高了反射操作的性能

1-2類型轉換模塊:

MyBatis 爲簡化配置文件提供了別名機制, 該機制是類型轉換模塊的主要功能之一。類型轉換模塊的另一個功能是實現JDBC 類型與Java 類型之間的轉換,該功能在爲SQL 語句綁定實參以及映射查詢結果集時都會涉及。在爲SQL 語句綁定實參時, 會將數據由Java 類型轉換成JDBC 類型;而在映射結果集時,會將數據由JDB C 類型轉換成Java 類型

日誌模塊:

            日誌模塊的一個主要功能就是集成第三方日誌框架,將MyBatis操作的日誌輸出。

1-3資源加載模塊:

資源加載模塊主要是對類加載器進行封裝,確定類加載器的使用順序,並提供了加載類文件以及其他資源文件的功能

 

1-4解析器模塊:

解析器模塊的主要提供了兩個功能: 一個功能是對XPath 進行封裝,爲MyBatis 初始化時解析mybatis-config.xml 配置文件以及映射配置文件提供支持;另一個功能是爲處理動態SQL 語句中的佔位符提供支持。

 

1-5數據源模塊:

數據源是實際開發中常用的組件之一。現在開源的數據源都提供了比較豐富的功能,

例如,連接池功能、檢測連接狀態等,選擇性能優秀的數據源組件對於提升ORM 框

架乃至整個應用的性能都是非常重要的。MyBatis 自身提供了相應的數據源實現,當

然MyBatis 也提供了與第三方數據源集成的接口,這些功能都位於數據源模塊之中

 

1-6事務管理:

MyBatis 對數據庫中的事務進行了抽象,其自身提供了相應的事務接口和簡單實現。

在很多場景中, MyBatis 會與Spring 框架集成,並由Spring 框架管理事務。

 

1-7緩存模塊:

MyBatis 中提供了一級緩存和二級緩存,而這兩級緩存都是依賴於基礎支持層中的緩

存模塊實現的。這裏需要讀者注意的是, MyBatis 中自帶的這兩級緩存與MyBatis 以

及整個應用是運行在同一個jvm 中的,共享同一塊堆內存。如果這兩級緩存中的數據

量較大, 則可能影響系統中其他功能的運行,所以當需要緩存大量數據時,優先考慮

使用Redis 、Memcache 等緩存產品。

 

1-8 Binding模塊:

在調用SqI Session 相應方法執行數據庫操作時,需要指定映射文件中定義的SQL 節點,如果出現拼寫錯誤,我們只能在運行時才能發現相應的異常。爲了儘早發現這種錯誤, MyBatis 通過Binding 模塊將用戶自定義的Mapper 接口與映射配置文件關聯起來,系統可以通過調用自定義Mapper 接口中的方法執行相應的SQL 語句完成數據庫操作,從而避免上述問題。

值得注意的是,開發人員無須編寫自定義Mapper 接口的實現, MyBatis 會自動爲

其創建動態代理對象。在有些場景中,自定義Map per 接口可以完全代替映射配置文件,

但有的映射規則和SQL 語句的定義還是寫在映射配置文件中比較方便,例如動態SQL

語句的定義。

2:核心處理層

2-1配置解析:

在MyBatis 初始化過程中,會加載mybatis-config.xml 配置文件、映射配置文件以及

Mapper 接口中的註解信息,解析後的配置信息會形成相應的對象並保存到

Configuration 對象中。例如,示例中定義的< resultMap >節點(即ResultSet 的映射規則)

會被解析成ResultMap 對象:示例中定義的<result> 節點(即屬性映射)會被解析成

ResultMapping 對象。之後,利用該C onfiguration 對象創建Sq!Sessi onFactory 對象。

待My Batis 初始化之後,開發人員可以通過初始化得到Sq!SessionFactory 創建

Sq!Session 對象並完成數據庫操作。

 

2-2:SQL解析與scriptiong模塊

拼湊SQL 語句是一件煩瑣且易出錯的過程,爲了將開發人員從這項枯燥無趣的工作中

解脫出來, MyBatis 實現動態SQL 語句的功能,提供了多種動態SQL 語句對應的節點,

例如,< where>節點、< if>節點、< foreach>節點等。通過這些節點的組合使用, 開發人

員可以寫出幾乎滿足所有需求的動態SQL 語句。

My Batis 中的scripting 模塊會根據用戶傳入的實參,解析映射文件中定義的動態SQL

節點,並形成數據庫可執行的SQL 語句。之後會處理SQL 語句中的佔位符,綁定用

戶傳入的實參。

2-3:SQL執行

SQL 語句的執行涉及多個組件,其中比較重要的是Executor 、StatementHandler 、

ParameterHandler 和R巳sultSetHandler 。E xecutor 主要負責維護一級緩存和二級緩存,

並提供事務管理的相關操作,它會將數據庫相關操作委託給StatementHandler 完成。

StatementHandler 首先通過ParameterHandler 完成S QL 語句的實參綁定,然後通過

java.sql.Statement 對象執行SQL 語句並得到結果集,最後通過ResultSetHandler 完成結

果集的映射,得到結果對象並返回。下圖展示了MyBatis 執行一條SQL 語句的大致

過程。

 

2-4:插件

            Mybatis 自身的功能雖然強大,但是並不能完美切合所有的應用場景,因此MyBatis

提供了插件接口,我們可以通過添加用戶自定義插件的方式對MyBatis 進行擴展。用

戶自定義插件也可以改變Mybatis 的默認行爲,例如,我們可以攔截SQL 語句並對其

進行重寫。由於用戶自定義插件會影響MyBatis 的核心行爲,在使用自定義插件之前,

開發人員需要了解MyBatis 內部的原理,這樣才能編寫出安全、高效的插件。

3:接口層

接口層相對簡單,其核心是SqlSession 接口,該接口中定義了MyBatis 暴露給應用程序調

用的API ,也就是上層應用與MyBatis 交互的橋樑。接口層在接收到調用請求時,會調用核心

處理層的相應模塊來完成具體的數據庫操作

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