MyBatis-Plus更新字段為null的三種解決方案
在使用 MyBatis-Plus 進行數(shù)據(jù)庫更新時,很多小伙伴會遇到一個問題:
當某個字段傳了 null 時,updateById 默認 不會更新該字段,數(shù)據(jù)庫里的值依然保留。
這個問題在你想把字段置空時就會很麻煩。下面我給大家講幾個解決方案,小白也能快速上手。
問題示例
假設我們有一個更新方法:
@Override
@Transactional(rollbackFor = Exception.class)
public void updateCarousel(@Valid CarouselUpdateReqVO updateReqVO) {
// 校驗記錄存在
validateCarouselExists(updateReqVO.getId());
// 轉(zhuǎn)換實體類
CarouselDO updateObj = BeanUtils.toBean(updateReqVO, CarouselDO.class);
// 更新數(shù)據(jù)庫
carouselMapper.updateById(updateObj);
}
如果 updateReqVO.getLinkId() 為 null,執(zhí)行 updateById 后,link_id 不會被更新,數(shù)據(jù)庫值不會變成 null。
這是 MyBatis-Plus 默認策略導致的,它默認 忽略 null 值字段。
方案 1:修改實體類策略,讓 null 也更新
MyBatis-Plus 提供了 @TableField(updateStrategy = FieldStrategy) 來控制字段更新策略。
import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; @TableField(updateStrategy = FieldStrategy.ALWAYS) private Long linkId;
策略說明:
| 策略 | 作用 |
|---|---|
| ALWAYS | 永遠更新,即使字段為 null,也會更新到數(shù)據(jù)庫 |
| NOT_NULL | 默認值,字段為 null 時不會更新 |
| NOT_EMPTY | 字符串類型使用,空字符串也會忽略 |
| NEVER | 永不更新 |
| DEFAULT | 使用全局默認策略 |
如果字段使用 ALWAYS,當你傳 null 時,就會把數(shù)據(jù)庫字段置空。
優(yōu)點:簡單直接,只需改實體類。
缺點:全局生效,可能影響其它更新場景。
方案 2:使用 UpdateWrapper 或 LambdaUpdateWrapper 動態(tài)更新
如果你只想在某次更新操作中支持 null 更新,而不改實體類,可以手動構(gòu)建更新條件:
CarouselDO updateObj = BeanUtils.toBean(updateReqVO, CarouselDO.class);
LambdaUpdateWrapper<CarouselDO> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(CarouselDO::getId, updateObj.getId())
.set(CarouselDO::getLinkId, updateObj.getLinkId()); // null 也可以更新
carouselMapper.update(null, wrapper);
或者使用普通 UpdateWrapper:
UpdateWrapper<CarouselDO> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", updateObj.getId())
.set("link_id", updateObj.getLinkId()); // null 也可以更新
carouselMapper.update(updateObj, updateWrapper);
優(yōu)點:靈活,只針對當前更新操作生效。
缺點:字段較多時,需要手動寫每個字段。
方案 3:自定義 Mapper SQL
當字段較多或者更新規(guī)則復雜時,可以直接寫自定義 SQL:
<update id="updateCarousel">
update carousel
set
link_id = #{linkId},
title = #{title},
description = #{description}
where id = #{id}
</update>
完全控制字段更新規(guī)則,包括 null 值。
失去 MyBatis-Plus 自動映射便利。
小結(jié)
| 方案 | 優(yōu)點 | 缺點 | 適用場景 |
|---|---|---|---|
| 實體類設置 ALWAYS | 簡單,全局生效 | 影響所有更新操作 | 字段允許全局置空 |
| LambdaUpdateWrapper / UpdateWrapper | 靈活,針對單次操作 | 寫法稍復雜 | 單次更新可能置空字段 |
| 自定義 Mapper SQL | 完全控制,適合復雜場景 | 失去自動映射 | 批量或復雜更新 |
推薦做法:
- 偶爾置空 → 用 方案 2
- 經(jīng)常置空 → 用 方案 1
- 更新邏輯復雜 → 用 方案 3
總結(jié)
MyBatis-Plus 默認忽略 null 值是為了安全,但當你需要置空數(shù)據(jù)庫字段時,需要使用 FieldStrategy.ALWAYS 或手動更新。
掌握這幾種方式后,你就能靈活處理 null 值字段更新,不再受默認策略限制。
到此這篇關(guān)于MyBatis-Plus更新字段為null的三種解決方案的文章就介紹到這了,更多相關(guān)MyBatis Plus更新字段為null內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot啟動異常Exception in thread “main“ 
本文主要介紹了SpringBoot啟動異常Exception in thread “main“ java.lang.UnsupportedClassVersionError,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
詳解spring boot整合JMS(ActiveMQ實現(xiàn))
本篇文章主要介紹了詳解spring boot整合JMS(ActiveMQ實現(xiàn)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
詳解Spring Cloud Feign 熔斷配置的一些小坑
這篇文章主要介紹了詳解Spring Cloud Feign 熔斷配置的一些小坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
SpringBoot下RabbitMq實現(xiàn)定時任務
這篇文章主要為大家詳細介紹了SpringBoot下RabbitMq實現(xiàn)定時任務,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11

