MyBatis 創建 SqlSession
對象的過程主要由 SqlSessionFactory
接口及其實現類來完成。以下是詳細步驟:
1. SqlSessionFactory
接口:
SqlSessionFactory
是 MyBatis 的核心接口之一,它負責創建SqlSession
對象。 你可以將SqlSessionFactory
視為SqlSession
的工廠。SqlSessionFactory
接口定義了多個openSession()
方法,用于創建SqlSession
。這些方法提供了不同的選項,例如:
*openSession()
: 使用默認配置(通常是不自動提交事務)。
*openSession(boolean autoCommit)
: 指定是否自動提交事務。
*openSession(ExecutorType execType)
: 指定執行器類型 (SIMPLE, REUSE, BATCH)。
*openSession(TransactionIsolationLevel level)
: 指定事務隔離級別。
*openSession(Connection connection)
: 使用外部提供的數據庫連接。
2. SqlSessionFactoryBuilder
:
SqlSessionFactoryBuilder
是一個構建器類,用于構建SqlSessionFactory
實例。- 它提供了多個
build()
方法,可以通過以下方式構建SqlSessionFactory
:
* 從 XML 配置文件 (mybatis-config.xml
) 構建。
* 從Configuration
對象構建。
* 從InputStream
或Reader
構建。
// 從 XML 配置文件構建 SqlSessionFactory (最常見的方式)
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 從 Configuration 對象構建 SqlSessionFactory
Configuration configuration = new Configuration();
// ... 添加配置信息 ...
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
SqlSessionFactoryBuilder
在構建完SqlSessionFactory
后,其自身的使命就完成了,通常不需要保留它的實例。最佳實踐是在方法內部創建SqlSessionFactoryBuilder
,構建SqlSessionFactory
,然后丟棄SqlSessionFactoryBuilder
。
3. DefaultSqlSessionFactory
(默認實現):
DefaultSqlSessionFactory
是SqlSessionFactory
接口的默認實現類。SqlSessionFactoryBuilder
的build()
方法通常會創建一個DefaultSqlSessionFactory
實例。
4. openSession()
方法 (創建 SqlSession 的核心):
DefaultSqlSessionFactory
的openSession()
方法(及其重載方法)負責創建SqlSession
對象。- 創建
SqlSession
的過程大致如下:
- 獲取 Environment: 從
Configuration
對象中獲取Environment
對象,Environment
對象包含了數據源、事務管理器等信息 - 創建 Transaction: 根據
Environment
中的TransactionFactory
創建Transaction
對象。Transaction
對象負責管理數據庫事務。 - 創建 Executor: 根據配置信息(例如,
defaultExecutorType
設置)和Transaction
對象創建Executor
對象。Executor
負責執行 SQL 語句,并處理緩存。 - 創建 DefaultSqlSession: 創建
DefaultSqlSession
對象,并將Configuration
、Executor
和autoCommit
標志(是否自動提交事務)傳遞給DefaultSqlSession
的構造函數。 - 返回 DefaultSqlSession:
openSession()
方法返回新創建的DefaultSqlSession
對象。// DefaultSqlSessionFactory 的 openSessionFromDataSource() 方法 (簡化版) private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {Transaction tx = null;try {final Environment environment = configuration.getEnvironment();final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);final Executor executor = configuration.newExecutor(tx, execType);return new DefaultSqlSession(configuration, executor, autoCommit);} catch (Exception e) {closeTransaction(tx); // may have fetched a connection so lets call close()throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);} finally {ErrorContext.instance().reset();} }
5. DefaultSqlSession
:
DefaultSqlSession
是SqlSession
接口的默認實現類。- 它包含了執行 SQL 語句、獲取 Mapper 接口實例、管理事務等方法。
DefaultSqlSession
內部持有Configuration
對象、Executor
對象和autoCommit
標志。
總結:
MyBatis 創建 SqlSession
對象的過程如下:
SqlSessionFactoryBuilder
構建SqlSessionFactory
(通常是DefaultSqlSessionFactory
)。- 調用
SqlSessionFactory
的openSession()
方法。 DefaultSqlSessionFactory
創建Transaction
、Executor
和DefaultSqlSession
對象。openSession()
方法返回DefaultSqlSession
對象。
SqlSessionFactory
是 SqlSession
的工廠,DefaultSqlSessionFactory
是 SqlSessionFactory
的默認實現,DefaultSqlSession
是 SqlSession
的默認實現。SqlSessionFactoryBuilder
用于構建 SqlSessionFactory
。