該系列文章收錄在公衆號【Ccww技術博客】,原創技術文章早於博客推出
MyBatis
無論在是平時的使用仍是在面試中都必須掌握一個知識點,MyBatis
是支持自定義 SQL、存儲過程和高級映射的類持久框架,跟數據庫打交道的一個開源持久化框架面試
咱們來看看MyBatis
架構:數據庫
MyBatis
的總體架構分爲三層:緩存
咱們這邊主要講解一下核心處理層組件安全
在覈心處理層中,實現了 MyBatis
的核心處理流程: MyBatis
的初始化以及完成一次數據庫操做的涉及的所有流程 ,主要模塊分爲:session
配置解析對應模塊: builder
和 mapping
,主要組件爲:mybatis
XMLConfigBuilder
: 解析mybatis-config.xml
配置文件XMLMapperBuilder
:解析映射配置文件Mapper.xml
XMLStatementBuilder
:主要負責解析 Statement 配置,即 <select />
、<insert />
、<update />
、<delete />
標籤MapperAnnotationBuilder
:負責解析 Mapper 接口上的註解在 Mybatis 初始化過程當中,會加載 mybatis-config.xml
配置文件、加載映射配置文件以及 Mapper 接口中的註解@Mapper
信息,架構
經XML解析properties配置ConfigBuilder::parse
解析的配置信息會造成相應的對象並保存到 Configration
對象中。以後,根據基於Configration
建立SqlSessionFactory 對象,待 Mybatis
初始化完成後,能夠經過 SqlSessionFactory
建立 SqlSession
對象並開始數據庫操做。app
Configuration
: MyBatis 全部的配置信息都維持在 Configuration 對象之中。框架
SQL 解析模塊: scripting
,XMLLanguageDriver,XMLScriptBuilder
實現了動態 SQL 語句,其提供了多種動態 SQL語句對應的節點。好比:性能
<where>
節點、<set>
節點、<foreach>
節點等 。經過這些節點的組合使用, 幾乎能夠編寫出全部知足須要的 SQL。
先解析映射文件中定義的動態 SQL 節點,而後能夠根據用戶傳入的參數,將已解析的SQL 語句中的佔位符,綁定用戶傳入的實參,造成數據庫能執行的SQL 語句
SQL 執行與結果集映射對應的模塊: executor
(執行器) 和 cursor
(結果遊標) 模塊等。提供操做接口到數據處理後返回的一系列操做,主要模塊有:
SqlSession
: MyBatis 核心 API,主要用來執行命令,獲取映射,管理事務。接收開發人員提供 Statement Id
和參數,並返回操做結果。Executor
:執行器,是 MyBatis
調度的核心,負責 SQL 語句的生成以及查詢緩存(一級/二級緩存)的維護,它會將數據庫相關操做委託給 StatementHandler
完成。StatementHandler
: 封裝了JDBC Statement
操做,負責對 JDBC Statement
的操做,如設置參數、將Statement 結果集轉換成 List 集合。ParameterHandler
: 負責對用戶傳遞的參數轉換成 JDBC Statement
所須要的參數。ResultSetHandler
: 負責將 JDBC 返回的 ResultSet
結果集對象轉換成 List 類型的集合。TypeHandler
: 用於 Java 類型和 JDBC 類型之間的轉換。MappedStatement
: 動態 SQL 的封裝SqlSource
: 表示從 XML 文件或註釋讀取的映射語句的內容,它建立將從用戶接收的輸入參數傳遞給數據庫的 SQL。
插件層對應 模塊:plugin
模塊主要攔截器實現Interceptor
的,用戶能夠經過自定義插件來改變 Mybatis
的默認行爲。
雖然Mybatis 自身的功能很是強大,但並不能完美符合全部的應用場景,所以 MyBatis
提供了插件接口,咱們能夠經過添加用戶自定義插件的方式對 MyBatis
進行擴展,例如,咱們能夠攔截 SQL 語句並對其進行重寫。
但MyBatis只容許使用插件來攔截的這些方法調用:Executor
、ParameterHandler
、ResultSetHandler
、StatementHandler
接口
因爲用戶自定義插件會影響 MyBatis 的核心行爲,所以在使用自定義插件以前,開發人員須要瞭解 MyBatis 內部的原理,這樣才能編寫出安全、高效的插件。
接口層對應 session
模塊,其主要包括:
SqlSessionFactory和SqlSession
是MyBatis核心接口,接口中有執行命令,獲取映射,管理事務操做,其也是與上層應用交互的橋樑。接口層在接收到調用請求時,會調用核心處理層的相應模塊來完成具體的數據庫操做。Configuration
: MyBatis 全部的配置信息都維持在 Configuration
對象之中基礎支持層,包含整個 MyBatis
的基礎模塊,這些模塊爲核心處理層的功能提供了良好的支撐。
反射模塊對應: reflection
模塊,Mybatis 中的反射模塊,對 Java 反射進行了很好的封裝,提供了簡易的 API,方便上層調用,而且對反射操做進行了一系列的優化,例如緩存了類的元數據,提升了反射操做的性能
類型轉換模塊對應: type
模塊,MyBatis
爲簡化配置文件提供了別名機制,該機制是類型轉換模塊的主要功能之一。
類型轉換模塊的另外一個功能是實現 JDBC 類型與 Java 類型之間的轉換,該功能在爲 SQL 語句綁定實參以及映射查詢結果集時都會涉及:
日誌模塊對應: logging
包,MyBatis 做爲一個設計優良的框架,除了提供詳細的日誌輸出信息,還要可以集成多種日誌框架,其日誌模塊的一個主要功能就是集成第三方日誌框架,方便開發人員和測試人員快速定位 Bug 代碼
對應 io
包,資源加載模塊,主要是對類加載器進行封裝,肯定類加載器的使用順序,並提供了加載類文件以及其餘資源文件的功能 。
解析器模塊對應: parsing
包,解析器模塊,主要提供了兩個功能:
XPath
進行封裝,爲 MyBatis 初始化時解析 mybatis-config.xml
配置文件以及映射配置文件提供支持。數據源模塊對應: datasource
包,MyBatis
自身提供了相應的數據源實現,固然 MyBatis 也提供了與第三方數據源集成的接口,這些功能都位於數據源模塊之中。
數據源是實際開發中經常使用的組件之一。如今開源的數據源都提供了比較豐富的功能,例如,鏈接池功能、檢測鏈接狀態等,選擇性能優秀的數據源組件對於提高 ORM 框架乃至整個應用的性能都是很是重要的。
事務模塊對應: transaction
包,MyBatis 對數據庫中的事務進行了抽象,其自身提供了相應的事務接口和簡單實現。
在不少場景中,MyBatis
會與 Spring
框架集成,並由 Spring 框架管理事務。
緩存摸對應: cache
包,MyBatis
中提供了一級緩存和二級緩存,其都是依賴於基礎支持層中的緩存模塊實現的。
並且在優化系統性能時,優化數據庫性能是一個比較可行的,而增長緩存則是優化數據庫時最有效的手段之一,正確、合理地使用緩存能夠將一部分數據庫請求攔截在緩存這一層。
這裏須要注意的是,因爲MyBatis 自帶的緩存與MyBatis以及整個應用是運行在同一個 JVM 中的,共享同一塊堆內存。若是這兩級緩存中的數據量較大, 則可能影響系統中其餘功能的運行,因此當須要緩存大量數據時,優先考慮使用 Redis、Memcache 等緩存產品
對應 binding
包,MyBatis 經過 Binding
模塊,將用戶自定義的 Mapper
接口與映射配置文件聯繫起來,系統能夠經過調用自定義 Mapper 接口中的方法執行相應的 SQL 語句完成數據庫操做,而且會在運行期間進行校驗映射文件是否出現語法拼寫錯誤,能夠儘早避免這種錯誤,提供程序的可用性。
值得注意的是,開發人員無須編寫自定義Mapper
接口的實現,MyBatis 會自動爲其建立動態代理對象。在有些場景中,自定義Mapper
接口能夠徹底代替映射配置文件,但有的映射規則和 SQL 語句的定義仍是寫在映射配置文件中比較方便,例如動態 SQL 語句的定義。
對應 annotations
包,MyBatis
提供了註解的方式,使得咱們方便的在 Mapper
接口上編寫簡單的數據庫 SQL 操做代碼,而無需像以前同樣,必須編寫 SQL 在 XML 格式的 Mapper 文件中。
對應 exceptions
包。定義了 MyBatis 專有的 PersistenceException
和 TooManyResultsException
異常。
通過以上模塊大概瞭解Mybatis
後,這樣能夠更好爲咱們後續研讀MyBatis
源碼有着很大幫助,後續將研讀一下SQL 執行的流程,提供Mybatis自動化能力。在最後咱們在來看看模塊的架構圖:
各位看官還能夠嗎?喜歡的話,動動手指點個再看💗唄!!謝謝支持!
歡迎掃碼關注,原創技術文章第一時間推出