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 的預設實現。其中包括
- 建立用 TransactionFactory 建立 Transaction
- 建立執行器 BatchExecutor,ReuseExecutor、SimpleExecutor 或 CachingExecutor
- 建立 SqlSession
SqlSession 執行相應的 sql 語句,Executor 執行具體的 sql 語句,其中:
- executor.query 為 select 操作
- executor.update 為 update 操作
- executor.update 為 delete 操作
- executor.commit 為 commit 操作
- executor.rollback 為 rollback 操作
- 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
- 從 Configuration 中讀取 Environment
- 建立 TransactionFactory,並建立新的事務 Transaction
- 根據 事務和執行型別,建立一個執行器 Executor
- 根據配置,執行器,是否自動提交,建立一個 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。