1. 程式人生 > >5.API詳解

5.API詳解

ces 沒有 pen update 源文件 open 成了 delete 關閉

Dao 中需要通過 SqlSession 對象來操作 DB。而 SqlSession 對象的創建,

需要其工廠對象 SqlSessionFactorySqlSessionFactory 對象,

需要通過其構建器對象 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詳解