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

Mybatis的核心組件

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


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

注意 不管是映射器仍是SqlSession均可以發送Sql到數據庫中執行。java

Mybatis組件的生命週期

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

  • 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的 關閉而廢棄它