MyBatis-Plus?updateById更新不了空字符串或null的解決方法
1. 文章引言
在開發(fā)的過程中,我們經(jīng)常使用MyBatis-Plus
的updateById
方法更新數(shù)據(jù)表,但今天在更新appConfig
表時(shí),發(fā)現(xiàn)無法將content
字段更新為null
。
如下是我的測試代碼:
@Test public void testUpdateById() { Long id = 10L; AppConfig beforeAppConfig = appConfigService.getById(id); System.out.println("輸出更新 前 的應(yīng)用配置內(nèi)容:" + beforeAppConfig.getContent()); System.out.println(); // 將 id = 10的應(yīng)用配置的內(nèi)容修改 null beforeAppConfig.setContent(null); appConfigService.updateById(beforeAppConfig); // 查詢更新的 id = 10的應(yīng)用配置的內(nèi)容 AppConfig afterAppConfig = appConfigService.getById(id); System.out.println("輸出更新 后 的應(yīng)用配置內(nèi)容:"+afterAppConfig.getContent()); }
輸出結(jié)果如下圖所示:
由上圖可知,更新前后輸出的內(nèi)容不變。
換句話說,上述此代碼 beforeAppConfig.setContent(null);
雖然設(shè)置content
為null
,但數(shù)據(jù)庫并沒有將content
更新為null
。
這是什么原因呢?
2. 分析問題
想要搞清楚沒有將content
更新為null
原因,我們不妨看看上圖中的用綠色框圈出來的MyBatis-Plus
打印出的mysql
語句,如下所示:
UPDATE app_config SET create_time=? WHERE id=?
你會清楚地看到,mysql
語句中沒有content
字段。
按照預(yù)期結(jié)果,MyBatis-Plus
打印出的mysql
語句應(yīng)該如下:
UPDATE app_config SET create_time=?, content=? WHERE id=?
為什么MyBatis-Plus
沒有按預(yù)期打印出的mysql
語句,經(jīng)過查找資料可得。
其實(shí)是MyBatis-Plus
對字段的驗(yàn)證策略導(dǎo)致的,MyBatis-Plus
默認(rèn)進(jìn)行了不是全量更新的策略。
查閱官網(wǎng)發(fā)現(xiàn)有一個(gè)屬性,而我的application.yml
沒有配置這個(gè)屬性,如下代碼所示:
#mybatis配置 mybatis-plus: mapper-locations: classpath*:/mapper/*Mapper.xml type-aliases-package: com.superjson.superjsonmanager.mapper configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 按下劃線轉(zhuǎn)駝峰規(guī)則映射數(shù)據(jù)庫字段與java bean屬性之間的關(guān)系 map-underscore-to-camel-case: true # 關(guān)閉一級緩存 # local-cache-scope: statement # 關(guān)閉二級緩存 # cache-enabled: false global-config: db-config: id-type: auto logic-delete-value: -1 logic-not-delete-value: 0
如果沒有配置這個(gè)屬性,那么,MyBatis-Plus
采用了默認(rèn)的字段驗(yàn)證策略。
這個(gè)屬性就是field-strategy
,在原application.yml
中加入該屬性,如下代碼所示:
global-config: #字段策略 0:忽略判斷,1:非NULL判斷,2:非空判斷 field-strategy: 1 db-config: id-type: auto logic-delete-value: -1 logic-not-delete-value: 0
field-strategy
字段更新插入策略屬性說明:
IGNORED(0)
: “忽略判斷”, 所有字段都更新和插入NOT_NULL(1)
:“非 NULL 判斷”, 只更新和插入非NULL
值NOT_EMPTY(2)
:“非空判斷”,只更新和插入非NULL
值且非空字符串
field-strategy
默認(rèn)策略是NOT_NULL(1)
,即更新的時(shí)候做了null
判斷,默認(rèn)不更新為null
的傳參。
3. 解決問題
既然知道了問題所在,便可以通過如下三種方式解決。
3.1 方法1:全局配置方式
在MyBatis-Plus
配置文件中修改field-strategy
字段驗(yàn)證的值為0
,即忽略判斷,如下代碼所示:
global-config: #字段策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷" field-strategy: 0 db-config: id-type: auto logic-delete-value: -1 logic-not-delete-value: 0
如是配置后,并參照網(wǎng)上說的,在PO
對象(即@TableField(value="content"
)修飾字段的時(shí)候,還需要加入el
屬性,但我是新版本的MyBatis-Plus
,已經(jīng)不支持el
屬性了,如下源碼所說:
我雖然在content
對象上加上update
屬性,如下代碼所示:
/** 配置內(nèi)容 */ @TableField(value = "content",update = "null" ) private String content;
仍無法將content
字段修改為null
,如下圖所示:
如果有知道的,可以在評論區(qū)中留言,不勝感激。
此外,如果你的MyBatis-Plus
版本支持el
。你在設(shè)置了 field-strategy: 0
的前提下,同時(shí)你已確保了你的PO
對象(即@TableField(value="XSID")
修飾字段加入了el
屬性 (每個(gè)屬性對應(yīng)數(shù)據(jù)庫的jdbcType類型,這樣才能成功更新空值或null),如下圖:
你可以采用el
的這種方式修改。
3.2 方法2:非null字段驗(yàn)證策略
配置完成后,測試類修改完成,并重新啟動,如下圖所示:
此時(shí),你會發(fā)現(xiàn)可以更新空字符串' '
,如下圖所示:
但是一些比如Date
等對象類型的設(shè)置空是要設(shè)置為null
的,你會發(fā)現(xiàn)一樣更新不了null
。
3.3 方法3:通過注解的方式
由于表中的字段基本上都是varchar
字符類型的,所以此時(shí)可以在PO
中對類型為對象類型的屬性,通過注解對對象類型的屬性單獨(dú)設(shè)置字段驗(yàn)證策略為IGNORED
,如下代碼所示:
/** 配置內(nèi)容 */ @TableField(value = "content",updateStrategy = FieldStrategy.IGNORED) private String content;
同時(shí)修改測試代碼,如下圖所示:
這樣就可以成功更新值為null
或者空字符串' '
了,問題解決,如下圖所示:
如果你的MyBatis-Plus
版本和我的版本不同,你可能是下圖中的注解,同樣能解決問題。
4. 總結(jié)
到此這篇關(guān)于MyBatis-Plus updateById更新不了空字符串或null的解決方法的文章就介紹到這了,更多相關(guān)MyBatis-Plus updateById更新 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Jmeter如何獲取jtl文件中所有的請求報(bào)文詳解
JMeter的可以創(chuàng)建一個(gè)包含測試運(yùn)行結(jié)果的文本文件,這些通常稱為JTL文件,因?yàn)檫@是默認(rèn)擴(kuò)展名,但可以使用任何擴(kuò)展名,這篇文章主要給大家介紹了關(guān)于Jmeter如何獲取jtl文件中所有的請求報(bào)文的相關(guān)資料,需要的朋友可以參考下2021-09-09關(guān)于spring5的那些事:@Indexed 解密
這篇文章主要介紹了關(guān)于spring5的那些事:@Indexed 解密,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11java WebSocket客戶端斷線重連的實(shí)現(xiàn)方法
在工作中是否會遇到實(shí)用websocket客戶端連接服務(wù)端的時(shí)候,網(wǎng)絡(luò)波動,服務(wù)端斷連的情況,本文可以直接使用的斷線重連,感興趣的可以了解一下2021-10-10springboot使用GuavaCache做簡單緩存處理的方法
這篇文章主要介紹了springboot使用GuavaCache做簡單緩存處理的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01如何解決Gradle、Maven項(xiàng)目build后沒有mybatis的mapper.xml文件的問題
這篇文章主要介紹了如何解決Gradle、Maven項(xiàng)目build后沒有mybatis的mapper.xml文件的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01一文告訴你為什么要重寫hashCode()方法和equals()方法
本篇文章帶大家了解一下為什么重寫hashCode()方法和equals()方法,文中有非常詳細(xì)的說明以及代碼示例,對正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05Spring使用RestTemplate和Junit單元測試的注意事項(xiàng)
這篇文章主要介紹了Spring使用RestTemplate和Junit單元測試的注意事項(xiàng),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10SpringBoot自定義工具類實(shí)現(xiàn)Excel數(shù)據(jù)存入MySQL數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了如何使用EasyExcel讀取Excel內(nèi)數(shù)據(jù)并轉(zhuǎn)換為csv格式數(shù)據(jù),然后實(shí)現(xiàn)字符串分割,分割出屬性名和屬性值建表插入MySQL數(shù)據(jù)庫中,感興趣的可以了解下2024-03-03