七張圖解鎖 Mybatis 整體脈絡,讓你輕鬆拿捏面試官
本文筆者計劃從全局角度來對 Mybatis 的整體架構及進行一次回顧和總結,希望能幫助你更加透徹的理解 Mybatis。
1 前言
MyBatis
是一款ORM
(Object-Relational Mapping
)框架,其主要用於將Java
對象與關係數據庫之間進行映射,憑藉其輕量性、穩定性以及廣泛的開源社區其受到了廣大開發者的追捧。
那MyBatis
爲我們做了哪些事情呢?其實,總結來看主要有如下幾點:
-
SQL 映射配置:
MyBatis
使用XML
或註解配置文件來定義SQL
查詢、插入、更新和刪除操作,以及與數據庫表之間的映射關係。這使得開發者能夠將SQL
語句與Java
代碼分離,提高了代碼的可維護性。 -
動態 SQL:
MyBatis
支持動態SQL
,允許根據不同的條件生成不同的SQL
語句。這使得構建複雜的查詢變得更加靈活和方便。 -
參數映射:
MyBatis
能夠將Java
對象的屬性與 SQL 語句中的參數進行映射,無需手動編寫繁瑣的參數傳遞代碼。 -
結果集映射:
MyBatis
支持將SQL
查詢結果映射到Java
對象,自動將數據庫表中的列值賦給 Java 對象的屬性,大大簡化了數據的讀取和處理。 -
事務管理:
MyBatis
可以與Java
的事務管理框架(如Spring
)無縫集成,確保數據庫操作的原子性和一致性。 -
連接池集成:
MyBatis
可以與常見的Java
連接池庫(如Apache DBCP、C3P0、HikariCP
)集成,以管理數據庫連接的獲取和釋放。 -
二級緩存:
MyBatis
支持二級緩存,可以在多個會話之間共享數據,提高性能。
知曉了MyBatis
的功能特性後,接下來讓我們一起來看看MyBatis
內部是通過哪些組件來支撐起這些功能的。
2 總覽MyBatis
對於Mybatis
的架構大致可以分爲三層:基礎支持層、核心處理層和接口層。
或許,你會覺得上圖過於複雜,難以理解。如果此刻你也有這樣的疑惑,不要慌。不妨跟着筆者思路來進行梳理。
首先,使用MyBatis
概括來看大致包括如下幾步:
-
定義接口,配置相關的
xml
文件信息 -
加載接口的配置文件,解析相關配置文件
-
生成接口代理類,執行相關
sql
由於在使用MyBatis
過程中會編寫相關的配置
文件,所以Mybatis
內部必然需要相應組件來支撐配置文件的解析,這些也就構成了底層的基礎支撐層
。既然會解析配置文件,那是不是必然會涉及到資源加載、配置解析
等模塊?
進一步,當配置文件解析完成後,下一步就是生成代理
,然後執行sql
,此時所涉及的也就是核心處理層
中的sql執行,sql解析
等。更進一步,執行sql
過程中爲了避免Connection
頻繁創建,是不是需要對連接進行池化
操作?所以MyBatis
內部會抽象出一個數據源
模塊來統一管理連接。
除此之外,對於sql
執行過程中的事務
是不是也需要控制?所以MyBatis
還有事務管理模塊
來對sql
執行過程中的事務
進行管理。
事實上,你只需要記住Mybatis
的使用過程爲:定義接口,提供配置文件,而後生成代理,執行Sql
即可。以此進行發散,自然而然能擴展出上圖所示內容,根本沒必要死記硬背。
熟悉了MyBatis
的整體架構後,我們接下來看Mybatis
內部執行sql
的大致流程:
接下來,我們將主要圍繞這張圖中內容進行總結分析。
3 配置文件解析
配置文件解析過程大致如下所示:
事實上,MyBatis
內部對於配置文件解析的過程可以概括如下:
-
加載配置文件:MyBatis 首先加載主配置文件(通常是
mybatis-config.xml
),並創建一個Configuration
對象來表示整個 MyBatis 配置。 -
解析主配置文件:MyBatis 使用 XML 解析器解析主配置文件,該文件包含了關於數據源、插件、類型別名、緩存等全局配置信息。這些配置會被存儲在
Configuration
對象中。
而參與配置文件解析的都繼承與BaseBuilder
,其體系結構如下所示:
-
XMLStatementBuilder
:這個類用於解析映射文件中的<select>
、<insert>
、<update>
和<delete>
等標籤,構建與 SQL 語句相關的對象(如MappedStatement
),包括 SQL 語句的解析、參數映射、結果映射等。 -
XMLMapperBuilder
:XMLMapperBuilder
用於解析映射文件(通常是Mapper.xml
文件),負責構建與映射文件相關的對象,包括映射文件的解析、SQL 語句的構建、參數映射、結果映射、緩存配置等。 -
XMLConfigBuilder
:XMLConfigBuilder
用於解析主配置文件(通常是mybatis-config.xml
文件),負責構建與全局配置相關的對象,包括數據源配置、類型別名配置、插件配置、緩存配置等。
總結來看,對於MyBatis
的加載過程來說,其在處理配置文件信息時,首先,會傳遞配置文件所在位置信息,然後再調用框架提供的SqlSessionFactory
的build
方法便會根據傳入路徑信息去加載相關的配置文件,並進行解析。而解析的內容會存放到的configuration
之中,進而方便後續組件的使用。
4 代理構建
當配置文件解析,下一步就是通過SqlSession
的getMapper
方法來構建一個接口對應的代理類,這一過程大致如下:
這一過程中涉及的組件主要包括MapperProxyFactory、MapperRegistry、MapperProxy
,更加詳細的分析可參考 Mybatis 流程分析 (六): Mybatis 中方法和 sql 語句的橋樑——MapperProxy, 總之這一過程的本質就是通過Jdk
動態代理的方式返回一個實現接口
的實例對象
- 傳送門:https://juejin.cn/post/7273434821807947811
5sql
執行
當配置文件解析完成,接口相應的代理類構建完畢後,下一步要做的就是sql
的執行,這一過程邏輯大致如下所示:
這一部分的底層邏輯就是原生JDBC
操縱數據庫的那一套邏輯,即
-
創建 SQL 語句:即創建
Statement
、PreparedStatement
或CallableStatement
對象,分別用於執行不同類型的SQL
語句。 -
執行 SQL 查詢:使用創建的
Statement
或PreparedStatement
對象來執行 SQL 查詢。 -
處理查詢結果:通過
ResultSet
對象來處理查詢的結果數據。
6 總結
最後,我們再來一下Mybatis
內部對於sql
執行的大致步驟:
-
創建 SqlSessionFactory:使用
Mybatis
首先需要創建一個SqlSessionFactory
對象,這通常通過讀取MyBatis
的主配置文件(mybatis-config.xml
)並使用SqlSessionFactoryBuilder
來實現。SqlSessionFactory
負責創建數據庫連接和SqlSession
對象。 -
創建 SqlSession:通過
SqlSessionFactory
創建一個SqlSession
對象。SqlSession
代表了與數據庫的一次會話,它可以執行SQL
操作並管理數據庫連接。通常,每個線程都會創建自己的SqlSession
。 -
執行 SQL 語句:在
SqlSession
中,通過調用方法執行SQL
語句。MyBatis
支持多種方式來執行 SQL,包括selectOne()
、selectList()
、insert()
、update()
、delete()
等方法。 -
SQL 語句解析:
MyBatis
會解析SQL
語句,包括動態SQL
,參數映射和結果映射。這包括了將Java
對象轉化爲SQL
語句中的參數,以及將查詢結果映射回Java
對象。 -
執行
SQL
:MyBatis
將SQL
語句發送到數據庫,並執行相應的操作,如查詢、插入、更新或刪除。數據庫返回結果或受影響的行數,這取決於SQL
語句的類型。 -
處理結果:
MyBatis
最終會將SQL
的執行結果映射爲Java
對象,然後返回給調用者。映射過程通常基於映射文件中的配置。結果集的處理包括將數據庫查詢結果映射爲Java
對象的屬性值。
進一步,上述步驟可總結概括總結爲如下的流程。
作者:毅航
來源:juejin.cn/post/7283798251403821056
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/kuZ_PNxSJb9MNSxX6XDmGw