当前位置: 首页 > news >正文

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("订单号重复");}// 创建订单逻辑...
}

http://www.dtcms.com/a/482243.html

相关文章:

  • STM32与W25Q64 SPI通信全解析
  • 创办个人网站淘客怎样做网站
  • 网站流量用完了湘潭网络公司
  • Cogent DataHub vs Kepware,两大工业数据中间件的深度对比分析
  • ElasticSearch沙盒绕过漏洞复现:原理详解+环境搭建+渗透实践(CVE-2015-1427)
  • 学习笔记《区块链技术与应用》ETH 第三天 GHOST协议
  • 分辨海外IP是否为住宅IP的方法
  • 处理文本编辑器存的json格式报错问题,对编辑器存的字段进行转换处理,再通过json返回
  • 电子电气架构 --- 智能化浪潮下汽车软件架构的革新与生态重构
  • 【春秋云镜】CVE-2024-9047 Wordpress File Upload 插件 文件遍历漏洞
  • yahoo怎么提交网站下载拼多多app免费下载
  • php网站怎么注入网业协同是什么意思
  • 天机学堂day10领取优惠券接口编写mapper层sql语句时无法解析表的解决办法(更加完整、详细图解)
  • 力扣Hot100--102.二叉树的层序遍历
  • 【Linux】udp网络程序
  • 网站首页地址 网站域名海外购物商城
  • 解码Linux文件IO之标准IO
  • React惰性初始化函数(Lazy Initializer)(首次渲染时执行一次,只执行一次,应对昂贵初始化逻辑)(传入一个函数、传入函数)
  • C++中的类
  • 网站上线 流程wordpress禁止加载谷歌字体
  • 阿里云是做网站的吗榆林公司做网站
  • 2018年10月江苏省自考《信息组织》试题
  • 跨域处理的核心是解决浏览器的“同源策略”限制,主流方案
  • Web 开发 30
  • 小迪web自用笔记62
  • Nginx 代理 WebSocket 失败排查全过程:从 426 到连接成功的完整复盘
  • multi-head attention 多头注意力实现细节
  • 第七章 完整的模型训练
  • 08-Vue3组合式API最佳实践指南
  • 山东网站建设网站做全世界的生意的网站