5.API詳解
Dao 中需要通過 SqlSession 對象來操作 DB。而 SqlSession 對象的創建,
需要其工廠對象 SqlSessionFactory。SqlSessionFactory 對象,
需要通過其構建器對象 SqlSessionFactoryBuilder 的 build()方法,在加載了主配置文件的輸入流對象後創建
a)Resource類
Resources 類,顧名思義就是資源,用於讀取資源文件。其有很多方法通過加載並解析 資源文件,返回不同類型的 IO 流對象。
b)SqlSessionFactoryBuilder
SqlSessionFactory 的創建,需要使用 SqlSessionFactoryBuilder 對象的 build()方法。由於
SqlSessionFactoryBuilder 對象在創建完工廠對象後,就完成了其歷史使命,即可被銷毀。
所以,一般會將該 SqlSessionFactoryBuilder 對象創建為一個方法內的局部對象,方法結束,對象銷毀。
c)SqlSessionFactoy接口
SqlSessionFactory 接口對象是一個重量級對象(系統開銷大的對象),是線程安全的,所 以一個應用只需要一個該對象即可。創建 SqlSession 需要使用 SqlSessionFactory 接口的的 openSession()方法。
- openSession(true):創建一個有自動提交功能的 SqlSession
- openSession(false):創建一個非自動提交功能的 SqlSession,需手動提交
- openSession():同 openSession(false)
d)SqlSession接口
SqlSession 接口對象用於執行持久化操作。一個 SqlSession 對應著一次數據庫會話,
一次會話以 SqlSession 對象的創建開始,以 SqlSession 對象的關閉結束。
SqlSession 接口對象是線程不安全的,所以每次數據庫會話結束前,需要馬上調用其 close()方法,將其關閉。
再次需要會話,再次創建。而在關閉時會判斷當前的 SqlSession 是
若已被提交,則直接將 SqlSession 關閉。 所以,SqlSession 無需手工回滾。
SqlSession 封裝了 各種 CRUD方法,當調用這些方法時,會去mapper.xml映射文件中去找相應標簽下的SQL語句
e)源碼分析
A、輸入流的關閉
在輸入流對象使用完畢後,不用手工進行流的關閉。因為在輸入流被使用完畢後,
SqlSessionFactoryBuilder 對象的build() 方法會自動將輸入流關閉
B、SqlSession的創建
無參的openSession()方法,將事務的自動提交直接賦值為false。
而所謂創建SqlSession,就是加載了主配置文件,創建了一個執行器對象(將來用於執行映射文件中的SQL語句)
初始化了一個DB數據被修改的標誌變量dirty,關閉了事務的自動提交功能
C、增刪改的執行
對於SqlSession的insert()、delete()、uodate()方法,其底層均是調用了update方法
從源碼可知,無論執行增、刪還是改,均是對數據進行修改,均將dirty變量設置為true
且在獲取到映射文件中指定id的SQL語句後,由執行器executor執行
D、SqlSession的提交 commit()
執行了SqlSession的更新,dirty變量的值發生了變化,表示數據被修改了,此時進行SqlSeesion的提交,
才會順利的讓事務進行提交,在沒有更新的情況下,是不會提交的
執行SqlSession的無參commit()方法,最終會將事務進行提交
E、SqlSession的關閉
執行了SqlSession的更新,dirty變量的值發生了變化,表示數據被修改了,此時進行SqlSeesion的關閉,
才會進行事務的回滾,恢復數據
若沒有執行SqlSession的更新,dirty的值沒有改變,
在SqlSession進行關閉時,會將事務回滾後關閉。所以,對於MyBatis程序,無需通過顯示地對SqlSession進行回滾
所以:dirty變量是一個很關鍵的變量,它決定了 事務是否進行提交和回滾
5.API詳解