Skip to content

MyBatis-Plus 学习路线

MyBatis-Plus 是 MyBatis 的增强工具,提供通用 CRUD、条件构造器、分页插件、逻辑删除、自动填充、代码生成器等能力。

它的定位不是替代 MyBatis,而是减少重复 CRUD 代码。复杂 SQL、报表查询、性能敏感查询,仍然可以回到 MyBatis XML 手写。

如果想知道这些能力的底层过程,先阅读 MyBatis-Plus 核心全过程原理。学习路线页负责告诉你先学什么,核心原理页负责解释为什么能工作、生成什么 SQL、线上怎么排查。

MyBatis-Plus 解决什么问题

普通 MyBatis 中,简单表也要写很多重复代码:

  1. 根据 ID 查询。
  2. 插入。
  3. 更新。
  4. 删除。
  5. 分页查询。
  6. 条件查询。

MyBatis-Plus 通过 BaseMapper 和 Service 封装减少这些重复代码。

学习路线

mermaid
flowchart TD
    A["BaseMapper 通用 CRUD"] --> B["Service 层封装"]
    B --> C["Wrapper 条件构造器"]
    C --> D["分页插件"]
    D --> E["自动填充"]
    E --> F["逻辑删除"]
    F --> G["代码生成器"]
    G --> H["复杂 SQL 回到 MyBatis"]

BaseMapper

实体类:

java
@TableName("user")
public class User {
    private Long id;
    private String name;
    private Integer age;
}

Mapper:

java
public interface UserMapper extends BaseMapper<User> {
}

这样就有了常用 CRUD 方法:

java
userMapper.selectById(1L);
userMapper.insert(user);
userMapper.updateById(user);
userMapper.deleteById(1L);

Wrapper 条件构造器

Wrapper 用来构造查询条件。

java
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, "张三")
       .ge(User::getAge, 18)
       .orderByDesc(User::getId);

List<User> users = userMapper.selectList(wrapper);

推荐使用 LambdaWrapper,因为它能减少字段名写错的问题。

分页插件

分页查询是后端高频能力。

java
Page<User> page = new Page<>(1, 10);
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.orderByDesc(User::getId);

Page<User> result = userMapper.selectPage(page, wrapper);

注意:分页必须配置分页插件,否则可能不生效。

自动填充

常见字段:

  1. 创建时间。
  2. 更新时间。
  3. 创建人。
  4. 更新人。

使用 MetaObjectHandler 可以统一处理。

java
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());
    }
}

逻辑删除

逻辑删除不是物理删除数据,而是把删除标记改成已删除。

java
@TableLogic
private Integer deleted;

适合需要保留历史数据的业务。

注意:

  1. 唯一索引设计要考虑逻辑删除字段。
  2. 后台管理可能需要查询已删除数据。
  3. 不要所有表都无脑逻辑删除。

什么时候不用 MyBatis-Plus

这些场景建议手写 SQL:

  1. 多表复杂 join。
  2. 报表统计。
  3. 动态聚合。
  4. 强性能优化查询。
  5. 数据库特性语法。

MyBatis-Plus 是提高 CRUD 效率,不是让你不学 SQL。

常见坑

  1. Wrapper 条件拼接过多,生成 SQL 难读。
  2. 逻辑删除和唯一索引冲突。
  3. 分页插件没有配置。
  4. 字段自动填充不生效。
  5. 代码生成器生成的代码不适合直接当最终设计。
  6. 简单查询滥用 Service 链式调用导致业务层混乱。

本章小结

MyBatis-Plus 的核心价值是减少重复 CRUD。入门重点掌握 BaseMapper、Wrapper、分页、自动填充和逻辑删除;复杂 SQL 仍然要回到 MyBatis 和数据库基础。

工作原理

MyBatis-Plus 的原理是在 MyBatis 之上提供通用 Mapper、条件构造器和插件能力。它不会改变 SQL 执行本质,最终仍然是 MyBatis 调用 JDBC 执行 SQL。

mermaid
flowchart TD
    A["BaseMapper / Wrapper"] --> B["生成 SQL 片段"]
    B --> C["MyBatis 执行器"]
    C --> D["JDBC"]
    D --> E["数据库"]

所以使用 MyBatis-Plus 仍然要看最终 SQL 和执行计划,不能因为 API 简洁就忽略索引、事务和锁。

更完整的 BaseMapperWrapper、分页插件、逻辑删除、自动填充、乐观锁和商业排查流程见 MyBatis-Plus 核心全过程原理