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

二、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秒!
八、最佳实践总结
最后分享几个实战经验:
- 简单条件直接用链式调用,比如
.eq.lt - 出现OR逻辑时,立即用
or或and(子条件)显式分隔 - 优先选LambdaWrapper避免字段名错误
- 超复杂查询可转用XML写SQL,别硬扛
就像厨师掌握火候,多练习几次条件组合,你就能在MyBatis Plus中写出既高效又优雅的查询!
内容均以整理官方公开资料,价格可能随活动调整,请以购买页面显示为准,如涉侵权,请联系客服处理。
本文由星速云发布。发布者:星速云。禁止采集与转载行为,违者必究。出处:https://www.67wa.com/150173.html