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
。