QueryWrapper用字符串指定字段名,上手快但易拼错;LambdaQueryWrapper用Lambda引用字段,编译期校验、重构友好,推荐新项目默认使用。

直接用就行,关键看你是要写得快一点,还是写得稳一点。
QueryWrapper:字符串字段名,上手快
适合快速验证逻辑、简单查询或字段不常变动的场景。所有条件方法都接受字段名字符串,比如 eq("name", "张三") 表示 WHERE name = '张三'。
- 常用方法有:eq(等于)、ne(不等于)、gt/ge/lt/le(大小比较)、like(模糊匹配)、between(范围)、isNotNull(非空)等
- 支持链式组合:
wrapper.eq("status", 1).like("title", "订单").orderByDesc("create_time") - 注意字段名必须和数据库列名一致,拼错不会报错,运行时查不到数据或报 SQL 异常
LambdaQueryWrapper:方法引用字段,更安全
推荐在 Java 8+ 项目中作为默认选择。它用 User::getName 这样的写法代替字符串,编译器能检查字段是否存在、类型是否匹配。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 写法示例:
new LambdaQueryWrapper<User>().eq(User::getName, "张三").ge(User::getAge, 18) - 重构友好:如果把
getName()改成getFullName(),所有用到这里的查询都会在编译时报错,立刻发现 - IDE 支持好:输入
User::就能自动补全 getter 方法,不易手误
怎么选?看团队和项目阶段
新项目、长期维护系统、对稳定性要求高的业务,优先用 LambdaQueryWrapper;临时脚本、原型开发、或对接老实体(getter 不规范)时,QueryWrapper 更灵活。
立即学习“Java免费学习笔记(深入)”;
- 也可以混用:QueryWrapper 提供了
.lambda()方法,临时切到 Lambda 模式,比如new QueryWrapper<User>().lambda().eq(User::getId, 123) - 两者生成的 SQL 完全一样,性能无差异,区别只在编码体验和健壮性
小提醒:别漏掉逻辑删除和空值判断
MyBatis-Plus 默认会自动加上 AND is_deleted = 0(如果实体标注了 @TableLogic)。但像 like、in 这类操作,如果传入 null 或空集合,可能生成意外 SQL —— 建议前置判空,或用 ifPresent 包一层。

















