Spring-MyBatis 集成
Spring 与 MyBatis 集成核心在于通过 Spring 管理 SqlSessionFactory 和 Mapper 对象的生命周期。
SqlSessionFactoryBean 配置
SqlSessionFactoryBean 是 Spring 提供的 FactoryBean,用于创建 SqlSessionFactory 实例。
Java Config 方式
Java
@Configuration
public class MyBatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
// 指定 mapper XML 位置
factoryBean.setMapperLocations(
new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/*.xml"));
// 指定类型别名包
factoryBean.setTypeAliasesPackage("com.example.domain");
return factoryBean;
}
}
XML 配置方式
XML
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
<property name="typeAliasesPackage" value="com.example.domain"/>
<property name="configuration">
<bean class="org.apache.ibatis.session.Configuration">
<property name="mapUnderscoreToCamelCase" value="true"/>
<property name="logImpl" value="org.apache.ibatis.logging.slf4j.Slf4jImpl"/>
</bean>
</property>
</bean>
MapperScannerConfigurer 配置
MapperScannerConfigurer 自动扫描指定包下的 Mapper 接口,并将其注册为 Spring Bean。
Java Config 方式
Java
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {
}
XML 配置方式
XML
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 可选:指定注解标记的接口才注册 -->
<property name="annotationClass" value="com.example.annotation.MyMapper"/>
</bean>
| 配置项 | 说明 |
|---|---|
| basePackage | Mapper 接口所在包,支持多包逗号分隔 |
| sqlSessionFactoryBeanName | 指定 SqlSessionFactory,多数据源时必须配置 |
| annotationClass | 仅注册带有该注解的接口 |
| markerInterface | 仅注册实现该接口的接口 |
SqlSessionTemplate
SqlSessionTemplate 是线程安全的 SqlSession 实现,由 Spring 管理。
Java
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
SqlSessionTemplate 内部通过动态代理将操作委派给 SqlSessionUtils,确保线程安全。
DataSource 配置
Java
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/test");
ds.setUsername("root");
ds.setPassword("123456");
ds.setMaximumPoolSize(20);
return ds;
}
完整配置示例
Java
@Configuration
@ComponentScan("com.example")
@MapperScan("com.example.mapper")
public class AppConfig {
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/test");
ds.setUsername("root");
ds.setPassword("123456");
return ds;
}
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setMapperLocations(
new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/*.xml"));
org.apache.ibatis.session.Configuration config = new org.apache.ibatis.session.Configuration();
config.setMapUnderscoreToCamelCase(true);
factory.setConfiguration(config);
return factory;
}
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
Bean 生命周期
| 阶段 | 说明 |
|---|---|
| 容器启动 | 创建 DataSource、SqlSessionFactoryBean |
| FactoryBean 调用 | getObject() 返回 SqlSessionFactory |
| 扫描注册 | MapperScannerConfigurer 扫描 Mapper 接口 |
| 代理创建 | 为每个 Mapper 接口创建代理对象 |
| 注入使用 | @Autowired 注入 Mapper 代理 |
| 容器关闭 | 销毁资源,关闭连接池 |
注意事项
Java
// 错误:直接 new SqlSessionFactory 不受 Spring 管理
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
// 正确:通过 Spring Bean 获取
@Autowired
private SqlSessionFactory sqlSessionFactory;
MapperScannerConfigurer 的 sqlSessionFactoryBeanName 必须使用 Bean 名称而非实例引用,多数据源时尤为重要。
要点总结
- SqlSessionFactoryBean 是 FactoryBean,通过 getObject() 返回 SqlSessionFactory
- MapperScannerConfigurer 自动扫描并注册 Mapper 代理 Bean
- Java Config 使用 @MapperScan 替代 XML 的 MapperScannerConfigurer
- 多数据源时必须通过 sqlSessionFactoryBeanName 明确绑定关系
- SqlSessionTemplate 提供线程安全的 SqlSession 实现
- MyBatis Configuration 可通过 factoryBean.setConfiguration() 设置
📝 发现内容有误?点击此处直接编辑