在使用mybatis時(shí)我們一般通過繼承SqlSessionDaoSupport然后使用getSqlSession獲取數(shù)據(jù)庫(kù)連接,進(jìn)行數(shù)據(jù)庫(kù)相關(guān)操作。我們查看getSqlSession方法可以看出,這個(gè)方法其實(shí)是返回了一個(gè)SqlSessionTemplate對(duì)象。

接著我們進(jìn)入SqlSessionTemplate的構(gòu)造器中看看,最終發(fā)現(xiàn)最終調(diào)用的都是如下構(gòu)造器。

根據(jù)代碼我們可以看到,最終生成的是一個(gè)sqlSession的動(dòng)態(tài)代理sqlSessionProxy。根據(jù)動(dòng)態(tài)代理構(gòu)造我們可以很容易的看出,最終數(shù)據(jù)庫(kù)相關(guān)操作都封裝在SqlSessionInterceptor的invoke方法中。我們進(jìn)invoke方法中看看。

在invoke方法中我們可以看到,改代理類并無對(duì)原有方法做過多包裝。只是封裝了相關(guān)事物操作。具體執(zhí)行順序如下:
1. 獲取數(shù)據(jù)庫(kù)鏈接,處理相關(guān)sql操作
2. 如果數(shù)據(jù)庫(kù)操作有相應(yīng)事物,則提交事物
3. 若2發(fā)生異常則回滾數(shù)據(jù)庫(kù)操作,并關(guān)閉連接
4. 第四步一定執(zhí)行,如果數(shù)據(jù)庫(kù)鏈接沒有關(guān)閉,則關(guān)閉數(shù)據(jù)庫(kù)鏈接