您好,登錄后才能下訂單哦!
這篇文章主要介紹了MybatisPlus怎么使用updateById()、update()將字段更新為null的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇MybatisPlus怎么使用updateById()、update()將字段更新為null文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。
昨晚同事找我?guī)退匆粋€(gè)問(wèn)題,他使用mybatis-plus中提供的updateById方法,想將查詢結(jié)果中某個(gè)字段原本不為null的值更新為null(數(shù)據(jù)庫(kù)設(shè)計(jì)允許為null),但結(jié)果該字段更新失敗,執(zhí)行更新方法后還是查詢的結(jié)果。
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è)資訊頻道。
免責(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)容。