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