七張圖解鎖 Mybatis 整體脈絡,讓你輕鬆拿捏面試官

本文筆者計劃從全局角度來對 Mybatis 的整體架構及進行一次回顧和總結,希望能幫助你更加透徹的理解 Mybatis。

1 前言

MyBatis是一款ORMObject-Relational Mapping)框架,其主要用於將Java對象與關係數據庫之間進行映射,憑藉其輕量性、穩定性以及廣泛的開源社區其受到了廣大開發者的追捧。

MyBatis爲我們做了哪些事情呢?其實,總結來看主要有如下幾點:

  1. SQL 映射配置MyBatis使用XML或註解配置文件來定義SQL查詢、插入、更新和刪除操作,以及與數據庫表之間的映射關係。這使得開發者能夠將SQL語句與Java代碼分離,提高了代碼的可維護性。

  2. 動態 SQLMyBatis支持動態SQL,允許根據不同的條件生成不同的SQL語句。這使得構建複雜的查詢變得更加靈活和方便。

  3. 參數映射MyBatis能夠將Java對象的屬性與 SQL 語句中的參數進行映射,無需手動編寫繁瑣的參數傳遞代碼。

  4. 結果集映射MyBatis支持將SQL查詢結果映射到Java對象,自動將數據庫表中的列值賦給 Java 對象的屬性,大大簡化了數據的讀取和處理。

  5. 事務管理MyBatis可以與Java的事務管理框架(如Spring)無縫集成,確保數據庫操作的原子性和一致性。

  6. 連接池集成MyBatis可以與常見的Java連接池庫(如Apache DBCP、C3P0、HikariCP)集成,以管理數據庫連接的獲取和釋放。

  7. 二級緩存MyBatis支持二級緩存,可以在多個會話之間共享數據,提高性能。

知曉了MyBatis的功能特性後,接下來讓我們一起來看看MyBatis內部是通過哪些組件來支撐起這些功能的。

2 總覽MyBatis

對於Mybatis的架構大致可以分爲三層:基礎支持層核心處理層接口層。

或許,你會覺得上圖過於複雜,難以理解。如果此刻你也有這樣的疑惑,不要慌。不妨跟着筆者思路來進行梳理。

首先,使用MyBatis概括來看大致包括如下幾步:

  1. 定義接口,配置相關的xml文件信息

  2. 加載接口的配置文件,解析相關配置文件

  3. 生成接口代理類,執行相關sql

由於在使用MyBatis過程中會編寫相關的配置文件,所以Mybatis內部必然需要相應組件來支撐配置文件的解析,這些也就構成了底層的基礎支撐層。既然會解析配置文件,那是不是必然會涉及到資源加載、配置解析等模塊?

進一步,當配置文件解析完成後,下一步就是生成代理,然後執行sql,此時所涉及的也就是核心處理層中的sql執行,sql解析等。更進一步,執行sql過程中爲了避免Connection頻繁創建,是不是需要對連接進行池化操作?所以MyBatis內部會抽象出一個數據源模塊來統一管理連接。

除此之外,對於sql執行過程中的事務是不是也需要控制?所以MyBatis還有事務管理模塊來對sql執行過程中的事務進行管理。

事實上,你只需要記住Mybatis的使用過程爲:定義接口,提供配置文件,而後生成代理,執行Sql 即可。以此進行發散,自然而然能擴展出上圖所示內容,根本沒必要死記硬背。

熟悉了MyBatis的整體架構後,我們接下來看Mybatis內部執行sql的大致流程:

接下來,我們將主要圍繞這張圖中內容進行總結分析。

3 配置文件解析

配置文件解析過程大致如下所示:

事實上,MyBatis內部對於配置文件解析的過程可以概括如下:

  1. 加載配置文件:MyBatis 首先加載主配置文件(通常是mybatis-config.xml),並創建一個Configuration對象來表示整個 MyBatis 配置。

  2. 解析主配置文件:MyBatis 使用 XML 解析器解析主配置文件,該文件包含了關於數據源、插件、類型別名、緩存等全局配置信息。這些配置會被存儲在Configuration對象中。

