文檔: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); }