MyBatis-Plus推荐使用LambdaQueryWrapper替代QueryWrapper,通过方法引用(如User::getName)指定字段,实现编译期类型校验、避免字符串硬编码、提升重构安全性与IDE支持。

MyBatis-Plus 提供了基于 Lambda 表达式的条件构造器(如 QueryWrapper 和 LambdaQueryWrapper),能避免硬编码字段名,提升类型安全性和重构友好性。核心是用 LambdaQueryWrapper 替代普通 QueryWrapper,配合方法引用(User::getName)指定字段。
使用 LambdaQueryWrapper 构建类型安全查询
直接传入实体类 Class,并用 lambda() 工厂方法创建包装器,字段通过方法引用指定,编译期即可校验字段是否存在:
- ✅ 正确写法(推荐):
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getAge, 25) .like(User::getName, "张"); List<User> users = userMapper.selectList(wrapper); - ❌ 避免写字符串字段名:
eq("age", 25)容易拼错且无法被 IDE 检查,重构字段名时会失效。
支持的 Lambda 条件方法示例
所有 QueryWrapper 的条件方法在 LambdaQueryWrapper 中都有对应版本,参数首项为 SFunction<T, ?>(即方法引用):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
eq(User::getStatus, 1)→status = 1 -
in(User::getId, Arrays.asList(1L, 2L, 3L))→id IN (1,2,3) between(User::getCreateTime, startTime, endTime)-
orderByDesc(User::getUpdateTime)(排序也支持 Lambda) -
select(User::getId, User::getName, User::getEmail)(只查指定字段,类型安全)
结合 Wrapper 的嵌套与动态条件
LambdaQueryWrapper 同样支持 and()、or()、apply() 等高级用法,且内部嵌套也可用 Lambda:
立即学习“Java免费学习笔记(深入)”;
- 动态组合(空值跳过):
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); if (StringUtils.isNotBlank(name)) { wrapper.like(User::getName, name); } if (age != null) { wrapper.eq(User::getAge, age); } - 嵌套 AND 条件:
wrapper.and(w -> w.eq(User::getStatus, 1).like(User::getName, "李"));
注意事项与常见问题
使用 Lambda 表达式需注意几点,避免运行时报错:
- 实体类字段必须有标准 getter 方法(如
getUserName()),否则方法引用无法解析; - 不支持静态字段、非 public getter 或 Lombok 未正确生成 getter 的情况(确认加了
@Data或@Getter); - 若用
QueryWrapper调lambda(),本质仍是字符串方式,应直接用LambdaQueryWrapper; - 复杂 SQL(如函数表达式)仍需用
apply(),但字段部分仍可用 Lambda,例如:apply("DATE_FORMAT(create_time,'%Y-%m') = {0}", "2024-06")—— 这里create_time无法用 Lambda,但可配合select(User::getId, User::getName)保证返回字段类型安全。

















