溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

springboot中如何使用mybatis-plus表單更新null值

發(fā)布時(shí)間:2021-08-03 15:22:12 來源:億速云 閱讀:489 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關(guān)springboot中如何使用mybatis-plus表單更新null值,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

問題背景

使用mybatis-plus進(jìn)行數(shù)據(jù)庫(kù)交互,默認(rèn)開啟null不更新設(shè)置,在新增數(shù)據(jù)后,編輯頁面將字段值清除后(date類型,int類型,為避免默認(rèn)值傳入,model全部使用包裝類型初始化為null)無法將null值更新至數(shù)據(jù)庫(kù)

單個(gè)解決方案

通過UpdateWrapper的set方法強(qiáng)制字段為null值

通用解決方法

定義基礎(chǔ)類BaseModel,增加屬性u(píng)pdateFieldList,model繼承此類

public class BaseModel {@TableField(exist = false)@JSONField(serialize = false)private List<String> updateFieldList;public List<String> getUpdateFieldList() {return updateFieldList;
    }public void setUpdateFieldList(List<String> updateFieldList) {this.updateFieldList = updateFieldList;
    }
}

自定自定義注解UpdateRequestBody替代RequestBody

@ResponseBody@PostMapping("/update")	public Object update(@UpdateRequestBody AccountDO entity) {
		Result result = null;		try {
			accountService.update(entity);
			result = Result.okResult();
		} catch (Exception e) {
			result = Result.errorResult();
		}		return result;
	}	@ResponseBody@PostMapping("/batchUpdate")	public Object batchUpdate(@UpdateRequestBody List<AccountDO> entityList) {
		Result result = null;		try {
			accountService.batchUpdate(entityList);
			result = Result.okResult();
		} catch (Exception e) {
			result = Result.errorResult();
		}		return result;
	}

自定義HandlerMethodArgumentResolver對(duì)前臺(tái)json至后臺(tái)Model轉(zhuǎn)換的攔截,需要對(duì)List類型的Model集合進(jìn)行支持,獲取前臺(tái)提交json對(duì)應(yīng)定義Model中有同名屬性的,進(jìn)行加入打待更新字段列表updateFieldList

public class BaseModelMethodArgumentResolver implements HandlerMethodArgumentResolver {@Overridepublic boolean supportsParameter(MethodParameter methodParameter) {if (methodParameter.hasParameterAnnotation(UpdateRequestBody.class)) {//集合if(List.class.isAssignableFrom(methodParameter.getParameterType())){
                ParameterizedType parameterizedType = (ParameterizedType) methodParameter.getGenericParameterType();
                Class clazz = (Class)parameterizedType.getActualTypeArguments()[0];//取出List中的真實(shí)對(duì)象類型if(BaseModel.class.isAssignableFrom(clazz)){return true;
                }else{return  false;
                }
            }else{//單個(gè)對(duì)象if(BaseModel.class.isAssignableFrom(methodParameter.getParameterType())){return true;
                }else{return false;
                }
            }
        }return false;
    }@Overridepublic Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        String body = "";try {
            HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
            body = CommonUtil.getBodyString(request);
        } catch (Exception e) {
            e.printStackTrace();
        }if(List.class.isAssignableFrom(methodParameter.getParameterType())){
            List resultList = new ArrayList();
            ParameterizedType parameterizedType = (ParameterizedType) methodParameter.getGenericParameterType();
            Class clazz = (Class)parameterizedType.getActualTypeArguments()[0];
            List<Field> fs = Arrays.asList(clazz.getDeclaredFields());
            JSONArray array = JSONArray.parseArray(body);for (Object temp:array) {
                JSONObject obj = JSONObject.parseObject(temp.toString());
                List<String> updateFieldList = new ArrayList<>();for (String key : obj.keySet()) {for (Field filed : fs) {if (key.toLowerCase().equals(filed.getName().toLowerCase())) {
                            updateFieldList.add(key.toLowerCase());continue;
                        }
                    }
                }
                obj.put("updateFieldList",updateFieldList);
                resultList.add(obj);
            }return  JSONArray.parseArray(resultList.toString(),clazz);
        }else{
            Class clazz = methodParameter.getParameterType();
            List<String> updateFieldList = new ArrayList<>();
            List<Field> fs = Arrays.asList(clazz.getDeclaredFields());
            JSONObject obj = JSON.parseObject(body);for (String key : obj.keySet()) {for (Field filed : fs) {if (key.toLowerCase().equals(filed.getName().toLowerCase())) {
                        updateFieldList.add(key.toLowerCase());continue;
                    }
                }
            }
            obj.put("updateFieldList",updateFieldList);return JSON.parseObject(obj.toString(),clazz);
        }

    }
}

將自定義BaseModelMethodArgumentResolver 加入到配置中去

public class WebConfig implements WebMvcConfigurer {@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new BaseModelMethodArgumentResolver());
    }
}

進(jìn)行自定義UpdateWrapper構(gòu)造

 public <T extends BaseModel>  UpdateWrapper getUpdateWrapper(T entity){
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<T>();try{
           Class clazz = entity.getClass();
           List<Field> fs = Arrays.asList(clazz.getDeclaredFields());
           List<String> updateFieldList = entity.getUpdateFieldList();           if(updateFieldList!=null){               for (String updateFiled:updateFieldList ) {                   for (Field field:fs) {
                       field.setAccessible(true);                       if(field.getName().toLowerCase().equals(updateFiled)){
                           Object fieldValue = field.get(entity);
                           updateWrapper.set(fieldValue==null,field.getName(),null);                           continue;
                       }
                   }
               }
           }           return updateWrapper;
       }catch (Exception e){
           e.printStackTrace();
       }return updateWrapper;
    }

注:對(duì)標(biāo)記TableField忽略注解的字段可以優(yōu)化,反射可以應(yīng)用初始化時(shí)掃描加入緩存進(jìn)行優(yōu)化

以上就是springboot中如何使用mybatis-plus表單更新null值,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI