在使用mybatis時我們一般通過繼承SqlSessionDaoSupport然后使用getSqlSession獲取數據庫連接,進行數據庫相關操作。我們查看getSqlSession方法可以看出,這個方法其實是返回了一個SqlSessionTemplate對象。
接著我們進入SqlSessionTemplate的構造器中看看,最終發現最終調用的都是如下構造器。
根據代碼我們可以看到,最終生成的是一個sqlSession的動態代理sqlSessionProxy。根據動態代理構造我們可以很容易的看出,最終數據庫相關操作都封裝在SqlSessionInterceptor的invoke方法中。我們進invoke方法中看看。
在invoke方法中我們可以看到,改代理類并無對原有方法做過多包裝。只是封裝了相關事物操作。具體執行順序如下:
1. 獲取數據庫鏈接,處理相關sql操作
2. 如果數據庫操作有相應事物,則提交事物
3. 若2發生異常則回滾數據庫操作,并關閉連接
4. 第四步一定執行,如果數據庫鏈接沒有關閉,則關閉數據庫鏈接