Mybatis技術內幕(一)——總體架構概覽

Mybatis技術內幕(一)——總體架構概覽

Mybatis的總體架構分爲三層,分別是基礎支持層核心處理層接口層java

如圖所示:sql

1、基礎支持層

基礎支持層包含整個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語句的定義。

2、核心處理層

在覈心處理層中實現了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內部的原理,這樣才能編寫出安全、高效的插件。

3、接口層

接口層的核心是 SqlSession 接口,該接口中定義了 MyBatis 暴露給應用程序調用的 API ,也就是上層應用與 MyBatis 交互的橋樑。接口層在接收到調用請求時,會調用核心處理層的相應模塊來完成具體的數據庫操做。

總結

這篇文章簡單介紹了Mybatis的總體架構,並簡單介紹了 MyBatis 基礎支持層、核心處理層以及接口層中的主要 模塊的功能。

相關文章
相關標籤/搜索