1. 程式人生 > >mybatis 原始碼解析之 session

mybatis 原始碼解析之 session

介紹

該部分程式碼位於 org.apache.ibatis.session 包。覆蓋了由讀取配置之後,到建立一個 SqlSession 的過程。

簡化流程

SqlSessionManager 根據 Reader、InputStream 用 SqlSessionFactoryBuilder 建立 SqlSessionFactory 物件

XMLConfigBuilder 從 Reader 或 InputStream 讀取 xml 配置,解析之後,建立 Configuration 物件

SqlSessionFactoryBuilder 讀取配置 Configuration 建立 SqlSessionFactory,

SqlSessionFactory 根據不同的引數(autoCommit,ExecutorType,TransactionIsolationLevel,Connection)建立不同型別的 SqlSession,DefaultSqlSessionFactory 是 SqlSessionFactory 的預設實現,DefaultSqlSession 是 SqlSession 的預設實現。其中包括

  1. 建立用 TransactionFactory 建立 Transaction
  2. 建立執行器 BatchExecutor,ReuseExecutor、SimpleExecutor 或 CachingExecutor
  3. 建立 SqlSession

SqlSession 執行相應的 sql 語句,Executor 執行具體的 sql 語句,其中:

  1. executor.query 為 select 操作
  2. executor.update 為 update 操作
  3. executor.update 為 delete 操作
  4. executor.commit 為 commit 操作
  5. executor.rollback 為 rollback 操作
  6. executor.flushStatements 為 flush 操作

更具體的流程

根據 Reader、InputStream 用 SqlSessionFactoryBuilder 建立 SqlSessionFactory 物件

  public static SqlSessionManager newInstance(Reader reader) {
    return new SqlSessionManager(new SqlSessionFactoryBuilder().build(reader, null, null));
  }


  public static SqlSessionManager newInstance(InputStream inputStream) {
    return new SqlSessionManager(new SqlSessionFactoryBuilder().build(inputStream, null, null));
  }

以 InputStream 或 Reader 的形式讀配置檔案

Inputstream inputStream= Resources.getResourceAsStream("mybatis-config.xml");

將 InputStream 或 Reader 解析為 Configuration 物件

XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);

XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);

根據 Configuration 建立 SqlSessionFactory 物件 DefaultSqlSessionFactory

SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
  }

根據 SqlSessionFactory 建立 SqlSession 物件 DefaultSqlSession

      final Environment environment = configuration.getEnvironment();
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      final Executor executor = configuration.newExecutor(tx, execType);
      new DefaultSqlSession(configuration, executor, autoCommit);

SqlSessionManager

用 SqlSessionFactoryBuilder 建立 SqlSessionFactory,之後建立 SqlSession

SqlSessionFactoryBuilder

通過 Reader,InputStream,Configuration 建立 SqlSessionFactory

SqlSessionFactory

介面類,預設實現 DefaultSqlSessionFactory,建立 SqlSession 的工廠。支援各種引數,比如 自動提交,事物隔離級別等。

  SqlSession openSession();

  SqlSession openSession(boolean autoCommit);
  SqlSession openSession(Connection connection);
  SqlSession openSession(TransactionIsolationLevel level);

  SqlSession openSession(ExecutorType execType);
  SqlSession openSession(ExecutorType execType, boolean autoCommit);
  SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
  SqlSession openSession(ExecutorType execType, Connection connection);

  Configuration getConfiguration();

注:ExecutorType 包括 SIMPLE,REUSE,BATCH

SqlSessionFactory 是 MyBatis的關鍵物件,它是單個數據庫對映關係經過編譯後的記憶體映象。
SqlSessionFactory 物件的例項可以通過 SqlSessionFactoryBuilder 物件來獲得,而SqlSessionFactoryBuildr 則可以從 XML 配置檔案或一個預先定製的 Configuration 的例項構建出SqlSessionFactory 的例項。

每一個 MyBatis 的應用程式都以一個 SqlSessionFactory 物件的例項為核心。SqlSessionFactory 是執行緒安全的,它一旦被建立,應該在應用執行期間都存在。在應用執行期間不要重複建立多次,建議使用單例模式。

DefaultSqlSessionFactory

  1. 從 Configuration 中讀取 Environment
  2. 建立 TransactionFactory,並建立新的事務 Transaction
  3. 根據 事務和執行型別,建立一個執行器 Executor
  4. 根據配置,執行器,是否自動提交,建立一個 SqlSession

SqlSession

介面類,預設實現 DefaultSqlSession ,對 sql 語句的封裝,select,insert,delete,update,commit,rollback 等。

每個執行緒一個,避免將跨執行緒共享使用完必須在 finally 中 close

通過 Executor 來說執行相應的 sql 語句(query,upate,commit,rollback)

總結

session 部分比較簡單,就是 Manger -> FactoryBuilder -> Factory -> Session 的套路。

具體的 sql 執行依賴執行器 Executor,下一個主題 Executor。