Mybatis的核心組件
Mybatis的核心組件分爲4個部分:
SqlSessionFactoryBuilder(構造器): 它會根據配置或者代碼來生成SqlSessionFactory,採用的是分步構建的Builder模式。
SqlSessionFactory(工廠接口): 依靠它來生成SqlSession,使用的是工廠模式。
SqlSession(會話): 一個既能夠發送sql執行結果,也能夠獲取Mapper的接口。在現有的技術中,通常咱們會讓其在業務代碼邏輯代碼中「消失」,而使用的是Mybatis提供的Sql Mapper 接口編程技術,它能提升代碼的可讀性和可維護性。
Sql Mapper(映射器): Mybatis新設計存在的組件,它由一個java接口和XML文件或者註解組成,須要給出對應的SQL和映射規則,它負責發送SQL去執行。html
注意 不管是映射器仍是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,而後經過它的Commit,Rollback等方法,提交或者回滾事務。因此它應該存活在一個業務請求中,處理完整個請求後,應該關閉這條鏈接,將它歸還給SqlSessionFactory,不然數據庫資源會很快被消耗完,系統就會癱瘓,因此用 try…catch…finally… 語句來保證其正確關閉。
- Mapper
Mapper是一個接口,它由SqlSession所建立,因此它的最大生命週期最多和SqlSession保持一致,因爲SqlSession的關閉,它的數據庫鏈接資源也會消失。因此它的生命週期是應該 <= SqlSession 的生命週期。Mapper 表明的是一個請求中的業務處理,因此它應該在一個請求中,一旦完成了相關的業務,就應該廢棄它。