MyBatis面試題分析導讀-架構以及核心內容

該系列文章收錄在公衆號【Ccww技術博客】,原創技術文章早於博客推出

前言

MyBatis無論在是平時的使用仍是在面試中都必須掌握一個知識點,MyBatis 是支持自定義 SQL、存儲過程和高級映射的類持久框架,跟數據庫打交道的一個開源持久化框架面試

咱們來看看MyBatis架構:數據庫

MyBatis的總體架構分爲三層:緩存

  1. 基礎支持層
  2. 核心處理層
  3. 接口層

咱們這邊主要講解一下核心處理層組件安全

核心處理層

在覈心處理層中,實現了 MyBatis的核心處理流程: MyBatis初始化以及完成一次數據庫操做的涉及的所有流程 ,主要模塊分爲:session

  • 配置解析
  • SQL 解析與參數映射
  • SQL 執行與結果集映射
  • 插件

配置解析

配置解析對應模塊: buildermapping ,主要組件爲: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 解析與參數映射

SQL 解析模塊: scriptingXMLLanguageDriver,XMLScriptBuilder實現了動態 SQL 語句,其提供了多種動態 SQL語句對應的節點。好比:性能

  • <where> 節點、
  • <set> 節點、
  • <foreach> 節點等 。

經過這些節點的組合使用, 幾乎能夠編寫出全部知足須要的 SQL。

先解析映射文件中定義的動態 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只容許使用插件來攔截的這些方法調用:ExecutorParameterHandlerResultSetHandlerStatementHandler 接口

因爲用戶自定義插件會影響 MyBatis 的核心行爲,所以在使用自定義插件以前,開發人員須要瞭解 MyBatis 內部的原理,這樣才能編寫出安全、高效的插件。

接口層

接口層對應 session 模塊,其主要包括:

  • SqlSessionFactory和SqlSession是MyBatis核心接口,接口中有執行命令,獲取映射,管理事務操做,其也是與上層應用交互的橋樑。接口層在接收到調用請求時,會調用核心處理層的相應模塊來完成具體的數據庫操做。
  • Configuration: MyBatis 全部的配置信息都維持在 Configuration 對象之中

基礎支持層

基礎支持層,包含整個 MyBatis 的基礎模塊,這些模塊爲核心處理層的功能提供了良好的支撐。

反射模塊

反射模塊對應: reflection 模塊,Mybatis 中的反射模塊,對 Java 反射進行了很好的封裝,提供了簡易的 API,方便上層調用,而且對反射操做進行了一系列的優化,例如緩存了類的元數據,提升了反射操做的性能

類型模塊

類型轉換模塊對應: type 模塊,MyBatis 爲簡化配置文件提供了別名機制,該機制是類型轉換模塊的主要功能之一。

類型轉換模塊的另外一個功能是實現 JDBC 類型與 Java 類型之間的轉換,該功能在爲 SQL 語句綁定實參以及映射查詢結果集時都會涉及:

  • 在爲 SQL 語句綁定實參時,會將數據由 Java 類型轉換成 JDBC 類型。
  • 在映射結果集時,會將數據由 JDBC 類型轉換成 Java 類型

日誌模塊

日誌模塊對應: logging 包,MyBatis 做爲一個設計優良的框架,除了提供詳細的日誌輸出信息,還要可以集成多種日誌框架,其日誌模塊的一個主要功能就是集成第三方日誌框架,方便開發人員和測試人員快速定位 Bug 代碼

資源加載模塊

對應 io 包,資源加載模塊,主要是對類加載器進行封裝,肯定類加載器的使用順序,並提供了加載類文件以及其餘資源文件的功能 。

解析器模塊

解析器模塊對應: parsing 包,解析器模塊,主要提供了兩個功能:

  • 一個功能,是對XPath 進行封裝,爲 MyBatis 初始化時解析 mybatis-config.xml 配置文件以及映射配置文件提供支持。
  • 另外一個功能,是爲處理動態 SQL 語句中的佔位符提供支持

數據源模塊

數據源模塊對應: datasource 包,MyBatis 自身提供了相應的數據源實現,固然 MyBatis 也提供了與第三方數據源集成的接口,這些功能都位於數據源模塊之中。

數據源是實際開發中經常使用的組件之一。如今開源的數據源都提供了比較豐富的功能,例如,鏈接池功能、檢測鏈接狀態等,選擇性能優秀的數據源組件對於提高 ORM 框架乃至整個應用的性能都是很是重要的。

事務模塊

事務模塊對應: transaction 包,MyBatis 對數據庫中的事務進行了抽象,其自身提供了相應的事務接口和簡單實現

在不少場景中,MyBatis 會與 Spring 框架集成,並由 Spring 框架管理事務

緩存模塊

緩存摸對應: cache 包,MyBatis 中提供了一級緩存和二級緩存,其都是依賴於基礎支持層中的緩存模塊實現的。

並且在優化系統性能時,優化數據庫性能是一個比較可行的,而增長緩存則是優化數據庫時最有效的手段之一,正確、合理地使用緩存能夠將一部分數據庫請求攔截在緩存這一層。

這裏須要注意的是,因爲MyBatis 自帶的緩存與MyBatis以及整個應用是運行在同一個 JVM 中的,共享同一塊堆內存。若是這兩級緩存中的數據量較大, 則可能影響系統中其餘功能的運行,因此當須要緩存大量數據時,優先考慮使用 Redis、Memcache 等緩存產品

Binding 模塊

對應 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自動化能力。在最後咱們在來看看模塊的架構圖:

各位看官還能夠嗎?喜歡的話,動動手指點個再看💗唄!!謝謝支持!
歡迎掃碼關注,原創技術文章第一時間推出
相關文章
相關標籤/搜索