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

别再写满屏的if-else了!用Mybatis-Plus的QueryWrapper和UpdateWrapper重构你的业务代码(附实战案例)

告别if-else地狱:Mybatis-Plus动态条件构造器的工程实践

在电商订单管理后台,我们经常看到这样的代码:

public List<Order> queryOrders(OrderQueryDTO dto) { if (dto.getOrderNo() != null) { if (dto.getStatus() != null) { if (dto.getStartTime() != null) { // 更多嵌套if... } } } // 实际SQL执行 }

这种代码不仅难以维护,更会在业务复杂时变成"代码沼泽"。Mybatis-Plus的QueryWrapper和UpdateWrapper正是为解决这类问题而生,它们像瑞士军刀一样,让动态SQL构建变得优雅而高效。

1. 条件构造器核心价值解析

1.1 传统条件处理的三大痛点

  • 可读性灾难:多层嵌套的if-else语句让代码逻辑支离破碎
  • 维护成本高:新增查询条件需要修改原有代码结构
  • 类型不安全:字符串硬编码字段名容易拼写错误且IDE无法提示

1.2 Wrapper设计哲学对比

特性传统方式Wrapper方式
条件组合硬编码if判断链式方法调用
字段引用字符串字面量Lambda表达式
逻辑关系显式控制流声明式构建
类型安全无编译期检查强类型检查
// 传统方式 if (user.getAge() > 18) { query.where("age > 18"); } // Wrapper方式 wrapper.gt(User::getAge, 18);

2. QueryWrapper深度应用指南

2.1 基础查询构建模式

构建电商订单查询时,典型场景如下:

public Page<Order> queryOrders(OrderQueryVO vo) { return new LambdaQueryChainWrapper<>(orderMapper) .eq(vo.getOrderNo() != null, Order::getOrderNo, vo.getOrderNo()) .ge(vo.getStartTime() != null, Order::getCreateTime, vo.getStartTime()) .le(vo.getEndTime() != null, Order::getCreateTime, vo.getEndTime()) .in(CollectionUtils.isNotEmpty(vo.getStatusList()), Order::getStatus, vo.getStatusList()) .page(vo.toPage()); }

提示:LambdaQueryChainWrapper可直接返回Mapper查询结果,减少样板代码

2.2 动态条件组合技巧

处理多条件筛选时,可采用条件谓词:

wrapper.nested(w -> w .like(StringUtils.isNotBlank(keyword), Product::getName, keyword) .or() .like(StringUtils.isNotBlank(keyword), Product::getCode, keyword) ).eq(Product::getDeleted, 0);

对应生成的SQL:

WHERE (name LIKE '%手机%' OR code LIKE '%phone%') AND deleted = 0

3. UpdateWrapper实战精要

3.1 智能更新策略

CMS内容状态批量更新示例:

public void batchUpdateStatus(List<Long> ids, Integer status) { new LambdaUpdateWrapper<>(Article.class) .in(Article::getId, ids) .set(Article::getStatus, status) .set(status == PUBLISHED, Article::getPublishTime, LocalDateTime.now()) .update(); }

注意:set方法的第一个参数支持条件判断,实现条件更新

3.2 增量更新方案

避免全字段更新的优雅实现:

public void updateProductStock(Long id, int delta) { new UpdateWrapper<>(Product.class) .setSql("stock = stock + " + delta) .eq("id", id) .update(); }

4. 复杂业务场景解决方案

4.1 多表关联查询优化

使用Wrapper实现安全join:

public List<OrderDetailDTO> queryOrderDetails(Long orderId) { return orderMapper.selectJoinList(new LambdaQueryWrapper<Order>() .select(Order::getOrderNo, Order::getCreateTime) .select(OrderItem::getProductName, OrderItem::getQuantity) .eq(Order::getId, orderId) .leftJoin(OrderItem.class, OrderItem::getOrderId, Order::getId)); }

4.2 动态排序方案

前端传参动态排序实现:

wrapper.orderBy(StringUtils.isNotBlank(sortField), "asc".equals(sortOrder), sortField);

5. 工程化最佳实践

5.1 性能优化要点

  • 避免N+1查询:使用selectMaps替代selectList减少对象转换开销
  • 索引命中:确保Wrapper条件顺序与联合索引顺序一致
  • SQL打印:开发环境开启sql打印校验生成语句
# application.yml mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5.2 安全防护策略

风险类型防护措施示例代码
SQL注入始终使用参数化构造wrapper.eq("name", param)
全表更新强制要求where条件全局拦截器检查
字段暴露使用select指定返回字段wrapper.select("id,name")

在大型电商系统中,我们通过Wrapper重构后,订单查询模块的代码量减少40%,而可维护性显著提升。特别是在促销活动期间,动态条件组合让应对各种查询需求变得游刃有余。

http://www.rkmt.cn/news/1438630.html

相关文章:

  • 2026年评价高的山东壁挂式水表箱/SMC水表箱/山东SMC水表箱/山东户外水表箱高口碑品牌推荐 - 行业平台推荐
  • 写论文总担心重复率?书匠策AI免费查重,这个工具你必须知道!
  • Go语言并发模式深度解析
  • 别再只用Aircrack-ng了!用Kali Linux的Kismet做WiFi网络扫描,可视化界面更友好
  • 别再折腾环境了!手把手教你用Vivado 2018.3和Modelsim 22.04搞定联合仿真(附库编译避坑指南)
  • 神经网络与深度学习第四周学习笔记(3/4)
  • 保姆级教程:在Deepin V23上配置xrdp+x11vnc,实现Windows远程桌面稳定连接
  • 从0到1吃透Pandas!Python数据分析零基础实战教程
  • 从‘刻舟求剑’到‘乒乓切换’:图解STM32H7中DMA双缓存与Cache的协同工作
  • 2026年评价高的庐阳区窗帘/合肥窗帘/包河区窗帘/新站区窗帘长期合作厂家推荐 - 品牌宣传支持者
  • 广度优先搜索 (BFS)
  • 2026年质量好的共挤膜气泡膜卷/彩色气泡膜卷可靠供应商推荐 - 行业平台推荐
  • 2026年比较好的梁山水处理乳品设备/梁山乳品设备/离心机乳品设备/均质机乳品设备精选推荐公司 - 行业平台推荐
  • 别再只用Aircrack了!横向评测Kismet与airodump-ng:无线网络扫描工具到底怎么选?
  • 用STM32F103和继电器DIY智能家居:低成本改造台灯与风扇的保姆级教程
  • 构建个人增强系统:从可穿戴设备到生物反馈的实践指南
  • CRAFT框架:大模型驱动的多机器人协同训练技术解析
  • 2026年知名的浙江机房建设方案/机房建设施工方案榜单优选公司 - 行业平台推荐
  • 2026年口碑好的挂布台车/多功能台车/浙江隧道台车高口碑品牌推荐 - 品牌宣传支持者
  • 【Gemini安全红皮书首发】:基于MITRE ATTCK框架的5类攻击面测绘+自动化检测脚本(限前500名开发者领取)
  • 2026年口碑好的硅岩净化板/净化板/岩棉净化板推荐品牌厂家 - 行业平台推荐
  • 基于Azure AI Studio与RAG架构构建私有数据AI助手实战指南
  • 2026年质量好的胡辣汤/逍遥镇胡辣汤/羊肉胡辣汤/面筋胡辣汤加盟热门榜 - 行业平台推荐
  • 深度学习花卉识别笔记
  • 2026年知名的均质机乳品设备/离心机乳品设备主流厂家对比评测 - 品牌宣传支持者
  • 量子密钥分发安全挑战与混合QLSTM防御方案
  • 2026年热门的安防监控弱电工程/园区门禁弱电工程/楼宇安防弱电工程专业公司推荐 - 行业平台推荐
  • DS390芯片4K SRAM配置与栈优化实战
  • Cobalt Strike上线后的实战操作指南:Beacon操控、权限提升与内网横向移动
  • 从特斯拉Optimus看具身智能:人形机器人的技术架构与工程挑战