Mybatis框架學習(一)——核心組件

Mybatis的核心組件

Mybatis的核心組件分爲4個部分:
SqlSessionFactoryBuilder(構造器): 它會根據配置或者代碼來生成SqlSessionFactory,採用的是分步構建的Builder模式。
SqlSessionFactory(工廠接口): 依靠它來生成SqlSession,使用的是工廠模式。
SqlSession(會話): 一個既可以發送sql執行結果,也可以獲取Mapper的接口。在現有的技術中,一般我們會讓其在業務代碼邏輯代碼中“消失”,而使用的是Mybatis提供的Sql Mapper 接口編程技術,它能提高代碼的可讀性和可維護性。
Sql Mapper(映射器): Mybatis新設計存在的組件,它由一個java接口和XML文件或者註解組成,需要給出對應的SQL和映射規則,它負責發送SQL去執行。


配置或代碼
可發送Sql
SqlSessionFactoryBuilder
SqlSessionFactory
SqlSession
Sql Mapper
數據庫

注意 無論是映射器還是SqlSession都可以發送Sql到數據庫中執行。

Mybatis組件的生命週期

生命週期是組件的重要問題,尤其是在多線程的環境中,比如互聯網應用、socket請求等,而Mybatis也常用於多線程的環境中,錯誤使用會造成嚴重的多線程併發問題。所謂生命週期就是每一個對象應該存活的時間,比如一些對象一次用完後就要關閉,使它們被JAVA虛擬機銷燬,以避免繼續佔用資源,所以我們會根據每一個組件的作用去確定其生命週期。

  • SqlSessionFactoryBuilder
    SqlSessionFactoryBuilder的作用在於創建SqlSessionFactory,創建成功後,SqlSessionFactoryBuilder就失去了作用,所以它只能存在於創建SqlSessionFactory的方法中,而不能讓其長期存在。
  • SqlSessionFactory
    SqlSessionFactory可以被認爲是一個數據庫連接池,它的作用是創建SqlSession接口對象。因爲Mybatis的本質就是Java對數據庫的操作,所以SqlSessionFactory的生命週期存在於整個Mybatis的應用中,所以一旦創建SqlSessionFactory,就要長期保存它,直至不再使用Mybatis應用,所以可以認爲SqlSessionFactory的生命週期就等同於Mybatis的應用週期。
    由於SqlSessionFactory是一個對數據庫的連接池,所以它佔據着數據庫的連接資源。如果創建多個SqlSessionFactory,那麼就存在多個數據庫連接池,這樣不利於對數據庫資源的控制,也會導致數據庫連接資源被消耗光,出現系統宕機的情況,所以儘量避免發生這樣的情況。因此在一般的應用中往往將SqlSessionFactory作爲一個單例,讓它在應用中被共享。
  • SqlSession
    SqlSession相當於一個數據庫連接對象(Connection對象),你可以在一個事務裏面執行多條Sql,然後通過它的CommitRollback等方法,提交或者回滾事務。所以它應該存活在一個業務請求中,處理完整個請求後,應該關閉這條連接,將它歸還給SqlSessionFactory,否則數據庫資源會很快被消耗完,系統就會癱瘓,所以用 try…catch…finally… 語句來保證其正確關閉。
  • Mapper
    Mapper是一個接口,它由SqlSession所創建,所以它的最大生命週期最多和SqlSession保持一致,由於SqlSession的關閉,它的數據庫連接資源也會消失。所以它的生命週期是應該 <= SqlSession 的生命週期。Mapper 代表的是一個請求中的業務處理,所以它應該在一個請求中,一旦完成了相關的業務,就應該廢棄它。

. - . - .
. - . - .
. - . - .
SqlSessionFactory
SqlSession 1
SqlSession 2
SqlSession 3
Mapper 1
Mapper 2
Mapper 3
SqlSessionFactory通過

SqlSessionFactoryBuilder

創建,在一個Mybatis中

以單例存在
SqlSession存在於一個請求的過程中,

請求結束後需要關閉它
Mapper代表處理請求中的一個

業務處理步驟,隨着SqlSession的

關閉而廢棄它
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章