最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis-Plus?updateById更新不了空字符串或null的解決方法

 更新時(shí)間:2023年03月30日 09:57:44   作者:super先生  
本文主要介紹了MyBatis-Plus?updateById更新不了空字符串或null的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1. 文章引言

在開(kāi)發(fā)的過(guò)程中,我們經(jīng)常使用MyBatis-PlusupdateById方法更新數(shù)據(jù)表,但今天在更新appConfig表時(shí),發(fā)現(xiàn)無(wú)法將content字段更新為null。

如下是我的測(cè)試代碼:

@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);

  // 查詢(xún)更新的 id = 10的應(yīng)用配置的內(nèi)容
  AppConfig afterAppConfig = appConfigService.getById(id);
  System.out.println("輸出更新 后 的應(yīng)用配置內(nèi)容:"+afterAppConfig.getContent());
}

輸出結(jié)果如下圖所示:

由上圖可知,更新前后輸出的內(nèi)容不變。

換句話(huà)說(shuō),上述此代碼 beforeAppConfig.setContent(null);雖然設(shè)置contentnull,但數(shù)據(jù)庫(kù)并沒(méi)有將content更新為null。

這是什么原因呢?

2. 分析問(wèn)題

想要搞清楚沒(méi)有將content更新為null原因,我們不妨看看上圖中的用綠色框圈出來(lái)的MyBatis-Plus打印出的mysql語(yǔ)句,如下所示:

UPDATE app_config SET create_time=? WHERE id=?

你會(huì)清楚地看到,mysql語(yǔ)句中沒(méi)有content字段。

按照預(yù)期結(jié)果,MyBatis-Plus打印出的mysql語(yǔ)句應(yīng)該如下:

UPDATE app_config SET create_time=?, content=? WHERE id=?

為什么MyBatis-Plus沒(méi)有按預(yù)期打印出的mysql語(yǔ)句,經(jīng)過(guò)查找資料可得。

其實(shí)是MyBatis-Plus對(duì)字段的驗(yàn)證策略導(dǎo)致的,MyBatis-Plus默認(rèn)進(jìn)行了不是全量更新的策略。

