溫馨提示×

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

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

MybatisPlus怎么使用updateById()、update()將字段更新為null

發(fā)布時(shí)間:2022-08-09 14:07:06 來(lái)源:億速云 閱讀:1931 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了MybatisPlus怎么使用updateById()、update()將字段更新為null的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇MybatisPlus怎么使用updateById()、update()將字段更新為null文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

問(wèn)題背景

昨晚同事找我?guī)退匆粋€(gè)問(wèn)題,他使用mybatis-plus中提供的updateById方法,想將查詢結(jié)果中某個(gè)字段原本不為null的值更新為null(數(shù)據(jù)庫(kù)設(shè)計(jì)允許為null),但結(jié)果該字段更新失敗,執(zhí)行更新方法后還是查詢的結(jié)果。

問(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ù)。

解決方案

針對(duì)上述問(wèn)題,利用自己的項(xiàng)目環(huán)境(使用的mybatis-plus版本是3.1)測(cè)試了一下,總結(jié)了以下三種解決方案。

(以下解決方案是基于直接使用mybatis-plus提供的方法使用的,如果習(xí)慣寫sql,當(dāng)然你也可以直接在xml中寫sql實(shí)現(xiàn))

1. 設(shè)置全局的field-strategy

#properties文件格式:
mybatis-plus.global-config.db-config.field-strategy=ignored

#yml文件格式:
mybatis-plus:
  global-config:
      #字段策略 0:"忽略判斷",1:"非 NULL 判斷",2:"非空判斷"
    field-strategy: 0

這樣做是全局性配置,會(huì)對(duì)所有的字段都忽略判斷,如果一些字段不想要修改,但是傳值的時(shí)候沒(méi)有傳遞過(guò)來(lái),就會(huì)被更新為null,可能會(huì)影響其他業(yè)務(wù)數(shù)據(jù)的正確性。

2. 對(duì)某個(gè)字段設(shè)置單獨(dú)的field-strategy

根據(jù)具體情況,在需要更新的字段中調(diào)整驗(yàn)證注解,如驗(yàn)證非空:
@TableField(strategy=FieldStrategy.NOT_EMPTY)

這樣的話,我們只需要在需要更新為null的字段上,設(shè)置忽略策略,如下:

/**
 * 下架時(shí)間
 */
@TableField(strategy = FieldStrategy.IGNORED)
private LocalDateTime offlineTime;

在更新代碼中,我們直接使用mybatis-plus中的updateById方法便可以更新成功,如下:

 /**
  * updateById更新字段為null
  * @param id
  * @return
  */
 @Override
 public boolean updateArticleById(Integer id) {
     Article article = Optional.ofNullable(articleMapper.selectById(id)).orElseThrow(RuntimeException::new);
     article.setContent("try mybatis plus update null again");
     article.setPublishTime(LocalDateTime.now().plusHours(8));
     article.setOfflineTime(null);
     int i = articleMapper.updateById(article);
     return i==1;
 }

使用上述方法,如果需要這樣處理的字段較多,那么就需要涉及對(duì)各個(gè)字段上都添加該注解,顯得有些麻煩了。

那么,可以考慮使用第三種方法,不需要在字段上加注解也能更新成功。

3. 使用UpdateWrapper方式更新

在mybatis-plus中,除了updateById方法,還提供了一個(gè)update方法,直接使用update方法也可以將字段設(shè)置為null,代碼如下:

 /**
  * update更新字段為null
  * @param id
  * @return
  */
 @Override
 public boolean updateArticleById(Integer id) {
     Article article = Optional.ofNullable(articleMapper.selectById(id)).orElseThrow(RuntimeException::new);
     LambdaUpdateWrapper<Article> updateWrapper = new LambdaUpdateWrapper<>();
     updateWrapper.set(Article::getOfflineTime,null);
     updateWrapper.set(Article::getContent,"try mybatis plus update null");
     updateWrapper.set(Article::getPublishTime,LocalDateTime.now().plusHours(8));
     updateWrapper.eq(Article::getId,article.getId());
     int i = articleMapper.update(article, updateWrapper);
     return i==1;
 }

這種方式不影響其他方法,不需要修改全局配置,也不需要在字段上單獨(dú)加注解,所以推薦使用該方式。

關(guān)于“MybatisPlus怎么使用updateById()、update()將字段更新為null”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“MybatisPlus怎么使用updateById()、update()將字段更新為null”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(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