深入解析MyBatis Plus中and与or的组合使用技巧

一、为什么需要掌握条件构造器

在日常开发中,数据库查询就像搭积木,而MyBatis Plus的QueryWrapperLambdaQueryWrapper就是最趁手的工具。特别是andor这两个方法,它们能让你像拼乐高一样灵活组合查询条件。想象一下:当你要查”年龄大于25岁或者名字叫张三,并且部门是技术部”这种复杂需求时,用它们就能轻松搞定!

MybatisPlus中and()和or()如何使用

二、and基础:链式拼接条件

and是默认的连接方式,就像用”并且”把条件串起来。举个实际例子:

QueryWrapper wrapper = new QueryWrapper;
wrapper.eq(“department”, “技术部”)
.and(w -> w.gt(“age”, 25).or.eq(“name”, “张三”));

这段代码生成的SQL相当于:WHERE department = '技术部' AND (age > 25 OR name = '张三')。注意看!and里面又套了个or,这就是多层嵌套的妙用。

三、or实战:实现条件分支

当需要满足任意条件时,or就派上用场了。比如查”状态为启用或者注册超过30天的用户”:

LambdaQueryWrapper lambda = new LambdaQueryWrapper;
lambda.eq(User::getStatus, 1)
.or
.gt(User::getCreateTime, LocalDate.now.minusDays(30));

这里用Lambda表达式更直观,生成的SQL是:WHERE status = 1 OR create_time > '2025-12-20'。注意or前后条件平级关系,就像岔路口的两条分支。

四、组合拳:and和or嵌套技巧

真正的威力在于嵌套使用!看这个复杂场景:”查技术部或产品部中,工资高于1万或者工龄满3年的员工”:

wrapper.and(w ->
w.in("department", "技术部", "产品部")
.and(
sub -> sub.gt("salary", 10000).or.ge("work_years", 3)
);

生成的SQL结构如下:

层级 条件逻辑
外层 department IN (…) AND (…)
内层 salary > 10000 OR work_years >= 3

通过多层and嵌套or,就像俄罗斯套娃一样逐层封装条件。

五、Lambda表达式:更优雅的写法

用LambdaQueryWrapper能避免魔法值,IDE还会自动补全字段名:

lambda.and(lq ->
lq.in(User::getDept, Arrays.asList("技术部","产品部"))
.or
.gt(User::getSalary, 10000)
);

对比普通Wrapper的优点:

  • 编译期检查字段名,避免拼写错误
  • 重构字段时自动更新
  • 代码可读性更强

六、避坑指南:优先级陷阱

新手常踩的坑是条件优先级错乱。比如想查”(A且B)或C”,结果写成:

wrapper.eq(“A”,1).eq(“B”,2).or.eq(“C”,3) // 错误!实际是 A=1 AND B=2 OR C=3

正确做法是用括号包裹:

wrapper.and(w -> w.eq("A",1).eq("B",2)).or.eq("C",3)

记住这个黄金法则:显式用and/or方法划分条件组,相当于SQL的括号

七、性能优化建议

当组合条件特别复杂时:

  • 超过5层嵌套时,考虑拆分成多个Wrapper用apply拼接
  • OR连接的条件字段尽量建联合索引
  • exists替代部分or子查询

曾有个案例:把30个OR条件改成field IN (...)后,查询速度从2.3秒提升到0.1秒

八、最佳实践总结

最后分享几个实战经验:

  1. 简单条件直接用链式调用,比如.eq.lt
  2. 出现OR逻辑时,立即用orand(子条件)显式分隔
  3. 优先选LambdaWrapper避免字段名错误
  4. 超复杂查询可转用XML写SQL,别硬扛

就像厨师掌握火候,多练习几次条件组合,你就能在MyBatis Plus中写出既高效又优雅的查询

内容均以整理官方公开资料,价格可能随活动调整,请以购买页面显示为准,如涉侵权,请联系客服处理。

本文由星速云发布。发布者:星速云。禁止采集与转载行为,违者必究。出处:https://www.67wa.com/150173.html

(0)
上一篇 2026年1月20日 上午8:26
下一篇 2026年1月20日 上午8:26
联系我们
关注微信
关注微信
分享本页
返回顶部