前言
MyBatisPlus很方便,可以使用QueryWrapper类直接构造条件进行数据库操作,但是构造条件时一般都需要为条件值做非空判断,如果条件很多,可能需要对大量条件进行非空判断,使得代码非常冗余并难以维护。
基于这类情况,编写了QueryWrapperX类,该类扩展了 MyBatis Plus 的 QueryWrapper,主要增加了 xxxIfPresent
系列方法(如 likeIfPresent、inIfPresent 等),这些方法在值存在时才拼接到查询条件中。这避免了不必要的条件拼接,提高了查询的准确性和性能。
/**
* 拓展 MyBatis Plus QueryWrapper 类
*/
@SuppressWarnings("unused")
public class QueryWrapperX<T> extends QueryWrapper<T> {
/**
* 动态表生成规则实体
* 动态生成表名时用到
*/
@Getter
@Setter
private Object dynamicTableRule;
public QueryWrapperX<T> likeIfPresent(String column, String val) {
if (StringUtils.isNotEmpty(val)) {
return (QueryWrapperX<T>) super.like(column, val);
}
return this;
}
public QueryWrapperX<T> inIfPresent(String column, Collection<?> values) {
if (!CollectionUtils.isEmpty(values)) {
return (QueryWrapperX<T>) super.in(column, values);
}
return this;
}
public QueryWrapperX<T> inIfPresent(String column, Object... values) {
if (!ArrayUtils.isEmpty(values)) {
return (QueryWrapperX<T>) super.in(column, values);
}
return this;
}
public QueryWrapperX<T> eqIfPresent(String column, Object val) {
if (StringUtils.isNotEmpty(val)) {
return (QueryWrapperX<T>) super.eq(column, val);
}
return this;
}
public QueryWrapperX<T> neIfPresent(String column, Object val) {
if (StringUtils.isNotEmpty(val)) {
return (QueryWrapperX<T>) super.ne(column, val);
}
return this;
}
public QueryWrapperX<T> gtIfPresent(String column, Object val) {
if (StringUtils.isNotEmpty(val)) {
return (QueryWrapperX<T>) super.gt(column, val);
}
return this;
}
public QueryWrapperX<T> betweenIfPresent(String column, Object start, Object end) {
if (start != null && end != null) {
return (QueryWrapperX<T>) super.between(column, start, end);
}
return this;
}
// ========== 重写父类方法,方便链式调用 ==========
@Override
public QueryWrapperX<T> eq(boolean condition, String column, Object val) {
super.eq(condition, column, val);
return this;
}
@Override
public QueryWrapperX<T> eq(String column, Object val) {
super.eq(column, val);
return this;
}
@Override
public QueryWrapperX<T> orderByDesc(String column) {
super.orderByDesc(true, column);
return this;
}
/**
* 获取最一条数据 <br/>
* 此方法需要在最后一步调用
*
* @return {@link QueryWrapperX <T>}
*/
public QueryWrapperX<T> limit() {
return limit(1);
}
/**
* 获取最后几条数据 <br/>
* 此方法需要在最后一步调用
*
* @param limitSize 数据量
* @return {@link QueryWrapperX <T>}
*/
public QueryWrapperX<T> limit(Integer limitSize) {
if (limitSize == null) {
limitSize = 1;
}
super.last("limit " + limitSize);
return this;
}
@Override
public QueryWrapperX<T> last(String lastSql) {
super.last(lastSql);
return this;
}
}
使用示例:
public CommonResult<List<FinenessPO>> listFineness(@RequestBody FinenessQuery finenessQuery) {
QueryWrapperX<FinenessPO> queryWrapperX = new QueryWrapperX<>();
queryWrapperX.eqIfPresent(FinenessTable.id, finenessQuery.id());
queryWrapperX.likeIfPresent(FinenessTable.name, finenessQuery.getName());
List<FinenessPO> result = finenessService.list(queryWrapperX);
return CommonResult.ok(result);
}