当前位置: 首页 > 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.jsqmd.com/news/927298/

相关文章:

  • 2026年评价高的山东壁挂式水表箱/SMC水表箱/山东SMC水表箱/山东户外水表箱高口碑品牌推荐 - 行业平台推荐
  • Kylin Server-10 SP1安装VMTools报错‘Device or resource busy’?手把手教你排查与修复
  • 写论文总担心重复率?书匠策AI免费查重,这个工具你必须知道!
  • 一根网线搞定!零显示器用Windows笔记本SSH连接树莓派5的保姆级避坑指南
  • [STM8] 把 STM8S 的 ADC 玩明白:一个连续采集的ADC项目
  • 输电线植物入侵检测数据集6582张VOC+YOLO格式
  • 别再只用Aircrack-ng了!用Kali Linux的Kismet做WiFi网络扫描,可视化界面更友好
  • Go语言并发模式深度解析
  • 2026年知名的实力派窗帘品牌/原创窗帘品牌可靠供应商推荐 - 品牌宣传支持者
  • 2026年云南昆明三角梅培育基地/昆明基地/昆明绣球基地/昆明亚麻基地采购必看榜 - 行业平台推荐
  • 神经网络与深度学习第四周学习笔记(3/4)
  • 别再折腾环境了!手把手教你用Vivado 2018.3和Modelsim 22.04搞定联合仿真(附库编译避坑指南)
  • 保姆级教程:在Deepin V23上配置xrdp+x11vnc,实现Windows远程桌面稳定连接
  • 2026年5月企业AI操作系统推荐:TOP5评测市场份额专业选择指南办公协同案例
  • 别再手动写多选了!手把手教你封装一个uView Picker多选组件(附完整源码)
  • 基于Python+Django的私有化云笔记系统:从痛点分析到完整实现
  • 2026年口碑好的肥东县窗帘/庐阳区窗帘/肥西县窗帘厂家精选合集 - 行业平台推荐
  • 跨境电商独立站2026最新从0-1完整搭建流程
  • AI时代新型攻击:从对抗样本到数据投毒的防御体系重构
  • 从0到1吃透Pandas!Python数据分析零基础实战教程
  • 8张RTX 4090实测:MedicalGPT项目全流程训练中的显存分配与参数调优实战记录
  • 基于助睿平台的浏览器市场与用户画像分析-数据加工
  • 2026年口碑好的基地/绣球基地/亚麻基地/三角梅养殖基地精选推荐榜 - 品牌宣传支持者
  • 2026年热门的岩棉净化板/甘肃净化板厂家精选合集 - 品牌宣传支持者
  • 保姆级教程:用Python脚本将OPIXray/HIXray安检X光数据集转成YOLO格式(附完整代码)
  • 从‘刻舟求剑’到‘乒乓切换’:图解STM32H7中DMA双缓存与Cache的协同工作
  • 2026年评价高的庐阳区窗帘/合肥窗帘/包河区窗帘/新站区窗帘长期合作厂家推荐 - 品牌宣传支持者
  • 广度优先搜索 (BFS)
  • 第 5 周——诗词创作模块后端接口对接
  • 2026年比较好的梁山水处理乳品设备/梁山乳品设备/离心机乳品设备/均质机乳品设备精选推荐公司 - 行业平台推荐