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

MyBatis Plus QueryWrapper:从入门到精通的动态查询构建指南

1. QueryWrapper基础入门

第一次接触MyBatis Plus的QueryWrapper时,我完全被它的简洁性震惊了。记得以前用原生MyBatis时,为了写一个简单的条件查询,不得不在XML里写一大堆if标签,现在只需要几行Java代码就能搞定。QueryWrapper本质上是一个条件构造器,它把SQL查询条件用面向对象的方式封装起来,让我们可以用更符合Java习惯的方式来构建查询。

先来看个最简单的例子。假设我们有个用户表user,要查询所有年龄大于18岁的用户,传统方式可能要写SQL语句,但用QueryWrapper可以这样:

QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.gt("age", 18); List<User> userList = userMapper.selectList(wrapper);

这段代码读起来就像在说:"给我创建一个查询包装器,条件是age大于18,然后执行查询"。是不是特别直观?QueryWrapper支持的方法非常丰富,几乎涵盖了所有SQL条件操作:

  • eq:等于 =
  • ne:不等于 <>
  • gt:大于 >
  • ge:大于等于 >=
  • lt:小于 <
  • le:小于等于 <=
  • between:BETWEEN 值1 AND 值2
  • like:LIKE '%值%'
  • in:IN (v1, v2, ...)

我在实际项目中最常用的就是eq和like了。比如要查询名字叫"张三"的用户:

wrapper.eq("name", "张三");

或者模糊查询名字包含"张"的用户:

wrapper.like("name", "张");

2. 动态查询构建技巧

动态查询是QueryWrapper最强大的特性之一。想象一下电商网站的商品筛选功能:用户可能选择价格区间、品牌、分类等各种条件的组合。如果用传统方式,我们得写一大堆if-else来拼接SQL,而QueryWrapper让这个过程变得异常简单。

我常用的动态构建方式有两种。第一种是链式调用:

QueryWrapper<Product> wrapper = new QueryWrapper<>(); wrapper.eq(StringUtils.isNotBlank(category), "category", category) .between(priceMin != null && priceMax != null, "price", priceMin, priceMax) .like(StringUtils.isNotBlank(keyword), "name", keyword);

这里用到了QueryWrapper方法的一个特性:很多条件方法都有重载版本,第一个参数是boolean类型,表示是否应用这个条件。这样就能很优雅地处理用户可能不传某些筛选条件的情况。

第二种方式是用Lambda表达式,这个在Java 8及以上版本特别方便:

QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(User::getAge, 18) .like(User::getName, "张");

Lambda方式最大的好处是类型安全,IDE可以自动补全,而且重构字段名时不会出错。我在大型项目中更推荐这种方式,虽然写起来稍微长一点,但维护性更好。

3. 复杂条件组合实战

当查询条件变得复杂时,QueryWrapper依然能保持代码的清晰度。比如我们要查询(年龄大于18或者名字包含"张")并且状态为激活的用户:

wrapper.and(w -> w.gt("age", 18).or().like("name", "张")) .eq("status", 1);

对应的SQL大概是:WHERE (age > 18 OR name LIKE '%张%') AND status = 1

再来看个更复杂的例子:查询某个时间段内创建的,并且(订单金额大于1000或者使用了优惠券)的订单:

wrapper.between("create_time", startDate, endDate) .and(w -> w.gt("amount", 1000).or().eq("has_coupon", 1));

在实际项目中,我经常遇到需要嵌套条件的情况。QueryWrapper的and和or方法都接受一个Consumer参数,可以无限嵌套,这让我们能构建出非常复杂的查询逻辑,同时保持代码的可读性。

4. 性能优化与最佳实践

用了QueryWrapper一段时间后,我发现了一些性能优化的技巧。首先是避免在循环中创建QueryWrapper,因为每次new一个Wrapper对象都会有些开销。我通常会复用Wrapper对象,或者使用方法链在单次操作中完成所有条件设置。

第二个重要技巧是注意select语句的字段控制。默认情况下,selectList会查询所有字段,但很多时候我们只需要部分字段:

wrapper.select("id", "name", "age");

这样可以减少网络传输和内存占用,特别是当表有很多字段但业务只需要几个的时候,性能提升很明显。

还有一个容易忽略的点是索引使用。QueryWrapper生成的SQL语句会按照条件添加的顺序来构建WHERE子句。为了让查询能用上索引,应该把选择性高的条件放在前面:

