一、核心作用
SqlSessionFactory 是 MyBatis 的核心接口,负责创建 SqlSession 实例。它是线程安全的单例对象,通常在应用启动时初始化,生命周期贯穿整个应用运行过程。主要职责包括:
- 解析配置文件(如
mybatis-config.xml),加载全局配置(数据源、事务管理器、插件等)。 - 管理数据库连接池,优化资源分配。
- 注册 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:环境标识(如development、production)。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. 销毁阶段
- 资源释放:关闭连接池,清理缓存(通常在应用关闭时触发)。
五、最佳实践
-
单例模式 确保整个应用中只有一个
SqlSessionFactory实例,避免重复创建浪费资源。 -
Spring 集成 通过 Spring 的
SqlSessionFactoryBean管理工厂,结合依赖注入简化配置:<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath:mapper/*.xml"/> </bean> -
性能优化
- 连接池配置:合理设置最大连接数(
maxActive)、超时时间(maxWait)。 - 二级缓存:在映射文件中启用
<cache/>,提升查询性能。 - 懒加载:通过
<setting name="lazyLoadingEnabled" value="true"/>优化关联对象加载。
- 连接池配置:合理设置最大连接数(
-
错误排查
- 配置检查:确认数据源 URL、驱动类名正确。
- 日志监控:启用 MyBatis 日志(如
STDOUT_LOGGING)追踪 SQL 执行。
六、常见问题
1. 配置文件路径错误
- 现象:
IOException或Mapper XML not found。 - 解决:检查
mybatis-config.xml和 Mapper XML 的路径是否正确。
2. 数据源配置错误
- 现象:连接数据库失败。
- 解决:验证数据库 URL、用户名、密码,确保驱动包已引入。
3. Mapper 未注册
- 现象:
BindingException: Invalid bound statement。 - 解决:确认 Mapper 接口或 XML 文件已正确注册。
七、总结
SqlSessionFactory 是 MyBatis 的“心脏”,承担配置解析、资源管理和会话创建的核心职责。正确配置与使用可显著提升应用性能与稳定性。关键点包括:
- 单例模式管理:避免重复创建。
- 合理配置数据源:优化连接池参数。
- 集成 Spring:简化生命周期管理。
- 日志与监控:快速定位问题。