mybatis完整流程分析
- 1、Resource獲取加載全域組態檔
- 2、實體化SQLSessionBuild構造器
- 3、決議組態檔流XMLConfigBuilder
- 4、Configuration所有的配置資訊
- 5、SqlSessionfactory實體化
- 6、Transaction事務管理
- 7、創建executor執行器
- 8、創建SQLSession
- 9、jdk動態代理生成mapper介面的代理物件
- 10、Mapper物件呼叫執行用戶方法
- 11、在執行增刪改查成功的前提下,提交事務,未成功,則需要回滾事務
- 12、關閉SQLSession
1、Resource獲取加載全域組態檔
Resources是ibatis.io包下面的類,也就是一個io流,用于讀寫檔案,通過getResourceAsStream把xml檔案加載進來,把組態檔決議為一個流,

2、實體化SQLSessionBuild構造器
我們首先new了一個SqlSessionFactoryBuilder物件,他是SqlSessionFactory的構建者,

3、決議組態檔流XMLConfigBuilder
我們呼叫了他的build()方法,在utils類中呼叫了build方法,讓我們細查原始碼進去查看到底長什么樣子?

再向下查看,發現在進行xmlConfigBuild

4、Configuration所有的配置資訊
通過呼叫parse()方法決議mybatis組態檔

然后,我們發現parse()決議完成后,他回傳了一個configuration物件,它是用來存放mybatis核心組態檔決議完成后的結果,這個configuration又回傳給誰了呢?繼續看原始碼:

5、SqlSessionfactory實體化
通過上面一步DefaultSqlSessionFactory()才真正獲取到了一個SQLSessionFactory物件,將物件回傳到了我們所撰寫的Utils工具類中的代碼

6、Transaction事務管理
接著我們呼叫openSession獲取SQLSession物件,我們來看看openSession方法里有什么?


看原始碼先看到回傳值是sqlSession,再看看里面有些什么:
Transaction,這很明顯是一個事務,我們都知道sql執行時都要涉及到事務操作的,提交或回滾什么的,而這個transaction產生需要什么引數呢,看原始碼知道里面有個environment(xml中配置的),而且是從configuration中獲得的(之前做的總算沒有白費),通過這些引數transactionFactory就幫我們產生了transaction,
7、創建executor執行器
繼續剖析原始碼觀察發現,接著又創建了一個executor執行器,executor執行器在mybatis中發揮著十分重要的作用,executor,這個名字一看就知道是一個執行器,是個介面(一般用SimpleExecutor來執行,實作類),他是mybatis的核心執行器,相當于jdbc中的statement,發送sql陳述句并執行,
有了這些我們就能得到最后的sqlSession了,

8、創建SQLSession


9、jdk動態代理生成mapper介面的代理物件
主要通過DefaultSqlSession的getMapper()來生成,
首先看一看test類中的方法,通過呼叫了一個getmapper的方法
細查代碼首先到達的是SqlSession.class檔案下的一個介面類
接著查看他的DefaultSqlSession.class介面實作類發現,也是呼叫了一個getMapper的方法,然后回傳了一個物件,讓我們接著向下查看
接著發現到了Configuration.class的檔案下

接著就到了MapperRegistry.class下,可以發現其實是通過mapperRegistry的物件,它里面是一個knownMappers的HashMap,用于存盤組態檔中的mappers標簽的每個mapper介面

這里通過JDK動態代理,幫mapper介面生成代理實作類


10、Mapper物件呼叫執行用戶方法

Mapper物件呼叫方法執行其實走的是MapperProxy的invoke方法

11、在執行增刪改查成功的前提下,提交事務,未成功,則需要回滾事務
12、關閉SQLSession
其實在方法執行的時候還應該有更為詳細的步驟,還要注意快取的的存在,一級快取會自動開啟,二級快取需要手動開啟,在執行方法時首先要查看二級快取中是否有對應的結果,然后查看一級快取后,沒有則再進行資料庫訪問,接著關閉資料庫連接,回傳到資料庫池中,然后取到了結果就需要執行最后一步關閉SqlSession,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289348.html
標籤:其他
