MyBatis-Plus 学习路线
MyBatis-Plus 是 MyBatis 的增强工具,提供通用 CRUD、条件构造器、分页插件、逻辑删除、自动填充、代码生成器等能力。
它的定位不是替代 MyBatis,而是减少重复 CRUD 代码。复杂 SQL、报表查询、性能敏感查询,仍然可以回到 MyBatis XML 手写。
如果想知道这些能力的底层过程,先阅读 MyBatis-Plus 核心全过程原理。学习路线页负责告诉你先学什么,核心原理页负责解释为什么能工作、生成什么 SQL、线上怎么排查。
MyBatis-Plus 解决什么问题
普通 MyBatis 中,简单表也要写很多重复代码:
- 根据 ID 查询。
- 插入。
- 更新。
- 删除。
- 分页查询。
- 条件查询。
MyBatis-Plus 通过 BaseMapper 和 Service 封装减少这些重复代码。
学习路线
flowchart TD
A["BaseMapper 通用 CRUD"] --> B["Service 层封装"]
B --> C["Wrapper 条件构造器"]
C --> D["分页插件"]
D --> E["自动填充"]
E --> F["逻辑删除"]
F --> G["代码生成器"]
G --> H["复杂 SQL 回到 MyBatis"]BaseMapper
实体类:
@TableName("user")
public class User {
private Long id;
private String name;
private Integer age;
}Mapper:
public interface UserMapper extends BaseMapper<User> {
}这样就有了常用 CRUD 方法:
userMapper.selectById(1L);
userMapper.insert(user);
userMapper.updateById(user);
userMapper.deleteById(1L);Wrapper 条件构造器
Wrapper 用来构造查询条件。
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, "张三")
.ge(User::getAge, 18)
.orderByDesc(User::getId);
List<User> users = userMapper.selectList(wrapper);推荐使用 LambdaWrapper,因为它能减少字段名写错的问题。
分页插件
分页查询是后端高频能力。
Page<User> page = new Page<>(1, 10);
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.orderByDesc(User::getId);
Page<User> result = userMapper.selectPage(page, wrapper);注意:分页必须配置分页插件,否则可能不生效。
自动填充
常见字段:
- 创建时间。
- 更新时间。
- 创建人。
- 更新人。
使用 MetaObjectHandler 可以统一处理。
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}逻辑删除
逻辑删除不是物理删除数据,而是把删除标记改成已删除。
@TableLogic
private Integer deleted;适合需要保留历史数据的业务。
注意:
- 唯一索引设计要考虑逻辑删除字段。
- 后台管理可能需要查询已删除数据。
- 不要所有表都无脑逻辑删除。
什么时候不用 MyBatis-Plus
这些场景建议手写 SQL:
- 多表复杂 join。
- 报表统计。
- 动态聚合。
- 强性能优化查询。
- 数据库特性语法。
MyBatis-Plus 是提高 CRUD 效率,不是让你不学 SQL。
常见坑
- Wrapper 条件拼接过多,生成 SQL 难读。
- 逻辑删除和唯一索引冲突。
- 分页插件没有配置。
- 字段自动填充不生效。
- 代码生成器生成的代码不适合直接当最终设计。
- 简单查询滥用 Service 链式调用导致业务层混乱。
本章小结
MyBatis-Plus 的核心价值是减少重复 CRUD。入门重点掌握 BaseMapper、Wrapper、分页、自动填充和逻辑删除;复杂 SQL 仍然要回到 MyBatis 和数据库基础。
工作原理
MyBatis-Plus 的原理是在 MyBatis 之上提供通用 Mapper、条件构造器和插件能力。它不会改变 SQL 执行本质,最终仍然是 MyBatis 调用 JDBC 执行 SQL。
flowchart TD
A["BaseMapper / Wrapper"] --> B["生成 SQL 片段"]
B --> C["MyBatis 执行器"]
C --> D["JDBC"]
D --> E["数据库"]所以使用 MyBatis-Plus 仍然要看最终 SQL 和执行计划,不能因为 API 简洁就忽略索引、事务和锁。
更完整的 BaseMapper、Wrapper、分页插件、逻辑删除、自动填充、乐观锁和商业排查流程见 MyBatis-Plus 核心全过程原理。
