MyBatis-Plus 默認不更新null的4種方法
在 MyBatis-Plus 里,更新 null 字段是一個非常常見、也非常容易踩坑的問題。
很多人會遇到這種情況:
我明明 setXxx(null) 了,為什么數(shù)據(jù)庫里還是原來的值?
下面我按 原因 → 解決方案 → 使用建議 來整理一下。
一、為什么 MyBatis-Plus 默認不更新 null?
這是 MyBatis-Plus 的設(shè)計行為,不是 bug。
默認情況下:
@TableField(updateStrategy = FieldStrategy.NOT_NULL)
也就是說:
字段為
null,就不會出現(xiàn)在 UPDATE 語句里
目的是為了:
- • 防止誤操作把字段更新成
null - • 更符合大多數(shù)“只更新有值字段”的業(yè)務(wù)場景
所以你寫:
User?user?=?new?User(); user.setId(1L); user.setEmail(null); userMapper.updateById(user);
實際生成的 SQL 類似:
UPDATE?user?SET?id?=???WHERE?id?=??
email 根本沒參與更新。
二、更新 null 的幾種正確方式(重點)
方式一:使用@TableField(updateStrategy = FieldStrategy.IGNORED)(最推薦)
@TableField(updateStrategy = FieldStrategy.IGNORED) private?String email;
含義是:
不管是不是 null,都參與 update
這時:
user.setEmail(null); userMapper.updateById(user);
生成 SQL:
UPDATE?user?SET?email?=?NULL?WHERE?id?=??
適合場景
- • 這個字段本來就允許被清空
- • 例如:備注、頭像、手機號、郵箱
方式二:在實體類級別統(tǒng)一策略
@TableName(value = "user", autoResultMap = true)
public?class?User?{
}
配合全局配置(不太常用,可以了解):
mybatis-plus: ? global-config: ? ? db-config: ? ? ? update-strategy:?ignored
慎用
- • 會導致所有字段都能被更新為 null
- • 風險較大,不適合復雜業(yè)務(wù)
方式三:使用UpdateWrapper(最靈活)
如果你不想改實體類:
UpdateWrapper<User> wrapper =?new?UpdateWrapper<>();
wrapper.eq("id",?1L)
? ? ? ?.set("email",?null);
userMapper.update(null, wrapper);
生成 SQL:
UPDATE?user?SET?email?=?NULL?WHERE?id?=??
適合場景
- • 后臺管理
- • 批量操作
- • 精準控制 SQL
方式四:使用LambdaUpdateWrapper
LambdaUpdateWrapper<User> wrapper = Wrappers.lambdaUpdate(); wrapper.eq(User::getId,?1L) ? ? ? ?.set(User::getEmail,?null); userMapper.update(null, wrapper);
類型安全、IDE 友好,實際項目更推薦
三、一個容易忽略的坑
邏輯刪除字段 + 更新 null
如果你用了:
@TableLogic private?Integer deleted;
一定要確認:
Wrapper里有沒有被邏輯刪除條件影響- 有些更新失敗,其實是 被邏輯刪除過濾了
到此這篇關(guān)于MyBatis-Plus 默認不更新null的4種方法的文章就介紹到這了,更多相關(guān)MyBatis-Plus 默認不更新null內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 數(shù)組(Array)存儲數(shù)據(jù)的“排排坐”(最新推薦)
這篇文章主要介紹了Java 數(shù)組(Array)存儲數(shù)據(jù)的“排排坐”(最新推薦),本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧2025-05-05
Java線程使用同步鎖交替執(zhí)行打印奇數(shù)偶數(shù)的方法
這篇文章主要介紹了Java線程使用同步鎖交替執(zhí)行打印奇數(shù)偶數(shù)的方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01
詳解Mybatis中javaType和ofType的區(qū)別
本文主要介紹了詳解Mybatis中javaType和ofType的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05
SpringBoot默認包掃描機制及@ComponentScan指定掃描路徑詳解
這篇文章主要介紹了SpringBoot默認包掃描機制及@ComponentScan指定掃描路徑詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