查閱官網(wǎng)發(fā)現(xiàn)有一個(gè)屬性,而我的application.yml沒(méi)有配置這個(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
    # 按下劃線(xiàn)轉(zhuǎn)駝峰規(guī)則映射數(shù)據(jù)庫(kù)字段與java bean屬性之間的關(guān)系
    map-underscore-to-camel-case: true
    # 關(guān)閉一級(jí)緩存
    # local-cache-scope: statement
    # 關(guān)閉二級(jí)緩存
    # cache-enabled: false
  global-config:
    db-config:
      id-type: auto
      logic-delete-value: -1
      logic-not-delete-value: 0

如果沒(méi)有配置這個(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字段更新插入策略屬性說(shuō)明:

  • IGNORED(0): “忽略判斷”, 所有字段都更新和插入
  • NOT_NULL(1):“非 NULL 判斷”, 只更新和插入非NULL
  • NOT_EMPTY(2):“非空判斷”,只更新和插入非NULL值且非空字符串

field-strategy默認(rèn)策略是NOT_NULL(1) ,即更新的時(shí)候做了null判斷,默認(rèn)不更新為null的傳參。

3. 解決問(wèn)題

既然知道了問(wèn)題所在,便可以通過(guò)如下三種方式解決。

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)上說(shuō)的,在PO對(duì)象(即@TableField(value="content")修飾字段的時(shí)候,還需要加入el屬性,但我是新版本的MyBatis-Plus,已經(jīng)不支持el屬性了,如下源碼所說(shuō):

我雖然在content對(duì)象上加上update屬性,如下代碼所示:

/** 配置內(nèi)容 */
@TableField(value = "content",update = "null" )
private String content;

仍無(wú)法將content字段修改為null,如下圖所示:

如果有知道的,可以在評(píng)論區(qū)中留言,不勝感激。

此外,如果你的MyBatis-Plus版本支持el。你在設(shè)置了 field-strategy: 0的前提下,同時(shí)你已確保了你的PO對(duì)象(即@TableField(value="XSID")修飾字段加入了el屬性 (每個(gè)屬性對(duì)應(yīng)數(shù)據(jù)庫(kù)的jdbcType類(lèi)型,這樣才能成功更新空值或null),如下圖:

你可以采用el的這種方式修改。

3.2 方法2:非null字段驗(yàn)證策略

配置完成后,測(cè)試類(lèi)修改完成,并重新啟動(dòng),如下圖所示:

此時(shí),你會(huì)發(fā)現(xiàn)可以更新空字符串' ',如下圖所示:

但是一些比如Date等對(duì)象類(lèi)型的設(shè)置空是要設(shè)置為null的,你會(huì)發(fā)現(xiàn)一樣更新不了null。

3.3 方法3:通過(guò)注解的方式

由于表中的字段基本上都是varchar字符類(lèi)型的,所以此時(shí)可以在PO中對(duì)類(lèi)型為對(duì)象類(lèi)型的屬性,通過(guò)注解對(duì)對(duì)象類(lèi)型的屬性單獨(dú)設(shè)置字段驗(yàn)證策略為IGNORED,如下代碼所示:

/** 配置內(nèi)容 */
@TableField(value = "content",updateStrategy = FieldStrategy.IGNORED)
private String content;

同時(shí)修改測(cè)試代碼,如下圖所示:

這樣就可以成功更新值為null或者空字符串' '了,問(wèn)題解決,如下圖所示:

如果你的MyBatis-Plus版本和我的版本不同,你可能是下圖中的注解,同樣能解決問(wèn)題。

4. 總結(jié)

到此這篇關(guān)于MyBatis-Plus updateById更新不了空字符串或null的解決方法的文章就介紹到這了,更多相關(guān)MyBatis-Plus updateById更新 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis中useGenerateKeys的使用解析

    MyBatis中useGenerateKeys的使用解析

    這篇文章主要介紹了MyBatis中useGenerateKeys的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • eclipse的web項(xiàng)目實(shí)現(xiàn)Javaweb購(gòu)物車(chē)的方法

    eclipse的web項(xiàng)目實(shí)現(xiàn)Javaweb購(gòu)物車(chē)的方法

    這篇文章主要介紹了eclipse的web項(xiàng)目實(shí)現(xiàn)Javaweb購(gòu)物車(chē)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • SpringBoot實(shí)現(xiàn)動(dòng)態(tài)多線(xiàn)程并發(fā)定時(shí)任務(wù)

    SpringBoot實(shí)現(xiàn)動(dòng)態(tài)多線(xiàn)程并發(fā)定時(shí)任務(wù)

    這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)動(dòng)態(tài)多線(xiàn)程并發(fā)定時(shí)任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Jenkins自動(dòng)構(gòu)建部署項(xiàng)目到遠(yuǎn)程服務(wù)器上的方法步驟

    Jenkins自動(dòng)構(gòu)建部署項(xiàng)目到遠(yuǎn)程服務(wù)器上的方法步驟

    這篇文章主要介紹了Jenkins自動(dòng)構(gòu)建部署項(xiàng)目到遠(yuǎn)程服務(wù)器上的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java創(chuàng)建多線(xiàn)程局域網(wǎng)聊天室實(shí)例

    Java創(chuàng)建多線(xiàn)程局域網(wǎng)聊天室實(shí)例

    這篇文章主要介紹了Java創(chuàng)建多線(xiàn)程局域網(wǎng)聊天室實(shí)例,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 從Java到JSON一起探索Jackson的魔力

    從Java到JSON一起探索Jackson的魔力

    Jackson是一個(gè)用于處理JSON數(shù)據(jù)的開(kāi)源Java庫(kù),這篇文章主要為大家介紹了Java是如何利用Jackson處理JSON數(shù)據(jù)的,感興趣的小伙伴可以了解一下
    2023-05-05
  • 詳解java中this.getClass()和super.getClass()的實(shí)例

    詳解java中this.getClass()和super.getClass()的實(shí)例

    這篇文章主要介紹了詳解java中this.getClass()和super.getClass()的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • 教你使用Java獲取當(dāng)前時(shí)間戳的詳細(xì)代碼

    教你使用Java獲取當(dāng)前時(shí)間戳的詳細(xì)代碼

    這篇文章主要介紹了如何使用Java獲取當(dāng)前時(shí)間戳,通過(guò)兩個(gè)java示例,向大家展示如何獲取java中的當(dāng)前時(shí)間戳,文本通過(guò)示例代碼給大家展示了java獲取當(dāng)前時(shí)間戳的方法,需要的朋友可以參考下
    2022-01-01
  • 10分鐘帶你理解Java中的反射

    10分鐘帶你理解Java中的反射

    反射是java中一種強(qiáng)大的工具,能夠使我們很方便的創(chuàng)建靈活的代碼,這篇文章帶大家十分鐘快速理解Java中的反射,有需要的可以參考借鑒。
    2016-08-08
  • Java修改Integer變量值遇到的問(wèn)題及解決

    Java修改Integer變量值遇到的問(wèn)題及解決

    這篇文章主要介紹了Java修改Integer變量值遇到的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論

喀喇沁旗| 江华| 濮阳市| 中宁县| 西贡区| 西昌市| 重庆市| 砚山县| 突泉县| 江门市| 孙吴县| 诸暨市| 上杭县| 九寨沟县| 诸暨市| 张北县| 秦安县| 沂水县| 洛扎县| 蕉岭县| 蕉岭县| 寿光市| 西乌| 黄梅县| 夹江县| 滦平县| 延庆县| 上饶县| 乐安县| 德阳市| 左贡县| 宣汉县| 大新县| 芦溪县| 津市市| 嵊州市| 班玛县| 岳西县| 双城市| 莆田市| 民乐县|