原文:juejin.cn/post/7283798251403821056 本文筆者計劃從全局角度來對Mybatis的整體架構及進行一次回顧和總結,希望能幫助你更加透徹的理解Mybatis。 1、前言 MyBatis是一款ORM(Object-Relational Mapping)框架,其主要用於將 ...
原文:juejin.cn/post/7283798251403821056
本文筆者計劃從全局角度來對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
內部是通過哪些組件來支撐起這些功能的。
推薦一個開源免費的 Spring Boot 實戰項目:
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
動態代理的方式返回一個實現介面
的實例對象
5、sql執行
當配置文件解析完成,介面相應的代理類構建完畢後,下一步要做的就是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
對象的屬性值。
進一步,上述步驟可總結概括總結為如下的流程。
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
覺得不錯,別忘了隨手點贊+轉發哦!