Spring Boot 整合 MyBatis-Plus:依赖、配置与常见踩坑
知识背景
在 Spring Boot 项目中使用 MP,通常引入 mybatis-plus-boot-starter,配置 数据源、Mapper 扫描、分页插件、主键策略,即可与 Spring事务、校验、全局异常 同一套工程内协作。
本文串联「能跑起来」的最小知识与 高频报错,便于对照官方文档落地。
知识详解与通俗解释
1. 依赖与自动配置
- 引入 starter后,Spring Boot 会注册 SqlSessionFactory 等 Bean;具体与
spring-boot-starter-jdbc/ 连接池 配合。 - 不要 同时混用旧版
mybatis-spring-boot-starter与 MP starter 导致版本冲突,以 MP 官方 BOM/文档 为准统一版本。
2. 必备配置项(概念级)
@MapperScan("com.xxx.mapper"):扫描 Mapper 接口。- 数据源:URL、用户名密码、连接池(Hikari 等)。
- MyBatis 配置:
map-underscore-to-camel-case、XMLmapper-locations(若仍用 XML)。 - 分页插件:
MybatisPlusInterceptor+PaginationInnerInterceptor(DbType.MYSQL)。
3. 与 Spring 事务
@Transactional 加在 Service 上;自调用(同类内 this.method())可能绕开代理导致事务不生效——需注入自身或拆类。
只读查询可标 readOnly = true(视数据库与驱动而定)。
4. 常见踩坑
| 现象 | 可能原因 |
|---|---|
Invalid bound statement | XML 路径与 mapper-locations 不一致,或 namespace 错误 |
| 分页 total 为 0 | 未注册分页插件或方言不对 |
| 字段全 null | 实体未与表字段映射,或未开下划线转驼峰 |
| 更新了 0 行 | 主键未设、@TableId 类型与库不一致、逻辑删除条件拦截 |
5. 与 Redis / 缓存
Service 层 先查缓存再查库 时,注意 事务边界:缓存更新与 DB 提交顺序决定一致性,参考缓存三连击(穿透/击穿/雪崩)文章做分级策略。
总结
- starter + MapperScan + 数据源 + 分页插件 是骨架。
- 版本与 原生 MyBatis starter 冲突要优先排除。
- 生产还需:连接池参数、慢 SQL、索引与事务边界——MP 只解决一半,另一半在 MySQL 与架构。