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,也就是與上層應用交互的橋樑。接口層在接收到調用請求時,會調用核心處理層的相應模塊完成具體的操作。主要使用:策略模式