Mybatis的總體架構分爲三層,分別是基礎支持層、核心處理層和接口層。java
如圖所示:sql
基礎支持層包含整個Mybatis的基礎模塊,這些模塊爲核心處理層的功能提供了良好的支撐。下面簡單描述各個模塊的功能。數據庫
反射模塊緩存
Mybatis中專門提供了反射模塊,該模塊對Java原生的反射進行了良好的封裝,提供了更加簡潔易用的API,方便上層使用,而且對反射操做進行了一系列優化,例如緩存了類的元數據,提升了反射操做的性能。安全
類型轉換模塊mybatis
爲簡化配置文件提供了別名機制,該機制是類型轉換模塊的主要功能之一。類型轉換模塊的另外一個功能是實現 JDBC 類型與 Java 類型之間的轉換,該功能在爲 SQL 語句綁定實參以及映射查詢結果集時都會涉及。在爲SQL語句綁定實參時,會將數據由 Java 類型轉換 JDBC 類型;而在映射結果集時,會將數據由 JDBC 類型轉換成 Java 類型。架構
日誌模塊app
MyBatis 做爲一個設計優良的框架,除了提供詳細的日誌輸出信息,還要可以集成多種日誌框架,其日誌模塊的一個主要功能就是集成第三方日誌框架。框架
資源加載模塊性能
資源加載模塊主要是對類加載器進行封裝,肯定類加載器的使用順序,並提供了加載類文件以及其餘資源文件的功能。
解析器模塊
解析器模塊的主要提供了兩個功能:一個功能是對 XPath 進行封裝,爲 MyBatis 初始化時解析 mybatis-config.xml 配置文件以及映射配置文件提供支持;另外一個功能是爲處理動態 SQL 語句中的佔位符提供支持。
數據源模塊
MyBatis 自身提供了相應的數據源實現,固然 MyBatis 也提供了與第三方數據源集成的接口,這些功能都位於數據源模塊之中。
事務管理
MyBatis 對數據庫中的事務進行了抽象,其自身提供了相應的事務接口和簡單實現。但在大多數場景當中,Mybatis 會與 Spring 框架集成,並由 Spring 框架來管理事務。
緩存模塊
My Batis 中提供了一級緩存和二級緩存,而這兩級緩存都是依賴於基礎支持層中的緩模塊實現的。這裏須要注意的是, MyBatis 中自帶的這兩級緩存與 MyBatis 以及整個應用是運行在同一個 JVM 中的,共享同一塊堆內存。若是這兩級緩存中的數據量較大, 則可能影響系統中其餘功能的運行,因此當須要緩存大量數據時 ,優先考慮使用 Redis、 Memcache 等緩存產品。
Binding模塊
Binging模塊能夠在編譯器幫助咱們檢查在映射文件中定義的SQL節點是否有出現錯誤
注意:開發人員無須編寫自定義 Mapper 接口的實現, MyBatis 會自動爲其建立動態代理對象。在有些場景中,自定義 Mapper 接口能夠徹底代替映射配置文件,但有的映射規則和 SQL 語句的定義仍是寫在映射配置文件中比較方便,例如動態 SQL語句的定義。
在覈心處理層中實現了Mybatis的核心處理流程,其中包括Mybatis的初始化以及完成依次數據庫操做所涉及的所有流程。
配置解析
在 MyBatis 初始化過程當中,會加載 mybatis-config.xml 配置文件、映射配置文件以及Mapper 接口中的註解信息,解析後的配置信息會造成相應的對象並保存到 Configuration 對象中。以後,利用該 configuration 對象建立 SqlSessionFactory 對象。待 MyBatis 初始化以後,開發人員能夠經過初始化獲得 SqlSessionFactory 建立 SqlSession 對象並完成數據庫操做。
SQL解析與scripting模塊
MyBatis 實現動態 SQL 語句的功能,提供了多種動態 SQL 語句對應的節點,例如,<where>節點、<if>節點、<foreach>節點等。經過這些節點的組合使用, 開發人員能夠寫出幾乎知足全部需求的動態SQL語句。 MyBatis 中的 scripting 模塊會根據用戶傳入的實參,解析映射文件中定義的動態 SQL 節點,並造成數據庫可執行的 SQL 語句 。以後會處理 SQL 語句中的佔位符,綁定用戶傳入的實參。
SQL執行
SQL 語句的執行涉及多個組件 ,其中比較重要的是 Executor、StatementHandler、ParameterHandler 和ResultSetHandler。Executor 主要負責維護一級緩存和二級緩存,並提供事務管理的相關操做 ,它會將數據庫相關操做委託給 StatementHandler 完成。StatementHandler 首先經過 ParameterHandler 完成 SQL 語句的實參綁定,而後經過java.sql.Statement 象執行 SQL 語句並獲得結果集,最後經過 ResultSetHandler 完成結果集的映射,獲得結果對象並返回 。下圖展現了 MyBatis 執行 SQL 語句的大體過程。
插件
Mybatis 自身的功能雖然強大,可是並不能完美切合全部的應用場景,所以 MyBatis提供了插件接口,咱們能夠經過添加用戶自定義插件的方式對 MyBatis 進行擴展。用戶自定義插件也能夠改變 Mybatis 默認行爲,例如,咱們能夠攔截 SQL 語句並對其進行重寫。因爲用戶自定義插件會影響 MyBatis 核心行爲,在使用自定義插件以前,開發人員須要瞭解 MyBatis內部的原理,這樣才能編寫出安全、高效的插件。
接口層的核心是 SqlSession 接口,該接口中定義了 MyBatis 暴露給應用程序調用的 API ,也就是上層應用與 MyBatis 交互的橋樑。接口層在接收到調用請求時,會調用核心處理層的相應模塊來完成具體的數據庫操做。
這篇文章簡單介紹了Mybatis的總體架構,並簡單介紹了 MyBatis 基礎支持層、核心處理層以及接口層中的主要 模塊的功能。