1.3 SqlSessionFactoryBuilder 与 SqlSessionFactory


文档摘要

1.3 SqlSessionFactoryBuilder 与 SqlSessionFactory 1.3 SqlSessionFactoryBuilder 与 SqlSessionFactory 在 MyBatis 的核心架构中, 和 是两个至关重要的组件,它们分别负责构建和管理 MyBatis 的会话工厂。理解它们的作用和关系对于掌握 MyBatis 的使用至关重要。 1.3.1 SqlSessionFactoryBuilder:构建工厂 的主要职责是根据配置信息(通常是 XML 配置文件或 Java 代码)构建 实例。它是一个临时对象,一旦 创建完成,就可以被丢弃。 作用: 读取 MyBatis 的配置信息。 创建 实例。 生命周期: 的生命周期非常短暂。

1.3 SqlSessionFactoryBuilder 与 SqlSessionFactory

1.3 SqlSessionFactoryBuilder 与 SqlSessionFactory

在 MyBatis 的核心架构中,SqlSessionFactoryBuilderSqlSessionFactory 是两个至关重要的组件,它们分别负责构建和管理 MyBatis 的会话工厂。理解它们的作用和关系对于掌握 MyBatis 的使用至关重要。

1.3.1 SqlSessionFactoryBuilder:构建工厂

SqlSessionFactoryBuilder 的主要职责是根据配置信息(通常是 XML 配置文件或 Java 代码)构建 SqlSessionFactory 实例。它是一个临时对象,一旦 SqlSessionFactory 创建完成,就可以被丢弃。

作用:

  • 读取 MyBatis 的配置信息。

  • 创建 SqlSessionFactory 实例。

生命周期:

SqlSessionFactoryBuilder 的生命周期非常短暂。它只在应用程序初始化阶段使用,用于创建 SqlSessionFactory。一旦 SqlSessionFactory 创建完成,SqlSessionFactoryBuilder 就可以被垃圾回收。

构建方式:

SqlSessionFactoryBuilder 提供了多个 build() 方法,用于从不同的配置源构建 SqlSessionFactory。常见的配置源包括:

  • XML 配置文件:build(InputStream inputStream)

  • Java 代码配置:build(Configuration config)

// 从 XML 配置文件构建 SqlSessionFactory InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 从 Java 代码配置构建 SqlSessionFactory Configuration configuration = new Configuration(); // ... 配置 MyBatis SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

代码示例:

import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MyBatisUtil { private static SqlSessionFactory sqlSessionFactory; static { try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("Error initializing SqlSessionFactory. Cause: " + e); } } public static SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } }

详解:

  1. 引入依赖: 确保项目中引入了 MyBatis 的相关依赖。

  2. 加载配置文件: 使用 Resources.getResourceAsStream() 方法加载 mybatis-config.xml 配置文件。

  3. 构建 SqlSessionFactory: 创建 SqlSessionFactoryBuilder 实例,并调用 build() 方法,传入输入流,构建 SqlSessionFactory

  4. 单例模式: 使用静态代码块和静态变量,保证 SqlSessionFactory 在应用程序中只有一个实例,提高性能。

  5. 异常处理: 在静态代码块中进行异常处理,防止初始化失败导致应用程序无法启动。

1.3.2 SqlSessionFactory:会话工厂

SqlSessionFactory 是 MyBatis 的核心接口,它负责创建 SqlSession 实例。SqlSession 提供了执行 SQL 语句、管理事务等功能。

作用:

  • 创建 SqlSession 实例。

  • 管理 MyBatis 的配置信息。

生命周期:

SqlSessionFactory 的生命周期应该与应用程序的生命周期一致。在应用程序启动时创建,在应用程序关闭时销毁。

创建 SqlSession:

SqlSessionFactory 提供了多个 openSession() 方法,用于创建不同类型的 SqlSession 实例。常见的 openSession() 方法包括:

  • openSession():创建默认的 SqlSession 实例,使用默认的事务管理和连接池。

  • openSession(boolean autoCommit):创建 SqlSession 实例,并指定是否自动提交事务。

  • openSession(Connection connection):创建 SqlSession 实例,并使用指定的数据库连接。

  • openSession(TransactionIsolationLevel level):创建 SqlSession 实例,并指定事务隔离级别。

  • openSession(ExecutorType execType):创建 SqlSession 实例,并指定执行器类型。

// 创建 SqlSession 实例 SqlSession sqlSession = sqlSessionFactory.openSession(); // 使用 SqlSession 执行 SQL 语句 try { // ... } finally { sqlSession.close(); // 确保 SqlSession 关闭 }

代码示例:

import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; public class UserMapperTest { public static void main(String[] args) { SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory(); try (SqlSession sqlSession = sqlSessionFactory.openSession()) { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.selectUserById(1); System.out.println(user); } } }

详解:

  1. 获取 SqlSessionFactory: 通过 MyBatisUtil.getSqlSessionFactory() 方法获取 SqlSessionFactory 实例。

  2. 创建 SqlSession: 使用 sqlSessionFactory.openSession() 方法创建 SqlSession 实例。

  3. 获取 Mapper 接口: 使用 sqlSession.getMapper() 方法获取 Mapper 接口的代理对象。

  4. 执行 SQL 语句: 通过 Mapper 接口的代理对象调用方法,执行 SQL 语句。

  5. 关闭 SqlSession:finally 块中关闭 SqlSession,释放资源。 使用try-with-resources语句可以自动关闭资源。

1.3.3 SqlSessionFactoryBuilder 与 SqlSessionFactory 的关系

SqlSessionFactoryBuilder 用于构建 SqlSessionFactory,而 SqlSessionFactory 用于创建 SqlSession。它们之间的关系可以用下图表示:

流程说明:

  1. MyBatis 从 XML 配置文件或 Java 代码中读取配置信息。

  2. SqlSessionFactoryBuilder 根据配置信息构建 SqlSessionFactory 实例。

  3. 应用程序通过 SqlSessionFactory 创建 SqlSession 实例。

  4. SqlSession 负责执行 SQL 语句,与数据库进行交互。

1.3.4 最佳实践

  • 单例模式: SqlSessionFactory 应该是单例的,避免重复创建,提高性能。

  • 及时关闭: SqlSession 在使用完毕后应该及时关闭,释放资源。

  • 异常处理: 在创建 SqlSessionFactorySqlSession 时,应该进行异常处理,防止应用程序崩溃。

  • 使用try-with-resources: 使用java7提供的try-with-resources语法,可以自动关闭资源,简化代码。

1.3.5 总结

SqlSessionFactoryBuilderSqlSessionFactory 是 MyBatis 中重要的组件。SqlSessionFactoryBuilder 负责构建 SqlSessionFactory,而 SqlSessionFactory 负责创建 SqlSession。理解它们的作用和关系,能够帮助我们更好地使用 MyBatis,提高开发效率。

通过本文,你应该能够理解:

  • SqlSessionFactoryBuilder 的作用和生命周期。

  • SqlSessionFactory 的作用和生命周期。

  • 如何使用 SqlSessionFactoryBuilder 构建 SqlSessionFactory

  • 如何使用 SqlSessionFactory 创建 SqlSession

  • SqlSessionFactoryBuilderSqlSessionFactory 之间的关系。

希望这篇文章能够帮助你更好地理解 MyBatis 中的 SqlSessionFactoryBuilderSqlSessionFactory


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U