接上一節(jié),在獲取完SqlSessionFactory之后桩盲,我們希望通過SqlSessionFactory得到SqlSession
1. 獲取SqlSession
2. 進(jìn)入DefaultSqlSessionFactory#openSessionFromDataSource
3. 詳細(xì)解答該方法
3.1. 獲取一個Environment實例
這個實例是我們在mybatis-config.xml中進(jìn)行定義的
3.2 獲取一個事務(wù)管理器工廠
這個事物管理器工廠來源于configuration實例中的environtment
3.3 獲取一個事物管理器
事物管理器有兩種:一種是jdbc事務(wù)管理器闰蚕,一種是manage事務(wù)管理器比吭。前者使用了jdbc的提交和回滾設(shè)置逞怨,依賴于數(shù)據(jù)源得到的連接來管理事務(wù)的范圍捌省。后者則是從來不回滾和提交事務(wù)碘橘,他將控制權(quán)轉(zhuǎn)交給容器來完成事務(wù)互订。默認(rèn)情況下他會關(guān)閉連接,因此部分容器不希望關(guān)閉連接的話痘拆,需要設(shè)置closeConnection的屬性值為false仰禽。如果我們使用的是spring容器,那么我們不需要配置mybatis中的事務(wù)管理器纺蛆,因此spring自帶的事務(wù)管理器會覆蓋掉mybatis的配置吐葵。
3.4 創(chuàng)建一個Executor執(zhí)行器
默認(rèn)采用的executor的實例是
如果設(shè)置了開啟一級緩存的話,那么我們程序會繼續(xù)創(chuàng)建一個緩存執(zhí)行器桥氏,然后將之前創(chuàng)建的執(zhí)行器作為緩存執(zhí)行器的一個代理執(zhí)行器温峭。那么當(dāng)我們需要查找數(shù)據(jù)的時候,如果可以利用緩存的話字支,那么就先到緩存執(zhí)行器中尋找數(shù)據(jù)凤藏,如果沒有找到數(shù)據(jù)奸忽,才會交給代理執(zhí)行器去數(shù)據(jù)庫中查找數(shù)據(jù)。
然后將執(zhí)行器丟到攔截器鏈中揖庄,是攔截器有機(jī)會攔截該對象
由此栗菜,完成了一個執(zhí)行器的實例操作。
3.5 打開SqlSession
由此蹄梢,我們完成了整個獲取SqlSession的操作疙筹。