mybatis-plus 的三大核心 wrapper 是 querywrapper、lambdaquerywrapper 和 updatewrapper:querywrapper 适用于通用单表查询,字段用字符串指定;lambdaquerywrapper 提供类型安全,通过方法引用避免字段名错误;updatewrapper 专用于更新操作,支持 set 表达式和动态赋值。

MyBatis-Plus 的 Wrapper 是构建动态 SQL 条件的核心机制,不用写 XML 或拼接字符串,就能安全、清晰地组装 WHERE 子句。真正常用且分工明确的,是以下 3 个核心 Wrapper:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
QueryWrapper:通用查询条件构造器
适合大多数单表查询场景,支持字段名字符串传入,语法直接,上手快。
- 字段用字符串指定(如
"username"),IDE 不校验,重构时需手动检查 - 支持
select()方法自定义返回字段 - 可用于
selectList、delete、update等操作
QueryWrapper<user> wrapper = new QueryWrapper();
wrapper.like("username", "张")
.ge("age", 18)
.in("status", Arrays.asList(1, 2))
.orderByDesc("create_time");
List<user> users = userMapper.selectList(wrapper);</user></user>
LambdaQueryWrapper:类型安全的推荐写法
用方法引用替代字符串,编译期就能发现字段名错误,重命名实体属性时自动同步,企业级项目首选。
- 必须配合实体类的 getter 方法(如
User::getUsername) - 支持动态条件控制:
.like(布尔表达式, 字段引用, 值),避免空值误查
LambdaQueryWrapper<user> wrapper = new LambdaQueryWrapper();
wrapper.like(StringUtils.isNotBlank(name), User::getUsername, name)
.ge(ageBegin != null, User::getAge, ageBegin)
.le(ageEnd != null, User::getAge, ageEnd)
.eq(User::getDeleted, false);
List<user> users = userMapper.selectList(wrapper);</user></user>
UpdateWrapper:专为更新设计的条件+赋值构造器
它不只是加 WHERE 条件,还能在 SET 部分做计算或动态赋值,比单纯传 Entity 更灵活。
-
set()直接设字段值;setSql()支持 SQL 表达式(如balance = balance - 100) - 更新时不会忽略 null 值(与普通 update 方法不同),适合部分字段更新
UpdateWrapper<user> wrapper = new UpdateWrapper();
wrapper.eq("id", userId)
.set("version", version + 1)
.setSql("update_time = now()");
userMapper.update(null, wrapper); // 第一个参数为 null,表示不依赖实体对象</user>
这三者不是互斥关系,而是按场景选型:查就用 LambdaQueryWrapper,快速验证可用 QueryWrapper,要改数据逻辑(尤其含表达式)就上 UpdateWrapper。关键不是记住所有方法,而是理解它们的职责边界和安全边界。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










