QueryWrapper wrapper = new QueryWrapper<>(); if (!overhaulPlanReviewDTO.getDydj().isEmpty()){ wrapper.eq("dydj", overhaulPlanReviewDTO.getDydj()); } if (!overhaulPlanReviewDTO.getSqdw().isEmpty()){ wrapper.eq("sqdw", overhaulPlanReviewDTO.getSqdw()); } if (!overhaulPlanReviewDTO.getTdsb().isEmpty()){ wrapper.eq("tdsb", overhaulPlanReviewDTO.getTdsb()); } if (!overhaulPlanReviewDTO.getYzjh().isEmpty()){ wrapper.eq("yzjh", overhaulPlanReviewDTO.getYzjh()); } if (!overhaulPlanReviewDTO.getJhlx().isEmpty()){ wrapper.eq("jhlx", overhaulPlanReviewDTO.getJhlx()); } if (!overhaulPlanReviewDTO.getGzdw().isEmpty()){ wrapper.eq("gzdw", overhaulPlanReviewDTO.getGzdw()); } if (!overhaulPlanReviewDTO.getGlbm().isEmpty()){ wrapper.eq("glbm", overhaulPlanReviewDTO.getGlbm()); } if (!overhaulPlanReviewDTO.getDwfx().isEmpty()){ wrapper.eq("dwfx", overhaulPlanReviewDTO.getDwfx()); } if (!overhaulPlanReviewDTO.getZyfx().isEmpty()){ wrapper.eq("zyfx", overhaulPlanReviewDTO.getZyfx()); } if (!overhaulPlanReviewDTO.getType().isEmpty()){ wrapper.eq("type", overhaulPlanReviewDTO.getType()); } if (overhaulPlanReviewDTO.getStarttime()!=null){ wrapper.ge("starttime", overhaulPlanReviewDTO.getStarttime()); } if (overhaulPlanReviewDTO.getEndtime()!=null){ wrapper.le("endtime", overhaulPlanReviewDTO.getEndtime()); }前端传了一些条件,我如何是这些判断代码更精简优雅
时间: 2025-06-23 10:16:15 浏览: 0
<think>好的,我现在需要帮助用户简化MyBatis Plus的QueryWrapper多条件动态查询代码。用户提到多个条件判断语句,想要简化和优化。首先,我得回想一下MyBatis Plus中处理动态查询的常用方法。
用户可能是在每个条件前都用了if语句来判断是否添加条件,这样会导致代码冗长,尤其是条件多的时候。比如:
QueryWrapper<User> wrapper = new QueryWrapper<>();
if (name != null) {
wrapper.eq("name", name);
}
if (age != null) {
wrapper.ge("age", age);
}
...
这种情况下,每个条件都要写if判断,重复代码多。有没有办法把这些条件判断统一处理呢?
我记得MyBatis Plus的QueryWrapper支持链式调用,同时可以结合Java 8的Optional或者函数式编程来简化。例如,使用Optional来避免null检查:
wrapper.eq(StringUtils.isNotBlank(name), "name", name)
.ge(age != null, "age", age);
这样每个条件方法都有一个布尔参数,可以判断是否添加该条件。但用户可能已经知道这种方式,所以需要更进一步的优化。
另外,用户可能是希望将多个条件动态地构建,比如根据前端传入的参数对象动态添加条件。这时候可以用Java 8的Consumer或者函数式接口来处理。例如,定义一个方法,接受多个Consumer来组合条件:
public QueryWrapper<User> buildQueryWrapper(UserQuery query) {
return new QueryWrapper<User>()
.eq(query.getName() != null, "name", query.getName())
.ge(query.getAge() != null, "age", query.getAge())
...;
}
或者使用流式API,但可能不太适用。另一种方法是利用Lambda表达式和条件封装,将每个条件判断封装成函数,然后依次应用。
可能还需要考虑使用注解或者工具类来生成条件,但这样可能会增加复杂度。用户可能希望的是代码简洁,减少重复的if语句,所以重点应该在如何利用QueryWrapper自身的方法来简化。
总结下来,最直接的方法是利用QueryWrapper的条件方法中的布尔参数,直接在链式调用中判断,无需每个条件都写if语句。这样代码会更简洁,例如:
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq(name != null, "name", name)
.ge(age != null, "age", age)
.like(email != null, "email", email);
这样每个条件都附带一个布尔判断,当条件满足时才添加。这样代码量大大减少,结构也更清晰。
此外,如果条件参数封装在一个对象中,可以使用Java 8的Optional来进一步简化,避免重复的空检查:
UserQuery query = ...;
QueryWrapper<User> wrapper = new QueryWrapper<>();
Optional.ofNullable(query.getName()).ifPresent(name -> wrapper.eq("name", name));
Optional.ofNullable(query.getAge()).ifPresent(age -> wrapper.ge("age", age));
不过这种方法可能不如直接在条件方法中使用布尔参数简洁,而且需要处理多个Optional语句。
另外,还可以考虑使用MyBatis Plus的LambdaQueryWrapper,通过方法引用来避免字段名的字符串硬编码,提高类型安全性:
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, name)
.ge(age != null, User::getAge, age);
这样即使字段名改变,代码也不需要修改,同时结合布尔参数来判断是否添加条件。
综合来看,最优化的方法应该是结合LambdaQueryWrapper和条件方法中的布尔参数,这样既简洁又安全。同时,如果存在大量重复的条件判断,可以提取成工具方法,进一步复用代码。
可能还需要提醒用户注意空值处理,以及参数校验的问题,确保条件添加的正确性。例如,当字符串为空时是否应该忽略该条件,或者是否需要模糊查询等。
最后,生成相关问题需要考虑用户可能进一步的需求,比如如何处理动态排序,或者更复杂的条件组合,比如AND和OR的混合使用,或者如何复用查询条件等。</think>### 简化MyBatis Plus QueryWrapper多条件动态查询的方法
#### 1. 使用链式条件方法 + 布尔参数
MyBatis Plus的`QueryWrapper`和`LambdaQueryWrapper`支持在条件方法中直接添加布尔参数,仅在条件为`true`时添加查询条件:
```java
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(StringUtils.isNotBlank(name), User::getName, name)
.ge(age != null, User::getAge, age)
.like(StringUtils.isNotBlank(email), User::getEmail, "%" + email + "%");
```
- **优点**:无需`if`判断,直接链式调用
- **注意**:空字符串需用`StringUtils.isNotBlank`判断,数值类型可用`!= null`
#### 2. 封装条件构建过程(适用于复杂场景)
通过`Consumer<LambdaQueryWrapper>`实现条件复用:
```java
public LambdaQueryWrapper<User> buildWrapper(UserQuery query) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
Optional.ofNullable(query).ifPresent(q -> {
addCondition(wrapper, q.getName(), User::getName);
addCondition(wrapper, q.getAge(), User::getAge);
});
return wrapper;
}
private <T> void addCondition(LambdaQueryWrapper<User> wrapper, T value, SFunction<User, T> column) {
if (value != null) {
wrapper.eq(column, value);
}
}
```
#### 3. 使用Filter工具类(通用性扩展)
创建条件过滤器工具类统一处理空值:
```java
public class QueryFilter {
public static <T> void applyEquals(LambdaQueryWrapper<T> wrapper, Object value, SFunction<T, ?> column) {
if (value != null) {
wrapper.eq(column, value);
}
}
public static <T> void applyRange(LambdaQueryWrapper<T> wrapper, Comparable min, Comparable max, SFunction<T, ?> column) {
if (min != null) wrapper.ge(column, min);
if (max != null) wrapper.le(column, max);
}
}
// 调用示例
QueryFilter.applyEquals(wrapper, name, User::getName);
QueryFilter.applyRange(wrapper, minAge, maxAge, User::getAge);
```
#### 4. 动态条件组合(带逻辑控制)
使用`Function`实现条件分支:
```java
public LambdaQueryWrapper<User> buildDynamicQuery(UserQuery query) {
return new LambdaQueryWrapper<User>()
.and(q -> q
.when(query.getType() == 1,
w -> w.eq(User::getRole, "admin"))
.when(query.getType() == 2,
w -> w.between(User::getCreateTime, start, end))
);
}
```
#### 优化前后对比
**优化前**:
```java
QueryWrapper<User> wrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(name)) {
wrapper.eq("name", name);
}
if (age != null) {
wrapper.ge("age", age);
}
// 更多重复条件判断...
```
**优化后**:
```java
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>()
.eq(StringUtils.isNotBlank(name), User::getName, name)
.ge(age != null, User::getAge, age)
.nested(q -> q
.like(StringUtils.isNotBlank(keyword), User::getBio, keyword)
.or()
.like(StringUtils.isNotBlank(keyword), User::getRemark, keyword)
);
```
### 最佳实践建议
1. **优先使用LambdaQueryWrapper**:避免字段名的硬编码,提高代码可维护性
2. **空值处理原则**:
- 字符串使用`StringUtils.isNotBlank`
- 数值类型使用`!= null`
- 集合类型使用`CollectionUtils.isNotEmpty`
3. **复杂条件**:使用`and()`/`or()`进行嵌套查询
4. **性能优化**:索引字段优先作为首查询条件
阅读全文
相关推荐

















