MybatisPlus实用工具类封装
在日常实际业务开发中常常对非必传参数组装查询条件,一大堆if判断充斥在的代码中,我们可以做一层封装简化业务代码:
package com.common.util;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
import com.google.common.collect.Lists;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* MybatisPlus工具类
* @author fay
* @date 2021-12-12
*/
public class SqlPlusUtils {
private SqlPlusUtils() {}
/**
* 不为null构建 ≤ 条件,结束时间取当前最晚结束时间
* @param wrapper Wrapper
* @param column 字段列
* @param dateEnd 结束时间
* @param <R> 列
*/
public static <R> void leNonDateEnd(AbstractWrapper<?, R, ?> wrapper, R column, Date dateEnd) {
if (Objects.isNull(dateEnd)) {
return;
}
wrapper.le(column, DateUtil.endOfDay(dateEnd).toJdkDate());
}
/**
* 分组构建 in 条件,避免 in 超长
* @param wrapper Wrapper
* @param column 字段列
* @param value 值
* @param size 分组大小,≤ 1 时不分组
* @param <R> 列
*/
public static <R> void partitionIn(AbstractWrapper<?, R, ?> wrapper, R column, List<?> value, int size) {
if (CollUtil.isEmpty(value)) {
return;
}
if (size <= 1) {
wrapper.in(column, value);
return;
}
List<? extends List<?>> partition = Lists.partition(value, size);
wrapper.and(w -> {
int s = partition.size();
for (int i = 0; i < s; i++) {
if (i < s - 1) {
w.in(column, partition.get(i)).or();
} else {
w.in(column, partition.get(i));
}
}
});
}
}
业务调用:
//if (Objects.nonNull(bizVo.getTime())) {
// Date endDate = DateUtil.endOfDay(bizVo.getTime()).toJdkDate();
// queryWrapper.le(BizInfo::getTime(), endDate);
//}
SqlPlusUtils.leNonDateEnd(queryWrapper, BizInfo::getTime, bizVo.getTime());
// in条件,当in的数量过大时将报错
//queryWrapper.in(CollUtil.isNotEmpty(bizVo.getIds()), BizInfo::getId, bizVo.getIds());
SqlPlusUtils.partitionIn(queryWrapper, BizInfo::getId, bizVo.getIds(), 20);