// 好的写法:user_id有索引且选择性高 wrapper.eq("user_id", 123).like("name", "张"); // 不好的写法:模糊查询放在前面可能使索引失效 wrapper.like("name", "张").eq("user_id", 123);

最后分享一个真实案例:我们系统有个分页查询接口,原本响应时间要2秒多,后来发现是因为用了多个like条件导致全表扫描。优化方法是给这些字段加了全文索引,然后改用match against语法,响应时间降到了200毫秒以内。虽然这不是QueryWrapper直接提供的功能,但提醒我们在使用条件构造器时也要考虑底层数据库的特性。

http://www.jsqmd.com/news/655181/

相关文章:

  • 闲置天猫超市卡别浪费!这样变现省心又靠谱 - 团团收购物卡回收
  • 2026 年北京丰台区汽车贴膜选型指南白皮书 - GrowthUME
  • 保姆级教程:用SQLark给达梦测试表造2万条数据,并实战分析不同索引下的执行计划变化
  • 中山留学咨询必看:中山留学中介哪家好?中山留学机构哪家好?2026中山留学中介推荐:粤教国际领衔,新加坡德国留学机构汇总 - 栗子测评
  • 【生成式AI服务弹性扩缩容黄金法则】:20年SRE专家亲授K8s+LLM推理负载自适应调度的5大核心指标与3个避坑指南
  • 磁性联轴器厂家有哪些?磁力耦合器厂家哪家好?磁力耦合器供应商有哪些?2026东莞磁性联轴器生产厂家汇总 - 栗子测评
  • 保姆级避坑指南:用Stata的xsmle命令跑空间杜宾模型(SDM),搞定豪斯曼检验报错和权重矩阵设置
  • 5大设计秘籍:如何用Bebas Neue免费开源字体打造专业级视觉冲击力
  • 实习季来临,海外求职内推机构哪家靠谱?从资源、成功率、交付力三维深度测评 - Matthewmx
  • STAR模型解析:多场景推荐系统中的星形拓扑自适应建模
  • #官方认证|2026年国内五大正规储能设备厂家排名,广东等地易钜润综合实力遥遥领先 - 十大品牌榜
  • Cursor Pro免费激活终极指南:三步解锁AI编程无限功能
  • 智慧工地安全巡检数据集 工地安全帽识别施工安全检测 安全带安全钩图像识别数据集 施工场景图像识别图像数据集 yolov13第10265期
  • 2026工业浮球开关定制厂家/食品级浮子开关厂家/浮球开关生产厂家推荐:东莞圆锋电子,液位控制一站式选型 - 栗子测评
  • 2026年超纯水设备哪家强?口碑厂家实力推荐 - 深度智识库
  • 2026氯化氢气体水分分析仪生产厂家推荐:国产实力品牌筑牢工业安全防线! - 品牌推荐大师1
  • 深入解析吉尔伯特单元:模拟CMOS集成电路设计中的可变增益放大器
  • 手机ECM麦克风差分电路设计:从原理到PCB抗干扰实战
  • 2026年天眼查行政处罚怎么修复?专业公司推荐与全流程指南 - 深圳昊客网络
  • SIMUL8仿真软件在汽车行业的应用研究
  • 深入解析 insufficient-isv-permissions 错误:ISV权限不足的排查与解决方案
  • 2026工业钛材优选厂商:宝鸡钛棒源头厂家+现货工厂+钛合金棒厂家推荐:宝鸡鹰翔钛业 - 栗子测评
  • 2026多面空心球厂家推荐/絮凝球厂家推荐/蜂窝斜管厂家推荐:宜兴事成塑料,净水填料一站式选型 - 栗子测评
  • LVGL-02 构建可复用的 LVGL SDK 层(CMake 模块化设计)
  • 3分钟掌握m4s-converter:B站缓存视频一键转MP4的终极解决方案
  • 2026年塑料袋厂家推荐榜/食品袋,包装袋,食品包装袋,宠物食品包装袋 - 品牌策略师
  • 2026水流开关定制厂家/水箱液位开关厂家推荐/接近开关厂家推荐:东莞圆锋电子,多场景工控开关甄选 - 栗子测评
  • 2026年3月诚信的PTFE微粉实力厂家推荐,耐磨剂/润滑粉/PTFE超细粉/超细粉,PTFE微粉制造商推荐 - 品牌推荐师
  • Linux内核网络故障排查指南:从驱动层到应用层的深度诊断
  • Zotero Reference终极指南:3分钟掌握PDF参考文献自动提取