MybatisPlus实用工具类封装

375 阅读1分钟

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);