Spring Boot 集成 MyBatis

68 阅读3分钟

Spring Boot 集成 MyBatis 的原理是通过 自动配置(Auto-Configuration)依赖注入(DI) 简化 MyBatis 的核心组件初始化,实现零配置或低配置的快速整合。以下是详细的原理和实现步骤:


一、核心原理

1. 依赖引入与启动器(Starter)

  • mybatis-spring-boot-starter: 通过该依赖引入 MyBatis 核心库、MyBatis-Spring 适配器、Spring Boot JDBC 支持等。

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.3.2</version>
    </dependency>
    

2. 自动配置类(Auto-Configuration)

Spring Boot 通过以下自动配置类完成 MyBatis 的核心组件初始化:

  • MybatisAutoConfiguration: 自动配置 SqlSessionFactorySqlSessionTemplate 和 Mapper 扫描。
  • DataSourceAutoConfiguration: 自动配置数据源(基于 application.propertiesapplication.yml)。

3. 关键组件初始化流程

  1. 数据源(DataSource) : Spring Boot 根据配置(如 spring.datasource.url)自动创建数据源(如 HikariCP)。
  2. SqlSessionFactory: 通过 SqlSessionFactoryBean 创建,绑定数据源和 MyBatis 配置。
  3. SqlSessionTemplate: 封装 SqlSession,提供线程安全的数据库操作。
  4. Mapper 接口扫描: 通过 @MapperScan@Mapper 注解注册 Mapper 接口。

二、详细实现机制

1. 数据源自动配置

Spring Boot 根据配置自动创建 DataSource,支持主流连接池(如 HikariCP、Tomcat JDBC)。

# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

2. SqlSessionFactory 创建

MybatisAutoConfiguration 通过 SqlSessionFactoryBean 构建 SqlSessionFactory

@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setDataSource(dataSource);
    factory.setMapperLocations(resolveMapperLocations()); // 加载 Mapper XML
    return factory.getObject();
}

3. Mapper 接口扫描与代理生成

  • 方式 1:@MapperScan 注解 在启动类或配置类上指定扫描包路径:

    @SpringBootApplication
    @MapperScan("com.example.mapper")
    public class App { ... }
    
  • 方式 2:@Mapper 注解 直接在 Mapper 接口上标记:

    @Mapper
    public interface UserMapper { ... }
    

4. 事务管理整合

  • Spring 事务管理器: MyBatis 操作默认由 Spring 的 DataSourceTransactionManager 管理。

  • 事务注解: 使用 @Transactional 注解实现声明式事务。

    @Service
    public class UserService {
        @Autowired
        private UserMapper userMapper;
        
        @Transactional
        public void addUser(User user) {
            userMapper.insert(user);
        }
    }
    

三、关键配置项

1. MyBatis 配置(application.properties)

# 指定 Mapper XML 路径
mybatis.mapper-locations=classpath:mapper/**/*.xml
# 开启驼峰命名映射
mybatis.configuration.map-underscore-to-camel-case=true
# 别名扫描包
mybatis.type-aliases-package=com.example.entity

2. 多数据源配置

若需多数据源,需手动配置多个 SqlSessionFactoryDataSource

@Configuration
public class MyBatisConfig {
    // 主数据源
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() { ... }
​
    // 次数据源
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() { ... }
​
    // 主 SqlSessionFactory
    @Bean
    public SqlSessionFactory primarySqlSessionFactory(
        @Qualifier("primaryDataSource") DataSource dataSource) throws Exception { ... }
​
    // 次 SqlSessionFactory
    @Bean
    public SqlSessionFactory secondarySqlSessionFactory(
        @Qualifier("secondaryDataSource") DataSource dataSource) throws Exception { ... }
}

四、核心组件交互流程

SpringBootMyBatisAutoConfigurationDataSourceAutoConfigurationUserMapperUserService创建 DataSourceDataSource Bean创建 SqlSessionFactory绑定 DataSourceSqlSessionFactory Bean扫描并注册 Mapper 接口Mapper 代理对象注入 UserMapper调用数据库操作SpringBootMyBatisAutoConfigurationDataSourceAutoConfigurationUserMapperUserService

五、常见问题与解决

1. Mapper 接口无法注入

  • 原因:未使用 @MapperScan@Mapper 注解。
  • 解决:检查包路径是否匹配,或添加 @Mapper 到接口。

2. XML 映射文件未找到

  • 原因mybatis.mapper-locations 路径配置错误。
  • 解决:确认 XML 文件位于 resources/mapper 目录下。

3. 事务不生效

  • 原因:未启用事务管理或异常未被捕获。
  • 解决:添加 @EnableTransactionManagement 并检查异常类型。

六、总结

Spring Boot 集成 MyBatis 的核心原理是通过 自动配置条件化注册 简化传统 MyBatis 的复杂配置。通过以下步骤实现无缝整合:

  1. 依赖引入:通过 Starter 简化依赖管理。
  2. 自动配置:基于条件创建 DataSourceSqlSessionFactory 等核心组件。
  3. Mapper 扫描:自动注册接口并生成代理对象。
  4. 事务整合:与 Spring 事务管理器无缝协作。

优势

  • 零 XML 配置(或极简配置)。
  • 天然支持 Spring 事务和依赖注入。
  • 快速响应业务需求,减少模板代码。