前端请求对象转化成mybatis3查询数据库条件工具类

 1.工具类

这里提供一个便捷的前端请求对象转化成mybatis3查询数据库条件工具类,方便大家拿过来就能使用

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 各种方便功能
 *
 * @author RenPL
 */
public class LambdaUtils {

    /**
     * data 不为 null 时,执行后面的 lambda 代码
     *
     * @param data 数据
     * @param func 代码
     * @param <T>  数据类型
     * @param <R>  返回类型
     * @return data == null,返回 empty;data != null,返回执行结果
     */
    public static <T, R> Optional<R> callIfNotNull(T data, Function<T, R> func) {
        if (data != null) {
            return Optional.ofNullable(func.apply(data));
        } else {
            return Optional.empty();
        }
    }

    /**
     * data 不为 null 时,执行后面的 lambda 代码
     *
     * @param data 数据
     * @param func 代码
     * @param <T>  数据类型
     */
    public static <T> void runIfNotNull(T data, Consumer<T> func) {
        if (data != null) {
            func.accept(data);
        }
    }

    /**
     * data 不为空时,执行后面的 lambda 代码
     *
     * @param data 数据
     * @param func 代码
     * @param <T>  数据类型,基本就是 String
     */
    public static <T extends CharSequence> void runIfNotEmpty(T data, Consumer<T> func) {
        if (data != null && data.length() > 0) {
            func.accept(data);
        }
    }

    /**
     * data 不为 null 时,执行后面的 lambda 代码
     *
     * @param data 数据
     * @param func 代码
     * @param <T>  数据类型
     */
    public static <T> void runIfStringNotNull(T data, Consumer<T> func) {
        if (data != null&&data!="") {
            func.accept(data);
        }
    }

    /**
     * 将某种 key 翻译成对象,并塞回原列表。
     * 使用标准服务 list 方法的版本。
     * <p></p>
     * 示例用法:
     * <pre>
     * // 将运力详情 dto 塞入调度单 dto ,使用 where capacity_no in 条件查询,并塞回
     * final List<TspDispatchDocumentsDto> items = resp.getData().getItems();
     * LambdaUtils.translateKeyToObj(
     *     items,
     *     TspDispatchDocumentsDto::getCapacityNo,
     *     "capacity_no",
     *     tspCapacityService,
     *     TspCapacity::getCapacityNo,
     *     (origin, another) -> origin.setTspCapacityDto(TspCapacityConverter.fromEntityToDto(another))
     * );
     * </pre>
     *
     * @param originItems           原始列表
     * @param originKeyExtractor    key 提取器,作为 in 条件
     * @param keyName               查询 in 条件
     * @param queryService          查询服务,提供详情对象
     * @param anotherKeyExtractor   详情对象 key 提取器,必须与 originKeyExtractor 的结果对应
     * @param anotherToOriginPusher 将详情对象塞回原始对象的函数
     * @param <T> 原始对象类型
     * @param <K> Key 类型,大部分为 String
     * @param <R> 详情对象类型
     */
    public static <T, K, R> void translateKeyToObj(
            List<T> originItems,
            Function<T, K> originKeyExtractor,
            String keyName,
            IService<R> queryService,
            Function<R, K> anotherKeyExtractor,
            BiConsumer<T, R> anotherToOriginPusher
    ) {
        final List<K> keyList = originItems.stream()
                .map(originKeyExtractor)
                .collect(Collectors.toList());

        final QueryWrapper<R> queryWrapper = new QueryWrapper<>();
        queryWrapper.in(keyName, keyList);
        final List<R> list = queryService.list(queryWrapper);
        final Map<K, R> capacityMap = list.stream().collect(Collectors.toMap(anotherKeyExtractor, v -> v));

        originItems.forEach(origin ->
                Optional.ofNullable(capacityMap.get(originKeyExtractor.apply(origin)))
                        .ifPresent(another -> anotherToOriginPusher.accept(origin, another))
        );
    }

    /**
     * 将某种 key 翻译成对象,并塞回原列表。
     * 使用自定义查询的版本。
     *
     * @param originItems           原始列表
     * @param originKeyExtractor    key 提取器,作为 in 条件
     * @param queryFunction         查询方法,提供详情对象
     * @param anotherKeyExtractor   详情对象 key 提取器,必须与 originKeyExtractor 的结果对应
     * @param anotherToOriginPusher 将详情对象塞回原始对象的函数
     * @param <T> 原始对象类型
     * @param <K> Key 类型,大部分为 String
     * @param <R> 详情对象类型
     */
    public static <T, K, R> void translateKeyToObj(
            List<T> originItems,
            Function<T, K> originKeyExtractor,
            Function<List<K>, List<R>> queryFunction,
            Function<R, K> anotherKeyExtractor,
            BiConsumer<T, R> anotherToOriginPusher
    ) {
        final List<K> keyList = originItems.stream()
                .map(originKeyExtractor)
                .collect(Collectors.toList());

        final List<R> list = queryFunction.apply(keyList);
        final Map<K, R> capacityMap = list.stream().collect(Collectors.toMap(anotherKeyExtractor, v -> v));

        originItems.forEach(origin ->
                Optional.ofNullable(capacityMap.get(originKeyExtractor.apply(origin)))
                        .ifPresent(another -> anotherToOriginPusher.accept(origin, another))
        );
    }
}

2.各类对象转换工具

/**
 * 各类对象转换工具
 *
 * @author RenPL 2020-2-24
 */
public class SensitiveWordsConverter {
    /**
     * 将前端查询类转换为 MybatisPlus 查询类
     *
     * @param query 前端查询类
     * @return MybatisPlus 查询类
     */
    public static QueryWrapper<SensitiveWordsEntity> fromQueryToWrapper(SensitiveWordsReq query) {
        final QueryWrapper<SensitiveWordsEntity> wrapper = new QueryWrapper<>();
        // 敏感词类型
        LambdaUtils.runIfNotNull(query.getType(), v -> wrapper.eq("type", v));
        // 敏感词内容
        LambdaUtils.runIfNotEmpty(query.getContent(), v -> wrapper.eq("content", v));
        // 起始创建时间
        LambdaUtils.runIfNotNull(query.getStartCreateTime(), v -> wrapper.ge("create_time", v));
        // 结束创建时间
        LambdaUtils.runIfNotNull(query.getEndCreateTime(), v -> wrapper.le("create_time", v));
        // 起始修改时间
        LambdaUtils.runIfNotNull(query.getStartUpdateTime(), v -> wrapper.ge("update_time", v));
        // 结束修改时间
        LambdaUtils.runIfNotNull(query.getEndUpdateTime(), v -> wrapper.le("update_time", v));
        return wrapper;
    }

    /**
     * 数据库对象转换为 Rep
     *
     * @param entity 数据库对象
     * @return Rep
     */
    public static SensitiveWordsRep fromEntityToRep(SensitiveWordsEntity entity) {
        final SensitiveWordsRep dto = new SensitiveWordsRep();
        BeanUtils.copyProperties(entity, dto);
        return dto;
    }

    /**
     * 数据库对象转换为 Req
     *
     * @param req 对象
     * @return entity对象
     */
    public static SensitiveWordsEntity fromReqToEntity(SensitiveWordsReq req) {
        final SensitiveWordsEntity entity = new SensitiveWordsEntity();
        BeanUtils.copyProperties(req, entity);
        return entity;
    }
}

3.这样前端对象直接动态的转换成mybatis3查询条件了

方便吧 

猜你喜欢

转载自blog.csdn.net/weixin_39352976/article/details/104511866