如何在MyBatis-Plus中使用AND和OR组合条件?
时间: 2025-07-09 21:11:15 浏览: 10
### 3.1 基于 QueryWrapper 的 AND 和 OR 组合查询
在 MyBatis-Plus 中,使用 `QueryWrapper` 可以实现复杂的 AND 和 OR 条件组合查询。通过 `.eq()`、`.gt()`、`.like()` 等方法设置查询条件,并结合 `.and()` 和 `.or()` 方法进行逻辑连接。
例如,若需查询状态为“启用”(status = 1)且年龄等于 30 或姓名包含 “John” 的用户记录:
```java
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", 1)
.and(wq -> wq.eq("age", 30).or().like("name", "John"));
List<User> users = userMapper.selectList(queryWrapper);
```
生成的 SQL 如下:
```sql
SELECT * FROM user WHERE status = 1 AND (age = 30 OR name LIKE '%John%')
```
该语句将返回所有状态为“启用”并且满足年龄等于 30 或者姓名中包含 “John” 的用户记录[^3]。
### 3.2 使用 LambdaQueryWrapper 实现类型安全的 AND/OR 查询
相比 `QueryWrapper`,`LambdaQueryWrapper` 提供了更安全的类型检查机制,避免字段名拼写错误的问题。同样可以实现 AND 和 OR 的复杂组合逻辑。
例如,查询状态为“启用”且年龄大于 30,或者姓名包含 “Tom” 的用户:
```java
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getStatus, 1)
.and(wrapper -> wrapper.gt(User::getAge, 30).or().like(User::getName, "Tom"));
List<User> users = userMapper.selectList(lambdaQueryWrapper);
```
生成的 SQL 为:
```sql
SELECT * FROM user WHERE status = 1 AND (age > 30 OR name LIKE '%Tom%')
```
这种方式不仅提高了代码可读性,也增强了编译时的类型安全性[^2]。
### 3.3 嵌套条件中的 AND 和 OR 组合
对于更复杂的嵌套查询场景,可以使用多层 `.and()` 和 `.or()` 方法来构建条件结构。例如,查找同时满足 `(name = '张三' AND age > 30)` 或 `(name = '李四' AND age < 25)` 的记录:
```java
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.and(wrapper1 -> wrapper1.eq("name", "张三").gt("age", 30))
.or()
.and(wrapper2 -> wrapper2.eq("name", "李四").lt("age", 25));
```
最终生成的 SQL 为:
```sql
SELECT * FROM user WHERE (name = '张三' AND age > 30) OR (name = '李四' AND age < 25)
```
这种写法支持对多个子条件进行分组并灵活应用逻辑运算符,从而构建出高度定制化的查询条件[^1]。
### 相关注意事项
- 在构造复杂查询条件时,应确保理解最终生成的 SQL 结构,以避免因逻辑错误导致结果偏差。
- 对于涉及动态参数的查询,建议使用 Lambda 表达式增强类型安全性。
- 测试阶段应充分验证每种条件组合的行为是否符合预期,尤其是在生产环境中使用前应进行充分测试。
阅读全文
相关推荐


















