有什么做房屋装修的网站合肥网站建设方案托管
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。
