[Java 面試突擊訓練] MyBatis 架構分析

MyBatis 整體架構

在這裏插入圖片描述

基礎支持層

類型 描述
反射模塊 對Java原生的反射進行了良好的封裝,提供了更加簡潔易用的 API,方便上層調用,並且對反射操作進行了一系列優化,例如緩存了類的元數據,提高了反射操作的性能。
類型轉換模塊 Mybatis 爲簡化配置文件提供了別名機制,是類型轉換模塊的主要功能之一。另一個功能是實現 JDBC 類型與 Java 類型之間的轉換,該功能在爲 SQL 語句綁定實參以及映射查詢結果集時都會涉及。
日誌模塊 提供詳細的日誌輸出信息,適配第三方日誌框架。主要使用:適配器模式、代理模式
資源加載模塊 對類加載器進行封裝,確定類加載器的使用順序,提供了加載類文件以及其他資源文件的功能。
解析器模塊 一個功能是對 XPath 進行封裝,爲 Mybatis 初始化時解析 mybatis-config.xml 配置文件以及映射配置文件提供支持。另一個功能是爲處理動態 SQL 語句中的佔位符提供支持
數據源模塊 提供了相應的數據源實現,也提供了與第三方數據源集成的接口。主要使用:工廠模式
事務管理 對數據庫的事務進行了抽象,自身提供了相應的事務接口和簡單實現。
緩存模塊 提供了一級緩存和二級緩存,需要注意的是 Mybatis 自帶的緩存與應用程序在同一個 JVM 中,共享同一塊堆內存。因此緩存較大時可能影響系統性能。主要使用:裝飾器模式
Binding模塊 將用戶自定義的 Mapper 接口與映射配置文件關聯起來,系統可以通過調用自定義 Mapper 接口中的方法執行相應的 SQL 語句完成數據庫操作。
數據源模塊

常見的數據源組件都實現了 DataSource 接口,Mybatis 自身實現的數據源也不例外。此外,還提供了兩個實現,分別是 PooledDataSource 和 UnpooledDataSource。Mybatis 使用 DataSourceFactory 接口實現創建不同類型的 DataSource。

PooledDataSource
  • PooledDataSource.popConnection()
    在這裏插入圖片描述
  • PooledDataSource.pushConnection()
    在這裏插入圖片描述
緩存模塊

Cache 接口是緩存模塊中最核心的接口。Mybatis 因爲涉及動態 SQL 等因素,其緩存的 key 不能僅僅通過一個 String 表示,所以提供了 CacheKey 類來表示緩存項的 key。

核心處理層

類型 描述
配置解析 在 Mybatis 初始化過程中,會加載 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的註解信息,解析後的配置信息會形成相應的對象並保存到 Configuration 對象中。之後,利用該 Configuration 對象創建 SqlSessionFactory 對象。待 Mybatis 初始化之後,開發人員可以通過初始化得到 SqlSessionFactory 並創建 SqlSession 對象,完成數據庫操作。
SQL 解析 實現動態 SQL 語句的功能,提供了多種動態 SQL 語句對應的節點(where, if, foreach 等)。
SQL執行 涉及多個組件,比較重要的有 Executor, StatementHandler, ParameterHandler 和 ResultSetHandler。Executor 主要負責維護一級緩存和二級緩存,並提供事務管理的相關操作,它會將數據庫相關操作委託給 StatementHandler 完成。StatementHandler 首先通過 ParameterHandler 完成 SQL 語句的實參綁定,然後通過 Statement 對象執行 SQL 語句並得到結果集,最後通過 ResultSetHandler 完成結果集的映射,得到結果對象並返回。

Mybatis 執行一條 SQL 語句的大致流程
在這裏插入圖片描述

接口層

接口層相對簡單,其核心是 SqlSession 接口,該接口定義了 Mybatis 暴露給應用程序調用的 API,也就是與上層應用交互的橋樑。接口層在接收到調用請求時,會調用核心處理層的相應模塊完成具體的操作。主要使用:策略模式

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