MyBatis總體架構java
MyBatis的總體架構分爲三層1:基礎支持層,2:核心處理層,3:接口層sql
該模塊對Java 原生的反射進行了良好的封裝,提供了更加簡潔易用的API ,方便上層使調用,而且對反射操做進行了一系列優化,例如緩存了類的元數據,提升了反射操做的性能。數據庫
MyBatis 爲簡化配置文件提供了別名機制, 該機制是類型轉換模塊的主要功能之一。類型轉換模塊的另外一個功能是實現JDBC 類型與Java 類型之間的轉換,該功能在爲SQL 語句綁定實參以及映射查詢結果集時都會涉及。在爲SQL 語句綁定實參時, 會將數據由Java 類型轉換成JDBC 類型;而在映射結果集時,會將數據由JDB C 類型轉換成Java 類型緩存
日誌模塊的一個主要功能就是集成第三方日誌框架,將MyBatis操做的日誌輸出。安全
資源加載模塊主要是對類加載器進行封裝,肯定類加載器的使用順序,並提供了加載類文件以及其餘資源文件的功能mybatis
解析器模塊的主要提供了兩個功能: 一個功能是對XPath 進行封裝,爲MyBatis 初始化時解析mybatis-config.xml 配置文件以及映射配置文件提供支持;另外一個功能是爲處理動態SQL 語句中的佔位符提供支持。架構
數據源是實際開發中經常使用的組件之一。如今開源的數據源都提供了比較豐富的功能,app
例如,鏈接池功能、檢測鏈接狀態等,選擇性能優秀的數據源組件對於提高ORM 框框架
架乃至整個應用的性能都是很是重要的。MyBatis 自身提供了相應的數據源實現,當jvm
然MyBatis 也提供了與第三方數據源集成的接口,這些功能都位於數據源模塊之中
MyBatis 對數據庫中的事務進行了抽象,其自身提供了相應的事務接口和簡單實現。
在不少場景中, MyBatis 會與Spring 框架集成,並由Spring 框架管理事務。
MyBatis 中提供了一級緩存和二級緩存,而這兩級緩存都是依賴於基礎支持層中的緩
存模塊實現的。這裏須要讀者注意的是, MyBatis 中自帶的這兩級緩存與MyBatis 以
及整個應用是運行在同一個jvm 中的,共享同一塊堆內存。若是這兩級緩存中的數據
量較大, 則可能影響系統中其餘功能的運行,因此當須要緩存大量數據時,優先考慮
使用Redis 、Memcache 等緩存產品。
1-8 Binding模塊:
在調用SqI Session 相應方法執行數據庫操做時,須要指定映射文件中定義的SQL 節點,若是出現拼寫錯誤,咱們只能在運行時才能發現相應的異常。爲了儘早發現這種錯誤, MyBatis 經過Binding 模塊將用戶自定義的Mapper 接口與映射配置文件關聯起來,系統能夠經過調用自定義Mapper 接口中的方法執行相應的SQL 語句完成數據庫操做,從而避免上述問題。
值得注意的是,開發人員無須編寫自定義Mapper 接口的實現, MyBatis 會自動爲
其建立動態代理對象。在有些場景中,自定義Map per 接口能夠徹底代替映射配置文件,
但有的映射規則和SQL 語句的定義仍是寫在映射配置文件中比較方便,例如動態SQL
語句的定義。
在MyBatis 初始化過程當中,會加載mybatis-config.xml 配置文件、映射配置文件以及
Mapper 接口中的註解信息,解析後的配置信息會造成相應的對象並保存到
Configuration 對象中。例如,示例中定義的< resultMap >節點(即ResultSet 的映射規則)
會被解析成ResultMap 對象:示例中定義的<result> 節點(即屬性映射)會被解析成
ResultMapping 對象。以後,利用該C onfiguration 對象建立Sq!Sessi onFactory 對象。
待My Batis 初始化以後,開發人員能夠經過初始化獲得Sq!SessionFactory 建立
Sq!Session 對象並完成數據庫操做。
拼湊SQL 語句是一件煩瑣且易出錯的過程,爲了將開發人員從這項枯燥無趣的工做中
解脫出來, MyBatis 實現動態SQL 語句的功能,提供了多種動態SQL 語句對應的節點,
例如,< where>節點、< if>節點、< foreach>節點等。經過這些節點的組合使用, 開發人
員能夠寫出幾乎知足全部需求的動態SQL 語句。
My Batis 中的scripting 模塊會根據用戶傳入的實參,解析映射文件中定義的動態SQL
節點,並造成數據庫可執行的SQL 語句。以後會處理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 內部的原理,這樣才能編寫出安全、高效的插件。
接口層相對簡單,其核心是SqlSession 接口,該接口中定義了MyBatis 暴露給應用程序調
用的API ,也就是上層應用與MyBatis 交互的橋樑。接口層在接收到調用請求時,會調用核心
處理層的相應模塊來完成具體的數據庫操做