【工作笔记】Wrappers.lambdaQuery()用法
Wrappers.lambdaQuery()
是 MyBatis-Plus 提供的 “一行代码构造查询条件” 的快捷工具。
它返回一个 LambdaQueryWrapper<T>
,好处是完全类型安全、无硬编码字符串,IDE 还能自动补全字段。
1. 最常用 3 步
// 1. 创建 Wrapper
LambdaQueryWrapper<Order> wrapper = Wrappers.lambdaQuery(Order.class);// 2. 链式拼条件
wrapper.eq(Order::getStatus, 1).between(Order::getCreateTime, start, end).likeRight(Order::getCustomer, "ABC");// 3. 丢给 Mapper
List<Order> list = orderMapper.selectList(wrapper);
一行写法:
List<Order> list = orderMapper.selectList(Wrappers.<Order>lambdaQuery().eq(Order::getStatus, 1).between(Order::getCreateTime, start, end)
);
2. 条件大全(几乎覆盖所有 SQL 片段)
方法 | 对应 SQL | 示例 |
---|---|---|
eq | = | .eq(User::getAge, 18) |
ne | <> | .ne(User::getStatus, 0) |
gt / ge | > / >= | .gt(User::getScore, 60) |
lt / le | < / <= | .le(User::getBirthday, now) |
like / likeLeft / likeRight | LIKE '%xx%' / '%xx' / 'xx%' | .like(User::getName, "张") |
in / notIn | IN (...) | .in(User::getId, idList) |
isNull / isNotNull | IS NULL | .isNull(User::getEmail) |
between | BETWEEN a AND b | .between(User::getAge, 18, 30) |
orderByAsc / orderByDesc | ORDER BY | .orderByDesc(User::getCreateTime) |
last | 末尾直接拼 SQL(慎用) | .last("limit 1") |
3. 动态条件(if/else 场景)
LambdaQueryWrapper<Order> wrapper = Wrappers.lambdaQuery();
if (status != null) {wrapper.eq(Order::getStatus, status);
}
if (StringUtils.isNotBlank(keyword)) {wrapper.like(Order::getCustomer, keyword);
}
4. 与 new LambdaQueryWrapper<>()
的区别
new LambdaQueryWrapper<>()
需要手动new
。Wrappers.lambdaQuery()
本质是静态工厂,代码更短,还能自动推断泛型。
等价写法:
LambdaQueryWrapper<Order> w1 = new LambdaQueryWrapper<>();
LambdaQueryWrapper<Order> w2 = Wrappers.lambdaQuery(Order.class);
5. 与 QueryWrapper
的对比
对比点 | QueryWrapper | LambdaQueryWrapper |
---|---|---|
拼字段 | 字符串 "name" | 方法引用 User::getName |
安全性 | 易拼错 | 编译期检查 |
IDE 提示 | 无 | 自动补全 |
conclusion
Wrappers.lambdaQuery()
就是 MyBatis-Plus 提供的“类型安全、链式、零字符串硬编码”的查询条件构造器。会用这一个,基本就不用再手写 XML 里的 <where>
、<if>
了。