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: 自动配置SqlSessionFactory、SqlSessionTemplate和 Mapper 扫描。DataSourceAutoConfiguration: 自动配置数据源(基于application.properties或application.yml)。
3. 关键组件初始化流程
- 数据源(DataSource) : Spring Boot 根据配置(如
spring.datasource.url)自动创建数据源(如 HikariCP)。 - SqlSessionFactory: 通过
SqlSessionFactoryBean创建,绑定数据源和 MyBatis 配置。 - SqlSessionTemplate: 封装
SqlSession,提供线程安全的数据库操作。 - 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. 多数据源配置
若需多数据源,需手动配置多个 SqlSessionFactory 和 DataSource:
@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 的复杂配置。通过以下步骤实现无缝整合:
- 依赖引入:通过 Starter 简化依赖管理。
- 自动配置:基于条件创建
DataSource、SqlSessionFactory等核心组件。 - Mapper 扫描:自动注册接口并生成代理对象。
- 事务整合:与 Spring 事务管理器无缝协作。
优势:
- 零 XML 配置(或极简配置)。
- 天然支持 Spring 事务和依赖注入。
- 快速响应业务需求,减少模板代码。