Mybatis框架分析
摘要
本篇文章只是個人閱讀mybatis源碼總結的經驗或者個人理解mybatis的基本輪廓,作為拋磚引玉的功能,希望對你有幫助,如果需要深入了解細節還需親自去閱讀源碼。
mybatis基本架構
mybatis的源碼應該算是比較容易閱讀的,首先mybatis核心功能就是執行Sql語句,但在其基礎上又有許多增強的地方(動態Sql,ORM等)。看一個框架的時候,第一步是對整個框架有一個大體的了解。例如mybatis,我們可以從初始化到完成一個sql請求為主線,看一下涉及了哪些類。我個人總結了一下,mybatis的框架主要的核心類有4個
Configuration
Configuration就是用於解析、保存、處理Mybatis的配置內容,包括了
mybatis基本配置,例如支持資料庫中的欄位支持下標轉駝峰mapUnderscoreToCamelCase=true等等,參看Mybatis配置說明
SqlMapper管理,也就是通過xml或者註解寫的一些sql映射。相關的類可以查看源碼中MappedStatement類。
創建類,Configuration還有一些創建類的功能,例如Executor、StatementHandler。這個2個類後面還會說到
小節Configuration
總結Configuration的功能,當然,如何讀取和解析相關文件是Configuration中大部分代碼做的事。這些都是為了準備後面mybatis運行的基本條件。Configuration中創建類是因為創建的這些類都依賴於Configuration(但這樣做數據和邏輯沒有做到分離)。
SqlSession
SqlSession可能是mybatis中我們最常用的類,其實他是一個門面類,直接對外提供服務
這些方法都是直接提供給外部調用的。看到這些方法是不是很親切。(我個人在看源碼的時候看到一些自己用過的一些類或方法的時候都有種莫名的親近感。感覺終於和我的認知世界有交集了)
SqlSession的創建
SqlSessionFactor是用於創建SqlSession建造者,提供給外部快速創建一個SqlSession。是一個工廠類,而SqlSessionFactor的創建則是由SqlSessionFactorBuilder。
Executor
前面說了SqlSession只是一個門面類,Executor才是負責Sql語句執行的。因此Executor才是整個mybatis核心。Executor的實現類有
BaseExecutor:看名字知道是最基礎Executor,其他的Executor都和這個類有一定的關係
CachingExecutor:每次查詢的時候會先從緩存中獲取,每次有增刪改的時候會讓緩存失效。CachingExecutor其實是一個代理內,內部代理了BaseExecutor(或其子類)。在BaseExecutor基礎上增加了緩存操作。
相關類
我們看一個Executor參數最多的一個方法
這些類都對執行Sql有一定關係
MappedStatement
具體點來理解就是我們定義的Sql映射語句,例如我們xml定義的:
paramter
這個就是傳遞給sql映射的參數,用於生成和填充動態sql語句
RowBound
限定一次查詢數據量,類很簡單,看代碼就明白,不多說
ResultHandler
這個和本地緩存有關,用於保存一個查詢語句的緩存對象,下次有相同的查詢語句的時候就會先嘗試從本地緩存中獲取。 注意:
,mybatis有2級緩存,第一級是CachingExecutor,第二級緩存就是mybatis的本地緩存,也就是和ResultHandler
緩存失效策略是和一級緩存一樣,任何增刪改都會清空本地緩存
CacheKey
一個查詢語句的在本地緩存中的key,根據sql語句,參數等等組成
BoundSql
這個對象就是本次實際需要執行的sql語句有關的信息,
如果說parameter參數是實際傳入的參數,那麼BoundSql就是根據傳入參數進行相關解析後的結果。他的創建在MappedStatement中,根據parameter和當前執行MappedStatement生成
Interceptor
Mybatis提供了Interceptor用於在執行Executor之前進行一些操作,mybatis是怎麼使用Interceptor。其實就是在創建Executor時候,會
這裡主要是通過jdk動態代理實現的
這樣在調用Executor的時候就會先判斷是否滿足Interceptor的執行條件,滿足則會先執行Intercepter#intercept()方法
最底層的Handler
要說直接和Jdbc打交道的就是各種Handler類,例如
StatementHandler: 處理java.sql.Statement
ParameterHandler: 向PreparedStatement中設置參數
ResultSetHandler:處理sql執行結果,並轉換成指定的類對象 上面的這些其實都不複雜,所以代碼還是比較好理解的
Transaction
每個Executor生成的時候都會把Transaction傳入,在BaseExecutor中Transaction是其成員變數,那Transaction的作用是什麼呢?
其實之前一直都沒提到過Connect誰來管理,這裡可以看出來,Transaction負責了Connection的獲取,以及對這次Connect的提交和回滾等操作。這個類也是比較好理解的。Executor的commit或者rollback最後都是調用Transaction的
總結
可以看出,mybatis的源碼是比較容易閱讀的(相對於Spring等)。上面介紹了框架中的一些核心類,但是很多細節的地方值得我們去深挖。這個就需要我們能沉下來好好閱讀代碼。
更多IT精品課程,訪問中公優就業官網:http://xue.ujiuye.com
勤工儉學計劃」,給你一個真正0元學習IT技術的機會!
http://www.ujiuye.com/zt/qgjx/?wt.bd=lsh
找工作太難?不是你不行,我們來幫你!
http://www.ujiuye.com/zt/jyfc/?wt.bd=lsh
※關於「工業互聯網平台」建設的闡述
※全站 HTTPS 沒你想像的那麼簡單
※簡要介紹演算法時間複雜度
※細談垃圾收集器及內存管理策略
TAG:IT優就業 |
※Python爬蟲框架之pyspider
※Spring Cache 框架
※python:web框架Falsk知識點總結
※淺談Metasploit框架中的Payload
※SpringMVC + security模塊 框架整合詳解
※Python Web 應用程序 Tornado 框架簡介
※基於Asyncio的Python微框架:Quart
※druid等 olap框架對比分析
※讀 SnapKit和Masonry 自動布局框架源碼
※Apache新成員:LinkedIn分散式數據集成框架Gobblin
※AspectJ 框架 spring 實現 AOP?
※spark入門框架+python
※AI 框架使用排行:TensorFlow、Scikit Learn、IBM Watson、Spark-MLib、Keras
※Coinbase推出新取證框架Dexter
※JFinal框架學習——EhCachePlugin
※Angular.js 發布,Web 前端框架
※RecQ-Python推薦系統框架
※Node.js之express框架
※圍觀丨Google 的 Mobile UI 框架 Flutter Preview 1 發布!
※Wasserstein is all you need:構建無監督表示的統一框架