而參與配置文件解析的都繼承與BaseBuilder,其體系結構如下所示:

其中

  1. XMLStatementBuilder :這個類用於解析映射文件中的 <select><insert><update><delete> 等標籤,構建與 SQL 語句相關的對象(如 MappedStatement),包括 SQL 語句的解析、參數映射、結果映射等。

  2. XMLMapperBuilderXMLMapperBuilder 用於解析映射文件(通常是 Mapper.xml 文件),負責構建與映射文件相關的對象,包括映射文件的解析、SQL 語句的構建、參數映射、結果映射、緩存配置等。

  3. XMLConfigBuilderXMLConfigBuilder 用於解析主配置文件(通常是 mybatis-config.xml 文件),負責構建與全局配置相關的對象,包括數據源配置、類型別名配置、插件配置、緩存配置等。

總結來看,對於MyBatis的加載過程來說,其在處理配置文件信息時,首先,會傳遞配置文件所在位置信息,然後再調用框架提供的SqlSessionFactorybuild方法便會根據傳入路徑信息去加載相關的配置文件,並進行解析。而解析的內容會存放到的configuration之中,進而方便後續組件的使用。

4 代理構建

當配置文件解析,下一步就是通過SqlSessiongetMapper方法來構建一個接口對應的代理類,這一過程大致如下:

這一過程中涉及的組件主要包括MapperProxyFactory、MapperRegistry、MapperProxy,更加詳細的分析可參考 Mybatis 流程分析 (六): Mybatis 中方法和 sql 語句的橋樑——MapperProxy, 總之這一過程的本質就是通過Jdk動態代理的方式返回一個實現接口的實例對象

  • 傳送門:https://juejin.cn/post/7273434821807947811

5sql執行

當配置文件解析完成,接口相應的代理類構建完畢後,下一步要做的就是sql的執行,這一過程邏輯大致如下所示:

這一部分的底層邏輯就是原生JDBC操縱數據庫的那一套邏輯,即

  1. 創建 SQL 語句:即創建StatementPreparedStatementCallableStatement對象,分別用於執行不同類型的SQL語句。

  2. 執行 SQL 查詢:使用創建的StatementPreparedStatement對象來執行 SQL 查詢。

  3. 處理查詢結果:通過ResultSet對象來處理查詢的結果數據。

6 總結

最後,我們再來一下Mybatis內部對於sql執行的大致步驟:

  1. 創建 SqlSessionFactory:使用Mybatis首先需要創建一個 SqlSessionFactory 對象,這通常通過讀取MyBatis 的主配置文件(mybatis-config.xml)並使用 SqlSessionFactoryBuilder 來實現。SqlSessionFactory 負責創建數據庫連接和 SqlSession 對象。

  2. 創建 SqlSession:通過 SqlSessionFactory 創建一個 SqlSession 對象。SqlSession 代表了與數據庫的一次會話,它可以執行 SQL 操作並管理數據庫連接。通常,每個線程都會創建自己的 SqlSession

  3. 執行 SQL 語句:在 SqlSession 中,通過調用方法執行 SQL 語句。MyBatis 支持多種方式來執行 SQL,包括 selectOne()selectList()insert()update()delete() 等方法。

  4. SQL 語句解析MyBatis 會解析 SQL 語句,包括動態 SQL,參數映射和結果映射。這包括了將 Java 對象轉化爲 SQL 語句中的參數,以及將查詢結果映射回Java對象。

  5. 執行 SQLMyBatisSQL 語句發送到數據庫,並執行相應的操作,如查詢、插入、更新或刪除。數據庫返回結果或受影響的行數,這取決於SQL語句的類型。

  6. 處理結果MyBatis 最終會將SQL的執行結果映射爲 Java 對象,然後返回給調用者。映射過程通常基於映射文件中的配置。結果集的處理包括將數據庫查詢結果映射爲 Java 對象的屬性值。

進一步,上述步驟可總結概括總結爲如下的流程。

作者:毅航

來源:juejin.cn/post/7283798251403821056

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/kuZ_PNxSJb9MNSxX6XDmGw