Mybatis-plus如何更新Null字段詳解
本文介紹【Mybatis-plus】updateById()方法不能更新字段為null的原因及解決辦法。
一、問(wèn)題描述
在日常項(xiàng)目開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)使用Mybatis-plus的updateById()方法,快速將接收道德參數(shù)或者查詢結(jié)果中原本不為null的字段更新為null,并且該字段在數(shù)據(jù)庫(kù)中可為null,這個(gè)時(shí)候使用updateById()并不能實(shí)現(xiàn)這個(gè)操作,不會(huì)報(bào)錯(cuò),但是對(duì)應(yīng)的字段并沒(méi)有更新為null。
二、問(wèn)題原因
Mybatis-plus的字段策略(FieldStrategy)有三種策略:
IGNORED:0 忽略
NOT_NULL:1 非 NULL,默認(rèn)策略
NOT_EMPTY:2 非空
而默認(rèn)的更新策略是NOT_NULL:非NULL; 即通過(guò)接口更新數(shù)據(jù)時(shí)數(shù)據(jù)為NULL值時(shí)將不更新進(jìn)數(shù)據(jù)庫(kù)。
三、解決方案
1.直接在mapper.xml中寫(xiě)sql:
update table A set 字段a = null where 字段b = 條件
2.設(shè)置全局的FieldStrategy
在配置文件中修改全局策略
properties文件格式:
mybatis-plus.global-config.db-config.field-strategy=ignored
#yml文件格式:
mybatis-plus:
global-config:
#字段策略 0:"忽略判斷",1:"非 NULL 判斷",2:"非空判斷"
field-strategy: 0這樣做是進(jìn)行全局配置,在更新時(shí)會(huì)忽略對(duì)所有字段的判斷。但是如果一些字段沒(méi)有傳值過(guò)來(lái),會(huì)被直接更新為null,可能會(huì)影響其它業(yè)務(wù)數(shù)據(jù)的準(zhǔn)確性。不推薦使用此方法。
3.對(duì)指定的字段單獨(dú)設(shè)置field-strategy
根據(jù)具體情況,在需要更新的字段中調(diào)整驗(yàn)證注解,如驗(yàn)非空:
@TableField(strategy=FieldStrategy.NOT_EMPTY)
這樣的話,我們只需要在需要更新為null的字段上,設(shè)置忽略策略,如下:
@TableField(updateStrategy = FieldStrategy.IGNORED) private String updateBy;
設(shè)置好了之后,在更新時(shí)就可以直接使用mybatis-plus中的updateById方法就可以成功將字段更新為null,但是這樣做存在一定的弊端,就是當(dāng)需要這樣處理的字段比較多時(shí),要給對(duì)應(yīng)的字段都要添加上這樣的注解。
4.使用update方法結(jié)合UpdateWrapper方式更新
User user=userService.lambdaQuery().eq(User::getUserId,userId).one();
if(user!=null){
userService.update(user,new UpdateWrapper<User>().lambda()
.set(User::getUserName,null)
.eq(User::getUserId,user.getUserId()));
}這種方法不會(huì)影響其它方法,不需要修改全局配置,也不需要在字段上單獨(dú)加注解,只需要在使用的時(shí)候設(shè)置一下要修改的字段為null就可以更新成功,推薦使用方法4。
總結(jié)
到此這篇關(guān)于Mybatis-plus如何更新Null字段的文章就介紹到這了,更多相關(guān)Mybatis-plus更新Null字段內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解如何實(shí)現(xiàn)OpenAPI開(kāi)發(fā)動(dòng)態(tài)處理接口的返回?cái)?shù)據(jù)
這篇文章主要為大家介紹了OpenAPI開(kāi)發(fā)動(dòng)態(tài)處理接口的返回?cái)?shù)據(jù)如何實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
springboot循環(huán)依賴問(wèn)題案例代碼及解決辦法
在 Spring Boot 中,如果兩個(gè)或多個(gè) Bean之間存在循環(huán)依賴(即 Bean A 依賴 Bean B,而 Bean B 又依賴 Bean A),會(huì)導(dǎo)致 Spring 的依賴注入機(jī)制無(wú)法正確處理,從而拋出異常,下面給大家介紹springboot循環(huán)依賴問(wèn)題及其解決辦法,感興趣的朋友一起看看吧2025-04-04
Java Vector和ArrayList的異同分析及實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于Java Vector和ArrayList的異同分析及實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。2021-01-01
Spring(AbstractRoutingDataSource)實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換示例
本篇文章主要介紹了詳解Spring(AbstractRoutingDataSource)實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
Spring Boot Web 靜態(tài)文件緩存處理的方法
本篇文章主要介紹了Spring Boot Web 靜態(tài)文件緩存處理的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
關(guān)于intellij idea打開(kāi)就閃退或關(guān)閉詳細(xì)解決辦法
這篇文章主要介紹了關(guān)于intellij idea打開(kāi)就閃退或關(guān)閉詳細(xì)解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
spring mvc使用@InitBinder標(biāo)簽對(duì)表單數(shù)據(jù)綁定的方法
這篇文章主要介紹了spring mvc使用@InitBinder標(biāo)簽對(duì)表單數(shù)據(jù)綁定的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
如何基于JWT實(shí)現(xiàn)接口的授權(quán)訪問(wèn)詳解
授權(quán)是最常見(jiàn)的JWT使用場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于如何基于JWT實(shí)現(xiàn)接口的授權(quán)訪問(wèn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02

