Mybatis執行SQL的流程
阿新 • • 發佈:2020-11-17
SqlSession :
SqlSession是一個介面,它有兩個實現類:DefaultSqlSession (預設)和
SqlSessionManager (棄用,不做介紹)
SqlSession是MyBatis中用於和資料庫互動的頂層類,通常將它與ThreadLocal繫結,一個會話使用一 個
SqlSession,並且在使用完畢後需要close (SqlSession是執行緒不安全的,因此我們使用完後要記得close)
public class DefaultSqlSession implements SqlSession { private final Configuration configuration; private final Executor executor; //SqlSession中的兩個最重要的引數,configuration與初始化時的相同,Executor為執行器 //...... }
Executor :
Executor也是一個介面,他有三個常用的實現類:
BatchExecutor (重用語句並執行批量更新)
ReuseExecutor (重用預處理語句 prepared statements)
SimpleExecutor (普通的執行器,預設)
原始碼分析:
1. SqlSession sqlSession = sqlSessionFactory.openSession();
// 1. 讀取配置檔案,讀成位元組輸入流,注意:現在還沒解析 InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2. 解析配置檔案,封裝Configuration物件 建立DefaultSqlSessionFactory物件 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); // 3. 生產了DefaultSqlsession例項物件 設定了事務不自動提交 完成了executor物件的建立 SqlSession sqlSession = sqlSessionFactory.openSession();
//進入openSession方法 @Override public SqlSession openSession() { //getDefaultExecutorType()傳遞的是SimpleExecutor //第一個引數:當前預設執行器的型別 //第二個引數:資料庫的隔離級別 //第三個引數:是否自動提交事務 return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false); } //configuration.getDefaultExecutorType() --- 當前預設執行器的型別 public ExecutorType getDefaultExecutorType() { return defaultExecutorType; } protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;
//進入openSessionFromDataSource。
//ExecutorType 為Executor的型別,TransactionIsolationLevel為事務隔離級別,autoCommit是否開啟事務
//openSession的多個過載方法可以指定獲得的SeqSession的Executor型別和事務的處理
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
Transaction tx = null;
try {
// 獲得 Environment (執行環境)物件
final Environment environment = configuration.getEnvironment();
// 建立 Transaction (事務)物件
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
// 建立 Executor 物件
final Executor executor = configuration.newExecutor(tx, execType);
// 建立 DefaultSqlSession 物件
return new DefaultSqlSession(configuration, executor, autoCommit);
} catch (Exception e) {
// 如果發生異常,則關閉 Transaction 物件
closeTransaction(tx); // may have fetched a connection so lets call close()
throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}
這一步我們就完成了SqlSession物件的建立