mybatis-spring-boot-starter 是 MyBatis 官方为 Spring Boot 提供的集成启动器,旨在简化 MyBatis 在 Spring Boot 项目中的配置和使用。它通过自动配置和约定优于配置的原则,大幅减少了传统 MyBatis 整合所需的样板代码。以下是其核心特性、工作原理及使用方法的详细解析:
一、核心功能与依赖
1. 依赖引入
在 pom.xml 中添加以下依赖,即可引入 MyBatis 和 Spring Boot 的整合支持:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.2</version>
</dependency>
该启动器会自动引入以下关键依赖:
mybatis:MyBatis 核心库。mybatis-spring:MyBatis 与 Spring 的适配层。spring-boot-starter-jdbc:Spring Boot 的 JDBC 支持(含事务管理)。HikariCP(默认连接池):高性能数据库连接池。
2. 功能概述
- 自动配置
SqlSessionFactory和SqlSessionTemplate:无需手动配置。 - Mapper 接口自动扫描:通过
@Mapper或@MapperScan注册接口。 - 事务管理集成:与 Spring 的
@Transactional注解无缝协作。 - 简化 XML 配置:通过
application.properties配置 MyBatis 参数。
二、自动配置原理
1. 核心自动配置类
MybatisAutoConfiguration: 负责自动配置SqlSessionFactory和SqlSessionTemplate,并绑定数据源。DataSourceAutoConfiguration: 根据配置文件自动初始化数据源(如spring.datasource.url)。
2. SqlSessionFactory 的创建
- 数据源绑定:自动注入 Spring Boot 配置的
DataSource。 - XML 映射文件加载:通过
mybatis.mapper-locations指定路径。 - 类型别名扫描:通过
mybatis.type-aliases-package设置实体类包路径。
3. SqlSessionTemplate 的作用
- 线程安全:封装
SqlSession,确保每个线程使用独立的实例。 - 事务管理集成:与 Spring 事务管理器协同,确保同一事务内使用相同连接。
三、关键配置项
在 application.properties 或 application.yml 中配置 MyBatis 参数:
1. 基本配置
# 数据源配置
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
# MyBatis 配置
mybatis.mapper-locations=classpath:mapper/**/*.xml # XML 映射文件路径
mybatis.type-aliases-package=com.example.entity # 实体类别名包路径
mybatis.configuration.map-underscore-to-camel-case=true # 驼峰命名映射
2. 高级配置
# 开启 MyBatis 日志(显示执行的 SQL)
logging.level.com.example.mapper=DEBUG
# 配置全局设置(如缓存、懒加载)
mybatis.configuration.cache-enabled=true
mybatis.configuration.lazy-loading-enabled=true
四、Mapper 接口的注册
1. @Mapper 注解
直接在 Mapper 接口上添加 @Mapper 注解,Spring Boot 会自动扫描并注册:
@Mapper
public interface UserMapper {
User selectUserById(Long id);
}
2. @MapperScan 注解
在启动类或配置类上添加 @MapperScan,指定扫描的包路径:
@SpringBootApplication
@MapperScan("com.example.mapper") // 扫描指定包下的所有 Mapper 接口
public class Application { ... }
五、事务管理
Spring Boot 默认使用 DataSourceTransactionManager 管理事务,通过 @Transactional 注解实现声明式事务:
1. 事务配置示例
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void createUser(User user) {
userMapper.insert(user);
// 其他业务操作...
}
}
2. 事务传播行为与隔离级别
@Transactional(
propagation = Propagation.REQUIRED, // 默认传播行为
isolation = Isolation.READ_COMMITTED, // 默认隔离级别
rollbackFor = Exception.class // 指定回滚异常类型
)
public void updateUser(User user) { ... }
六、实际开发流程
1. 项目结构示例
src/main/java
├── com.example
│ ├── Application.java # 启动类
│ ├── entity
│ │ └── User.java # 实体类
│ ├── mapper
│ │ └── UserMapper.java # Mapper 接口
│ └── service
│ └── UserService.java # 业务逻辑层
src/main/resources
├── mapper
│ └── UserMapper.xml # XML 映射文件
└── application.properties # 配置文件
2. Mapper 接口与 XML 映射文件
-
UserMapper.java:@Mapper public interface UserMapper { User selectUserById(Long id); int insert(User user); } -
UserMapper.xml:<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserById" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> <insert id="insert" parameterType="User"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> </mapper>
3. Service 层调用
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(Long id) {
return userMapper.selectUserById(id);
}
@Transactional
public void addUser(User user) {
userMapper.insert(user);
}
}
七、多数据源配置(进阶)
若需使用多个数据源,需手动配置多个 SqlSessionFactory 和事务管理器:
1. 数据源配置
@Configuration
public class DataSourceConfig {
// 主数据源
@Bean
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
// 次数据源
@Bean
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
2. MyBatis 配置
@Configuration
@MapperScan(
basePackages = "com.example.mapper.primary",
sqlSessionFactoryRef = "primarySqlSessionFactory"
)
public class PrimaryMyBatisConfig {
@Bean
public SqlSessionFactory primarySqlSessionFactory(
@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
return factory.getObject();
}
@Bean
public PlatformTransactionManager primaryTransactionManager(
@Qualifier("primaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
八、常见问题与解决
| 问题 | 原因 | 解决方案 |
|---|---|---|
| Mapper 接口无法注入 | 未正确配置 @Mapper 或 @MapperScan | 检查包路径或直接在接口上添加 @Mapper。 |
| XML 映射文件未找到 | mybatis.mapper-locations 路径错误 | 确认 XML 文件位于 resources/mapper 目录。 |
| 事务不生效 | 未启用事务管理或异常类型不匹配 | 添加 @EnableTransactionManagement,配置 rollbackFor。 |
| 驼峰命名不生效 | 未开启 map-underscore-to-camel-case | 在配置中设置 mybatis.configuration.map-underscore-to-camel-case=true。 |
九、总结
mybatis-spring-boot-starter 的核心优势:
- 零配置启动:自动配置
SqlSessionFactory、DataSource等组件。 - 无缝整合 Spring 生态:与 Spring 事务、依赖注入深度集成。
- 简化开发:通过注解和约定减少 XML 配置。
- 高性能:默认集成 HikariCP 连接池,优化数据库访问。
适用场景:
- 快速构建基于 Spring Boot 和 MyBatis 的数据驱动应用。
- 需要简化传统 MyBatis 配置的中小型项目。
- 微服务架构下的数据库访问层实现。
通过合理使用 mybatis-spring-boot-starter,开发者可以专注于业务逻辑,而非底层配置,显著提升开发效率。