【Mybatis】mybatis设置指定列为空值

文档:https://baomidou.com/guide/faq.html

 

第一种和第二种感觉不太喜欢,选择第三种方式,写了个工具类

    /**
     * 根据DealId修改任务,允许设置空值
     * @param dealIds           dealId列表
     * @param nullValueColumns  空值列
     */
    public void updateNullColumnsById(Set<String> dealIds,
                                      List<SFunction<Task , ?>>  nullValueColumns) {
        updateNullColumnsById(dealIds, nullValueColumns, null, null, null);
    }

    /**
     * 根据DealId修改配送任务,允许设置空值
     * @param dealIds           dealId列表
     * @param nullValueColumns  空值列
     * @param updateTaskBO      需要修改的实体,只会修改非空的属性值
     */
    public void updateNullColumnsById(Set<String> dealIds,
                                      List<SFunction<Task , ?>>  nullValueColumns,
                                      TaskBO updateTaskBO) {
        Task task = TaskTansfer.INSTANCE.bo2Model(updateTaskBO);
        updateNullColumnsById(dealIds, nullValueColumns, null, task, null);
    }

    /**
     * 根据DealId修改任务,允许设置空值
     * @param dealIds           dealId列表
     * @param nullValueColumns  空值列
     * @param updateTaskBO      需要修改的实体,只会修改非空的属性值
     * @param conditionTaskBO   条件实体,WHERE后面的非空匹配属性值
     */
    public void updateNullColumnsById(Set<String> dealIds,
                                      List<SFunction<Task , ?>>  nullValueColumns,
                                      TaskBO updateTaskBO,
                                      TaskBO conditionTaskBO) {
        Task task = TaskTansfer.INSTANCE.bo2Model(updateTaskBO);
        task conditionTask = TaskTansfer.INSTANCE.bo2Model(conditionTaskBO);
        updateNullColumnsById(dealIds, nullValueColumns, null, task, conditionTask);
    }

    /**
     * 根据DealId修改配送任务,允许设置空值
     * @param dealIds                dealId列表
     * @param nullValueColumns       空值列
     * @param nullConditionColumns   查询条件为空的列,where后面为空的列
     * @param updateTask             需要修改的实体,只会修改非空的属性值
     * @param conditionTask          条件实体,where后面非空的列
     */
    private void updateNullColumnsById(Set<String> dealIds,
                                       List<SFunction<Task , ?>>  nullValueColumns,
                                       List<SFunction<Task , ?>>  nullConditionColumns,
                                       Task updateTask,
                                       Task conditionTask) {

        Task conditionTaskTmp = conditionTask;
        if (conditionTaskTmp == null) {
            conditionTaskTmp = new Task();
        }

        //where后的参数
        LambdaUpdateWrapper<Task> wrapper = Wrappers.update(
                conditionTaskTmp
        ).in(Task::getDealId, dealIds);

        if (CollectionUtils.isNotEmpty(nullValueColumns)) {
            //值可以为空的,需要在这里设置
            nullValueColumns.forEach(it-> wrapper.set(it, null));
        }
        if (CollectionUtils.isNotEmpty(nullConditionColumns)) {
            //where后的参数
            nullConditionColumns.forEach(it-> wrapper.eq(it, null));
        }

        if (updateTask == null) {
            updateTask = new Task();
        }

        baseMapper.update(
                updateTask,          //set后的参数,非空值
                wrapper
        );
    }

 

调用方式:

    public void test() {
        //查找主键为1的记录
        String dealId = "1";
//将name设置为null List<SFunction<Task, ?>> nullValueColumns = Collections.singletonList(Task::getName);
//同时更新最后修改时间 TaskBO taskBO = new TaskBO(); taskBO.setUpdateAt(new Date());
updateNullColumnsById(Collections.singleton(dealId), nullValueColumns, taskBO); }

 

posted @ 2020-11-11 15:13  漫漫的蜗牛  阅读(2668)  评论(0编辑  收藏  举报