1. 程式人生 > >Mybatis框架學習(一)——核心元件

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

Mybatis的核心元件

Mybatis的核心元件分為4個部分:
SqlSessionFactoryBuilder(構造器): 它會根據配置或者程式碼來生成SqlSessionFactory,採用的是分步構建的Builder模式。
SqlSessionFactory(工廠介面): 依靠它來生成SqlSession,使用的是工廠模式。
SqlSession(會話): 一個既可以傳送sql執行結果,也可以獲取Mapper的介面。在現有的技術中,一般我們會讓其在業務程式碼邏輯程式碼中“消失”,而使用的是Mybatis提供的Sql Mapper 介面程式設計技術,它能提高程式碼的可讀性和可維護性。
Sql Mapper(對映器):

Mybatis新設計存在的元件,它由一個java介面和XML檔案或者註解組成,需要給出對應的SQL和對映規則,它負責傳送SQL去執行。

配置或程式碼可傳送SqlSqlSessionFactoryBuilderSqlSessionFactorySqlSessionSql 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 代表的是一個請求中的業務處理,所以它應該在一個請求中,一旦完成了相關的業務,就應該廢棄它。
. - . - .. - . - .. - . - .SqlSessionFactorySqlSession 1SqlSession 2SqlSession 3Mapper 1Mapper 2Mapper 3SqlSessionFactory通過
SqlSessionFactoryBuilder
建立,在一個Mybatis中
以單例存在
SqlSession存在於一個請求的過程中,
請求結束後需要關閉它
Mapper代表處理請求中的一個
業務處理步驟,隨著SqlSession的
關閉而廢棄它