SqlSessionFactory

387 阅读3分钟

一、核心作用

SqlSessionFactory 是 MyBatis 的核心接口,负责创建 SqlSession 实例。它是线程安全的单例对象,通常在应用启动时初始化,生命周期贯穿整个应用运行过程。主要职责包括:

  1. 解析配置文件(如 mybatis-config.xml),加载全局配置(数据源、事务管理器、插件等)。
  2. 管理数据库连接池,优化资源分配。
  3. 注册 Mapper 接口与 XML 映射文件,实现 SQL 与 Java 方法的绑定。

二、创建方式

1. 通过 XML 配置文件创建(推荐)
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  • mybatis-config.xml 示例

    <configuration>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="mapper/UserMapper.xml"/>
        </mappers>
    </configuration>
    
2. 通过 Java 代码直接配置
// 1. 创建数据源
DataSource dataSource = new PooledDataSource(
    "com.mysql.jdbc.Driver",
    "jdbc:mysql://localhost:3306/test",
    "root",
    "123456"
);
​
// 2. 配置环境与事务管理器
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
​
// 3. 构建 Configuration 并注册 Mapper
Configuration configuration = new Configuration(environment);
configuration.addMapper(UserMapper.class);
​
// 4. 创建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

三、核心组件分析

1. Configuration 对象
  • 作用:存储所有 MyBatis 的全局配置信息,包括:

    • 数据源(DataSource)和事务管理器(TransactionFactory)。
    • 类型处理器(TypeHandler)、插件(Interceptor)。
    • Mapper 接口与 XML 映射文件的注册信息。
  • 生成方式:由 XMLConfigBuilder 解析 XML 配置文件生成。

2. Environment 对象
  • 组成

    • id:环境标识(如 developmentproduction)。
    • TransactionFactory:事务管理器工厂(如 JdbcTransactionFactory)。
    • DataSource:数据库连接池。
3. Mapper 注册机制
  • XML 映射文件:通过 <mappers> 标签指定路径。
  • 注解方式:直接在接口方法上使用 @Select@Insert 等注解。
  • 动态代理:MyBatis 为 Mapper 接口生成代理对象,实现 SQL 执行。

四、生命周期管理

1. 初始化阶段
  • 触发时机:应用启动时,通过 SqlSessionFactoryBuilder 构建。
  • 资源加载:解析 XML 配置、加载映射文件、初始化数据源。
2. 运行阶段
  • 创建 SqlSession:通过 openSession() 方法创建会话。

    SqlSession session = sqlSessionFactory.openSession();
    
  • 事务控制:支持手动提交(commit())和回滚(rollback())。

3. 销毁阶段
  • 资源释放:关闭连接池,清理缓存(通常在应用关闭时触发)。

五、最佳实践

  1. 单例模式 确保整个应用中只有一个 SqlSessionFactory 实例,避免重复创建浪费资源。

  2. Spring 集成 通过 Spring 的 SqlSessionFactoryBean 管理工厂,结合依赖注入简化配置:

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>
    
  3. 性能优化

    • 连接池配置:合理设置最大连接数(maxActive)、超时时间(maxWait)。
    • 二级缓存:在映射文件中启用 <cache/>,提升查询性能。
    • 懒加载:通过 <setting name="lazyLoadingEnabled" value="true"/> 优化关联对象加载。
  4. 错误排查

    • 配置检查:确认数据源 URL、驱动类名正确。
    • 日志监控:启用 MyBatis 日志(如 STDOUT_LOGGING)追踪 SQL 执行。

六、常见问题

1. 配置文件路径错误
  • 现象IOExceptionMapper XML not found
  • 解决:检查 mybatis-config.xml 和 Mapper XML 的路径是否正确。
2. 数据源配置错误
  • 现象:连接数据库失败。
  • 解决:验证数据库 URL、用户名、密码,确保驱动包已引入。
3. Mapper 未注册
  • 现象BindingException: Invalid bound statement
  • 解决:确认 Mapper 接口或 XML 文件已正确注册。

七、总结

SqlSessionFactory 是 MyBatis 的“心脏”,承担配置解析、资源管理和会话创建的核心职责。正确配置与使用可显著提升应用性能与稳定性。关键点包括:

  • 单例模式管理:避免重复创建。
  • 合理配置数据源:优化连接池参数。
  • 集成 Spring:简化生命周期管理。
  • 日志与监控:快速定位问题。