關(guān)于Mybatis-plus設(shè)置字段為空的正確寫法
Mybatis-plus設(shè)置字段為空的寫法
使用Mybatis-plus在進行字段更新操作設(shè)置字段值為null,使用如下的操作語句:
LambdaUpdateWrapper<Entity> wrapper = new LambdaUpdateWrapper<>(); wrapper.set(Entity::getField,null); wrapper.eq(Entity::getId,1);
發(fā)現(xiàn)打印出來的sql只有更新條件,沒有field=null,導(dǎo)致更新報錯。
這是為什么呢?這是因為Mybatis-plus在更新的時候做了null判斷,默認不更新為null的傳參字段,但業(yè)務(wù)如此,我們應(yīng)該怎么寫呢?
方法一:調(diào)整全局的驗證策略
注入配置 GlobalConfiguration 屬性 fieldStrategy
方法二:調(diào)整字段驗證注解
根據(jù)具體情況,在需要更新的字段中調(diào)整驗證注解,如驗證非空:
@TableField(strategy=FieldStrategy.NOT_EMPTY)
方法三:使用 UpdateWrapper
使用以下方法來進行更新操作:
例1.
?? ?this.mapper.update(null, ? ? ? ? ? ? ? ? Wrappers.<Entity>lambdaUpdate() ? ? ? ? ? ? ? ? .set(Entity::getField, null) ? ? ? ? ? ? ? ? .eq(Entity::getId, id));
例2.
?? ?UpdateWrapper<Entity> updateWrapper = new UpdateWrapper<>();
?? ?updateWrapper.set("field", null);
?? ?updateWrapper.eq("id", 2)
?? ?this.update(updateWrapper);這樣我們就很容易的處理了使用Mybatis-plus設(shè)置字段為空不生效的問題了。
MyBatis-Plus更新字段為null 不生效
在使用mybatis-plus時,發(fā)現(xiàn)當前端傳入的值為null值時,結(jié)果無論怎么操作后端都不執(zhí)行更新null字段的操作,數(shù)據(jù)庫中的需要被更新為null的字段沒有被更新。
原因
通過sql查看發(fā)現(xiàn)null字段未在sql中執(zhí)行,經(jīng)過查閱發(fā)現(xiàn)mybaits-plus在更新時排除了null字段
MyBatis-Plus對字段的驗證策略導(dǎo)致的,MyBatis-Plus默認進?了不是全量更新的策略,默認忽略為null 的字段的
解決辦法
1.如果要更新的字段是String類型
可以把前端傳入的null改為空字符串(“”),這樣mybati-plus就不會忽略更新該字段
2.使用mybatis-plus的字段注入
在可能為空的Model類字段上方加@TableField(fill = FieldFill.INSERT_UPDATE),問題解決。
如:
/** * 介紹說明(非必填) */ @TableField(fill = FieldFill.UPDATE) private String explanation;
共有四種可選,默認不處理

3.修改MyBatis-Plus 全局默認策略
缺點:這樣做會對所有的字段都忽略判斷,如果一些字段不想要修改,但是傳值的時候沒有傳遞過來,就會被更新為null
mybatis-plus:
global-config:
#字段策略 0:"忽略判斷",1:"非 NULL 判斷",2:"非空判斷"
field-strategy: 04.修改實體類注解,改變字段的忽略判斷
缺點:需要注意數(shù)據(jù)庫字段是否設(shè)置為 非null ,如果為非null 也更新不成功
@TableField( updateStrategy = FieldStrategy.IGNORED) private Date settleTime;
( updateStrategy = FieldStrategy.IGNORED) private Date settleTime;
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
EasyExcel自定義導(dǎo)出列和順序?qū)嵗a
這篇文章主要給大家介紹了關(guān)于EasyExcel自定義導(dǎo)出列和順序的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
解決springboot的findOne方法沒有合適的參數(shù)使用問題
這篇文章主要介紹了解決springboot的findOne方法沒有合適的參數(shù)使用問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
基于@RequestParam name和value屬性的區(qū)別
這篇文章主要介紹了@RequestParam name和value屬性的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Java字符串格式化工具String.format()完整用法指南
String.format是Java中的一個靜態(tài)方法,用于創(chuàng)建格式化的字符串,這篇文章主要介紹了Java字符串格式化工具String.format()完整用法指南的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2026-01-01
Java結(jié)構(gòu)型設(shè)計模式之組合模式詳解
組合模式,又叫部分整體模式,它創(chuàng)建了對象組的數(shù)據(jù)結(jié)構(gòu)組合模式使得用戶對單個對象和組合對象的訪問具有一致性。本文將通過示例為大家詳細介紹一下組合模式,需要的可以參考一下2022-09-09
SpringBoot集成Beetl后統(tǒng)一處理頁面異常的方法
這篇文章主要介紹了SpringBoot集成Beetl后統(tǒng)一處理頁面異常的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

