1.3 SqlSessionFactoryBuilder 与 SqlSessionFactory 1.3 SqlSessionFactoryBuilder 与 SqlSessionFactory 在 MyBatis 的核心架构中, 和 是两个至关重要的组件,它们分别负责构建和管理 MyBatis 的会话工厂。理解它们的作用和关系对于掌握 MyBatis 的使用至关重要。 1.3.1 SqlSessionFactoryBuilder:构建工厂 的主要职责是根据配置信息(通常是 XML 配置文件或 Java 代码)构建 实例。它是一个临时对象,一旦 创建完成,就可以被丢弃。 作用: 读取 MyBatis 的配置信息。 创建 实例。 生命周期: 的生命周期非常短暂。
在 MyBatis 的核心架构中,SqlSessionFactoryBuilder 和 SqlSessionFactory 是两个至关重要的组件,它们分别负责构建和管理 MyBatis 的会话工厂。理解它们的作用和关系对于掌握 MyBatis 的使用至关重要。
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; } }
详解:
引入依赖: 确保项目中引入了 MyBatis 的相关依赖。
加载配置文件: 使用 Resources.getResourceAsStream() 方法加载 mybatis-config.xml 配置文件。
构建 SqlSessionFactory: 创建 SqlSessionFactoryBuilder 实例,并调用 build() 方法,传入输入流,构建 SqlSessionFactory。
单例模式: 使用静态代码块和静态变量,保证 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); } } }
详解:
获取 SqlSessionFactory: 通过 MyBatisUtil.getSqlSessionFactory() 方法获取 SqlSessionFactory 实例。
创建 SqlSession: 使用 sqlSessionFactory.openSession() 方法创建 SqlSession 实例。
获取 Mapper 接口: 使用 sqlSession.getMapper() 方法获取 Mapper 接口的代理对象。
执行 SQL 语句: 通过 Mapper 接口的代理对象调用方法,执行 SQL 语句。
关闭 SqlSession: 在 finally 块中关闭 SqlSession,释放资源。 使用try-with-resources语句可以自动关闭资源。
SqlSessionFactoryBuilder 用于构建 SqlSessionFactory,而 SqlSessionFactory 用于创建 SqlSession。它们之间的关系可以用下图表示:
流程说明:
MyBatis 从 XML 配置文件或 Java 代码中读取配置信息。
SqlSessionFactoryBuilder 根据配置信息构建 SqlSessionFactory 实例。
应用程序通过 SqlSessionFactory 创建 SqlSession 实例。
SqlSession 负责执行 SQL 语句,与数据库进行交互。
单例模式: SqlSessionFactory 应该是单例的,避免重复创建,提高性能。
及时关闭: SqlSession 在使用完毕后应该及时关闭,释放资源。
异常处理: 在创建 SqlSessionFactory 和 SqlSession 时,应该进行异常处理,防止应用程序崩溃。
使用try-with-resources: 使用java7提供的try-with-resources语法,可以自动关闭资源,简化代码。
SqlSessionFactoryBuilder 和 SqlSessionFactory 是 MyBatis 中重要的组件。SqlSessionFactoryBuilder 负责构建 SqlSessionFactory,而 SqlSessionFactory 负责创建 SqlSession。理解它们的作用和关系,能够帮助我们更好地使用 MyBatis,提高开发效率。
通过本文,你应该能够理解:
SqlSessionFactoryBuilder 的作用和生命周期。
SqlSessionFactory 的作用和生命周期。
如何使用 SqlSessionFactoryBuilder 构建 SqlSessionFactory。
如何使用 SqlSessionFactory 创建 SqlSession。
SqlSessionFactoryBuilder 和 SqlSessionFactory 之间的关系。
希望这篇文章能够帮助你更好地理解 MyBatis 中的 SqlSessionFactoryBuilder 和 SqlSessionFactory。