前面我們學(xué)習(xí)了mybatis的基本用法祝峻,但是作為優(yōu)秀的開發(fā)者不能止步于用,要"知其然,知其所以然"莱找。本系列博文將對mybatis源碼進(jìn)行深入剖析酬姆,讓其深刻的理解mybatis內(nèi)部的運(yùn)行機(jī)制。
一奥溺、mybatis架構(gòu)簡介
以上是mybatis的基礎(chǔ)架構(gòu)圖辞色,下面針對圖中的眾多的組件進(jìn)行簡單的介紹。
1浮定、引導(dǎo)層
- 引導(dǎo)層主要是關(guān)于myabtis的配置相關(guān)相满,mybatis提供了兩種方式進(jìn)行配置:一種是采用硬編碼方式,基于Java API完成的桦卒;一種是基于xml配置方式完成的立美。由于硬編碼受靈活性限制,實(shí)際運(yùn)用中通常是使用xml的配置方法對myabtis進(jìn)行配置闸盔。
2悯辙、基礎(chǔ)支持層
- 該層包含整個mybatis的基礎(chǔ)模塊琳省,這些模塊為核心處理層的功能提供了良好的支撐
(1)反射模塊
myabtis提供了反射模塊迎吵,該模塊對java原生的反射進(jìn)行了良好的封裝,提供了更加簡潔易用的API针贬,同時對反射進(jìn)行了一系列的優(yōu)化击费,比如緩存了類的元數(shù)據(jù)。
(2)類型轉(zhuǎn)換模塊
類型轉(zhuǎn)換功能之一就是為簡化配置文件提供了別名機(jī)制桦他;類型轉(zhuǎn)換另一個功能就是實(shí)現(xiàn)JDBC與JAVA類之間的轉(zhuǎn)換(在sql語句綁定參數(shù)與映射結(jié)果集時候涉及比較多)
(3)日志模塊
集成眾多的第三方日志框架
(4)資源加載模塊
資源加載模塊主要是對類加載器進(jìn)行了封裝蔫巩,確定類加載器的使用順序,并提供了加載文件以及其他資源文件的功能
(5)解析器模塊
解析器模塊主要提供了兩個功能:一個是對xpath的封裝快压,解析config和mapper配置文件圆仔;另一個是提供處理動態(tài)的sql語句中的占位符號的支持
(6)數(shù)據(jù)源模塊
提供了相應(yīng)的數(shù)據(jù)源實(shí)現(xiàn),同時提供了與第三方數(shù)據(jù)源集成的接口
(7)事物管理
mybatis對數(shù)據(jù)庫的事物做了抽象蔫劣,其自身提供了相應(yīng)的事務(wù)接口和簡單實(shí)現(xiàn)坪郭。但是通常是與spring集成,并由spring框架管理事務(wù)
(8)緩存模塊
mybatis提供了一級和二級緩存脉幢,這兩級緩存是依賴于基礎(chǔ)支持層中的緩存模塊實(shí)現(xiàn)的
(9)binding模塊
mybatis通過binding模塊將用戶自定義的mapper接口與映射配置文件關(guān)聯(lián)起來歪沃,系統(tǒng)可以通過調(diào)用自定義的mappe接口中的方法進(jìn)行執(zhí)行相應(yīng)的sql語句完成數(shù)據(jù)庫操作
3、核心處理層
- 核心處理層是mybatis的核心處理流程嫌松,其中包括mybatis的初始化以及完成一次數(shù)據(jù)庫操作的涉及的全部流程也難怪
(1)配置解析
在mybatis初始化過程中沪曙,會加載config配置文件和mapper映射文件及mapper接口中的注解信息,解析后的配置信息會形成相應(yīng)的對象保存到Configuration中萎羔。然后利用configuration對象創(chuàng)建sqlSessionFactory對象液走,在創(chuàng)建SqlSession對象,進(jìn)而完成數(shù)據(jù)庫的操作。
(2)Sql解析與scripting模塊
mybatis實(shí)現(xiàn)了動態(tài)sql語句的功能缘眶,通過sql語句的解析腻窒,完成動態(tài)靈活sql的需求。mybatis中的scripting模塊會根據(jù)用戶傳入的實(shí)際參數(shù)磅崭,解析映射文件中定義的動態(tài)sql節(jié)點(diǎn)儿子,并形成數(shù)據(jù)庫可執(zhí)行的sql語句。
(3)sql語句執(zhí)行
整個sql語句執(zhí)行過程中比較重要的是Executor砸喻、statementHandler柔逼、ParameterHandler和ResultSetHandler
1、Executor主要負(fù)責(zé)一級緩存和二級緩存及事物相關(guān)操作割岛,并將數(shù)據(jù)庫相關(guān)操作委托給StatementHandler完成
2愉适、StatementHandler首先通過ParameterHandler完成Sql語句的參數(shù)綁定,然后通過java原生的Statement對象執(zhí)行Sql語句并得到結(jié)果集癣漆,然后通過ResultSetHandler完成結(jié)果集映射维咸,得到結(jié)果對象并返回。
(4)插件
用戶可以通過插件的方式對mybatis進(jìn)行擴(kuò)展惠爽,用戶自定義的插件可以改變mybatis的默認(rèn)行為癌蓖。在使用自定義插件之前需要了解mybatis的內(nèi)部原理,才能編寫出高效婚肆、安全的插件
4租副、接口層
- 接口層核心就是SqlSession接口,該接口定義了Mybatis暴露給應(yīng)用程序使用的API较性。
二用僧、mybatis重要組件分析
上面我們分析了mybatis的架構(gòu),知道了mybatis是由哪些組件組成的以及對組件做了簡單的介紹赞咙。但作為源碼分析责循,上面提高的內(nèi)容并非全部是重點(diǎn),mybatis框架中重點(diǎn)要關(guān)注的其實(shí)就10幾個類攀操,好好理解這10幾個類院仿,然后做一個串聯(lián),理清運(yùn)行流程崔赌,基本就能讀懂mybatis原理了意蛀。下面我將重點(diǎn)羅列出要關(guān)注的類:
SqlSession:作為MyBatis工作的主要頂層API,表示和數(shù)據(jù)庫交互的會話健芭,完成必要數(shù)據(jù)庫增刪改查功能县钥;
Executor:MyBatis執(zhí)行器,是MyBatis 調(diào)度的核心慈迈,負(fù)責(zé)SQL語句的生成和查詢緩存的維護(hù)若贮;
StatementHandler:封裝了JDBC Statement操作省有,負(fù)責(zé)對JDBC statement 的操作,如設(shè)置參數(shù)谴麦、將Statement結(jié)果集轉(zhuǎn)換成List集合蠢沿。
ParameterHandler:負(fù)責(zé)對用戶傳遞的參數(shù)轉(zhuǎn)換成JDBC Statement 所需要的參數(shù);
ResultSetHandler:負(fù)責(zé)將JDBC返回的ResultSet結(jié)果集對象轉(zhuǎn)換成List類型的集合匾效;
TypeHandler:負(fù)責(zé)java數(shù)據(jù)類型和jdbc數(shù)據(jù)類型之間的映射和轉(zhuǎn)換舷蟀;
MappedStatement:MappedStatement維護(hù)了一條<select|update|delete|insert>節(jié)點(diǎn)的封裝;
SqlSource:負(fù)責(zé)根據(jù)用戶傳遞的parameterObject面哼,動態(tài)地生成SQL語句野宜,將信息封裝到BoundSql對象中,并返回魔策;
BoundSql:表示動態(tài)生成的SQL語句以及相應(yīng)的參數(shù)信息匈子;
Configuration:MyBatis所有的配置信息都維持在Configuration對象之中;
參考:
《mybatis技術(shù)內(nèi)幕》