mybatis初始化分析二之SqlSession

我們知道通過初始化了SqlSessionFactory之后可以實例化出一個默認的DefaultSqlSessionFactory。那么通過這個全局唯一的單利工廠,可以生成我們每次需要使用的sqlsession會話實例

源碼分析如下:

1

我們知道sqlSessionFactory接口有以下方法

2

而mybatis默認實現(xiàn)類是DefaultSqlSessionFactory,接下去看一下這個實現(xiàn)類的真面目

3
4

這里簡單說一下,mybatis的三種執(zhí)行器類型

ExecutorType 枚舉類

????SIMPLE:簡易執(zhí)行器,不配置就采用這種

????REUSE:一種執(zhí)行器重用預處理語句

????BATCH:執(zhí)行器重用語句和批量更新,專門針對批量專用的執(zhí)行器

mybatis會根據(jù)執(zhí)行器類型去初始化不同的執(zhí)行器Executor。后面會說明Executor在mybatis執(zhí)行過程中的作用是什么。

繼續(xù)往下看

5


6


7


簡要分析:

? ? 1:通過從環(huán)境中獲取到其中的事物工廠,并通過該事物工廠每次都new一個事物。

? ? 2:通過執(zhí)行器類型初始化不同的執(zhí)行器

? ? 3:初始化DefaultSqlSession

獲取到sqlsession之后,就是調(diào)用sqlsession的getMapper方法去獲取到映射器的實例。

下面重點分析 sqlSession.getMapper(Class class)

8

再繼續(xù)向下看,找到Configuration.getMapper(type, sqlsession);

9


10


11


12


13

下面重點分析這個方法:

? ? 1:簡單分析一下,通過映射器的Class type去knownMappers這個HashMap中找到對應的MapperProxyFactory實例

? ? 2:通過MapperProxyFactory去獲取一個映射器的代理類 mapperProxyFactory.newInstance(sqlsession);

13

該方法分兩步:

? ? 1:首先 new 一個MapperProxy實例出來,這個實例是做什么的呢?繼續(xù)查看MapperProxy的源碼

? ? 2:將該MapperProxy實例作為一個handler去調(diào)用Proxy的newProxyInstance方法。真正生成該映射器的代理類$Proxy0。

14

原來這個MapperProxy實例就是一個InvocationHandler,通過jdk動態(tài)代理會生成一個該映射器的代理類,并在代理類的構(gòu)造函數(shù)中將該handler初始化傳入,最終在這個UserMapper映射器的代理類上執(zhí)行一系列方法時,會最終執(zhí)行該handler的invoke方法,

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容