MyBatisPlus中LambdaQueryChainWrapper链式条件查询的常用示例
场景
LambdaQueryChainWrapper 核心介绍
MyBatis-Plus 提供的链式查询封装类,支持 Lambda 表达式写法。
关键特性
类型安全 通过 实体类::方法引用 指定字段(如 StoreWithdrawLogic::getStoreId)。
链式调用 支持连续拼接多个条件(如 .eq(...).gt(...).orderBy(...))。
方法丰富 提供 eq、ne、like、in、exists 等常见 SQL 操作符的封装。
与 BaseMapper 集成 底层依赖 Mapper 接口(如 storeWithdrawLogicMapper)执行 SQL。
常用方法示例
// 多条件查询
List<StoreWithdrawLogic> list = new LambdaQueryChainWrapper<>(mapper).eq(StoreWithdrawLogic::getStatus, 1).gt(StoreWithdrawLogic::getAmount, 100).list();// 分页排序查询
Page<StoreWithdrawLogic> page = new LambdaQueryChainWrapper<>(mapper).like(StoreWithdrawLogic::getName, "测试").orderByDesc(StoreWithdrawLogic::getCreateTime).page(new Page<>(1, 10));
应用场景推荐
简单查询:直接使用 LambdaQueryChainWrapper 链式调用。
动态 SQL:结合 if 语句灵活拼接条件。
复用查询:封装为工具类或 Service 层方法。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
具体使用示例
1. 基础查询(eq、ne、like)
// 查询 name = "张三" 且 age != 18 的记录
List<User> users = new LambdaQueryChainWrapper<>(userMapper).eq(User::getName, "张三").ne(User::getAge, 18).list();// 模糊查询 name 包含 "张" 的记录
List<User> users = new LambdaQueryChainWrapper<>(userMapper).like(User::getName, "张").list();
2. 范围查询(gt、ge、lt、le、between)
// 查询 age > 18 且 age <= 30 的记录
List<User> users = new LambdaQueryChainWrapper<>(userMapper).gt(User::getAge, 18).le(User::getAge, 30).list();// 查询 createTime 在 2025-01-01 到 2025-10-14 之间的记录
List<User> users = new LambdaQueryChainWrapper<>(userMapper).between(User::getCreateTime, LocalDate.of(2025, 1, 1), LocalDate.of(2025, 10, 14)).list();
3. 排序与分页(orderBy、page)
// 按 age 降序,再按 id 升序排序
List<User> users = new LambdaQueryChainWrapper<>(userMapper).orderByDesc(User::getAge).orderByAsc(User::getId).list();// 分页查询(第 2 页,每页 10 条)
Page<User> page = new LambdaQueryChainWrapper<>(userMapper).page(new Page<>(2, 10));
4. 分组与聚合(groupBy、having)
// 按部门分组,统计每个部门的平均薪资
List<Map<String, Object>> result = new LambdaQueryChainWrapper<>(userMapper).groupBy(User::getDeptId).select(User::getDeptId,"AVG(salary) as avgSalary").listMaps();// 筛选平均薪资 > 10000 的部门
List<Map<String, Object>> result = new LambdaQueryChainWrapper<>(userMapper).groupBy(User::getDeptId).having("AVG(salary) > {0}", 10000).select(User::getDeptId,"AVG(salary) as avgSalary").listMaps();
5. 复杂条件(or、nested、apply)
// 查询 name = "张三" 或 age > 30 的记录
List<User> users = new LambdaQueryChainWrapper<>(userMapper).eq(User::getName, "张三").or().gt(User::getAge, 30).list();// 嵌套查询(类似 SQL 的 EXISTS)
List<User> users = new LambdaQueryChainWrapper<>(userMapper).inSql(User::getId, "SELECT user_id FROM orders WHERE amount > 1000").list();// 自定义 SQL 片段(如日期格式化查询)
List<User> users = new LambdaQueryChainWrapper<>(userMapper).apply("DATE_FORMAT(create_time, '%Y-%m') = '2025-10'").list();
6、exists存在性校验
优化点:
比 selectCount() > 0 性能更高(生成 SELECT 1 LIMIT 1 语句)。
// 检查邮箱是否已被注册
boolean emailExists = new LambdaQueryChainWrapper<>(userMapper).eq(User::getEmail, "user@example.com").exists();
if (emailExists) {throw new BusinessException("邮箱已存在");
}// 检查用户最近30天内是否有登录记录(截至2025-10-14)
LocalDate endDate = LocalDate.of(2025, 10, 14);
boolean recentLogin = new LambdaQueryChainWrapper<>(userMapper).eq(User::getId, userId).ge(User::getLastLoginTime, endDate.minusDays(30)).exists();
7、exist业务使用示例-防重复提交
@Transactional
public void createOrder(OrderDTO dto) {// 检查相同订单号是否已存在(防重复请求)boolean orderExists = new LambdaQueryChainWrapper<>(orderMapper).eq(Order::getOrderNo, dto.getOrderNo()).exists();if (orderExists) {throw new BusinessException("订单号重复");}// 创建订单逻辑...
}