全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-20 8 分钟 ✍️ juanwangdev

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>
配置项说明
basePackageMapper 接口所在包,支持多包逗号分隔
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() 设置

📝 发现内容有误?点击此处直接编辑

← 上一篇 Mapper 接口注入
下一篇 → 事务管理集成
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库