Skip to content

MyBatis Plus:让 MyBatis 不再需要手写 SQL

你有没有被 MyBatis 的 CRUD 代码折磨过?

java
// 查一条
User user = userMapper.selectOne(new QueryWrapper<User>().eq("id", 1L));

// 查多条
List<User> users = userMapper.selectList(new QueryWrapper<User>().like("name", "Tom"));

// 插入
userMapper.insert(user);

// 更新
userMapper.update(user, new UpdateWrapper<User>().eq("id", 1L));

// 删除
userMapper.delete(new QueryWrapper<User>().eq("id", 1L));

这就是 MyBatis Plus——国产开源的 MyBatis 增强工具。它让简单 CRUD 变得前所未有的简单。

MyBatis Plus 是什么?

MyBatis Plus(简称 MP)是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

┌─────────────────────────────────────────────────────────────────┐
│                      MyBatis Plus 定位                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│              ┌─────────────────────────────────┐               │
│              │         MyBatis Plus             │               │
│              │         (增强工具层)              │               │
│              └─────────────────────────────────┘               │
│                           ▲                                     │
│                           │ 只做增强,不做改变                   │
│                           │                                     │
│              ┌─────────────────────────────────┐               │
│              │          MyBatis                 │               │
│              │          (基础框架层)              │               │
│              └─────────────────────────────────┘               │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

核心特性

1. 无侵入

只增强 MyBatis,不改变原有架构。已有的 MyBatis 项目,可以零成本接入。

2. 损耗小

启动即会对基本 CRUD 进行自动注入,没有任何额外损耗。

3. 强大的 CRUD 操作

内置通用 Service CRUD 和 Mapper CRUD,极大减少 CRUD 操作的工作量。

java
// Service 层调用
User user = userService.getById(1L);
List<User> users = userService.list(new QueryWrapper<User>().like("name", "Tom"));

// Mapper 层调用
User user = baseMapper.selectById(1L);
List<User> users = baseMapper.selectList(null);

4. 强大的条件构造器

支持 Lambda 语法的条件构造器,告别硬编码:

java
// 强类型,不用担心列名写错
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.lambda()
      .select(User::getName, User::getEmail)
      .like(User::getName, "Tom")
      .eq(User::getStatus, 1)
      .orderByDesc(User::getCreateTime);

5. 内置分页插件

无需额外配置,开箱即用:

java
Page<User> page = new Page<>(1, 10);
Page<User> result = userMapper.selectPage(page, null);
System.out.println("总记录数: " + result.getTotal());
System.out.println("数据: " + result.getRecords());

6. 自动填充

创建时间、更新时间自动填充:

java
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;

@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;

7. 逻辑删除

物理删除变逻辑删除,数据可恢复:

java
@TableLogic
private Integer deleted;

8. 乐观锁

解决并发更新问题:

java
@Version
private Integer version;

9. 多租户支持

一个系统服务多个租户:

java
// 自动在 SQL 中注入租户 ID
TenantLineInnerInterceptor tenantInterceptor = new TenantLineInnerInterceptor(new TenantLineHandler() {
    @Override
    public Expression getTenantId() {
        return new LongValue(TenantContext.getTenantId());
    }
});

生态体系

MyBatis Plus
├── 核心功能
│   ├── CRUD 接口
│   ├── 条件构造器
│   ├── 分页插件
│   ├── 自动填充
│   ├── 逻辑删除
│   └── 乐观锁
├── 扩展功能
│   ├── 多租户
│   ├── SQL 分析器
│   ├── 动态表名
│   └── 拦截器链
└── 工具
    ├── 代码生成器(MyBatis Plus Generator)
    └── 快速 CURD 插件(EasyCode、MyBatisX)

为什么选择 MyBatis Plus?

对比项手写 SQLMyBatis GeneratorMyBatis Plus
开发效率
SQL 可控性完全可控一般完全可控
CRUD 代码量
动态 SQL灵活一般灵活
学习成本
维护成本

适用场景

  • 快速开发阶段:减少样板代码,快速交付
  • 后台管理系统:CRUD 占比高,适合使用
  • 微服务拆分:各服务独立使用,互不影响
  • 需要深度 SQL 优化:仍然可以手写 SQL

章节导航


思考题

MyBatis Plus 这么好,但它毕竟是增强工具,不是 ORM 框架。如果你的业务需要极度灵活的 SQL 操作,或者查询条件复杂到难以用条件构造器表达,应该怎么做?

答案:MyBatis Plus 完全兼容原生 MyBatis,复杂 SQL 仍然可以写 XML 或使用 @Select 注解。

下一节,我们从 快速上手 开始,体验 MyBatis Plus 的魅力。

基于 VitePress 构建