MyBatis 与 Spring Boot 集成
Spring Boot 场景下,mybatis-spring-boot-starter(官方整合项目)把上一章的装配全部自动化:只要引入依赖、配几个 mybatis.* 属性、给 Mapper 接口打个注解,就能直接注入使用。
添加依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.x</version> <!-- Spring Boot 3 用 3.0.x;Boot 2 用 2.3.x -->
</dependency>
版本对应关系(starter ↔ Spring Boot ↔ mybatis-spring ↔ MyBatis)以官方文档为准,一般原则:Boot 2.x 配 starter 2.3.x,Boot 3.x 配 starter 3.0.x 及以上。Boot 3 基于 Jakarta EE,也请确认驱动与依赖兼容。
starter 自动做了三件事
- 探测容器里唯一的 DataSource,自动创建
SqlSessionFactory(含 SqlSessionFactoryBean 的装配逻辑)。 - 自动注册
SqlSessionTemplate。 - 发现并注册 Mapper:接口上带
@Mapper注解会被自动扫描;或用@MapperScan指定更广的扫描包(优先于自动扫描,以官方文档为准)。
application.yml 常用配置
mybatis:
mapper-locations: classpath*:mapper/**/*.xml # 映射 XML 位置
type-aliases-package: com.example.entity # 实体类别名包
type-handlers-package: com.example.handler # 自定义 TypeHandler 包(可选)
configuration:
map-underscore-to-camel-case: true # user_name → userName
cache-enabled: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# executor-type: SIMPLE # 执行器:SIMPLE/REUSE/BATCH
# configuration-properties: # 传给全局配置的属性
# database-id: mysql # 指定 databaseId(可选)
要点(均以 mybatis-spring-boot-autoconfigure 官方文档为准):
mybatis.mapper-locations指定 XML 位置,支持classpath*:通配符。mybatis.configuration.*直接对应 org.apache.ibatis.session.Configuration 的属性,逐项配置即可,无需再写 mybatis-config.xml。- 若坚持使用 mybatis-config.xml,用
mybatis.config-location引入;config-location与configuration.*不要同时配置。 - 执行器类型
mybatis.executor-type:SIMPLE(默认)/ REUSE / BATCH。
最小可用示例
Mapper 接口(XML 或注解都行):
@Mapper // 让 starter 自动注册该接口
public interface UserMapper {
@Select("SELECT id, name, age FROM user WHERE id = #{id}")
User selectById(Integer id);
}
使用处直接注入:
@Service
public class UserService {
private final UserMapper userMapper;
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Transactional // 事务仍由 Spring 管理
public void register(User user) {
userMapper.insert(user);
}
}
注意事项
- 多数据源:starter 默认按"唯一 DataSource"自动装配;多个数据源时需要手动定义各自的 SqlSessionFactory/SqlSessionTemplate,并配合 @MapperScan 区分(复杂场景以官方文档为准)。
- 启动时若报"Invalid bound statement":检查 mapper-locations 是否覆盖了 XML、XML 的 namespace 是否等于接口全限定名、语句 id 是否等于方法名。
- 想让 SQL 打到控制台,把
mybatis.configuration.log-impl配成 StdOutImpl(或接入 SLF4J/Logback)。
小结
starter 三行配置即可开箱:加依赖、写 mybatis.* 属性、接口标 @Mapper(或 @MapperScan)。从原生方式一路走到这里,SqlSession、XML、事务这些概念都通了,接 Boot 只是"自动装配"替你代劳。完整配置项与版本矩阵以官方文档为准。