MyBatis-Plus 默認(rèn)不更新null的4種方法
在 MyBatis-Plus 里,更新 null 字段是一個非常常見、也非常容易踩坑的問題。
很多人會遇到這種情況:
我明明 setXxx(null) 了,為什么數(shù)據(jù)庫里還是原來的值?
下面我按 原因 → 解決方案 → 使用建議 來整理一下。
一、為什么 MyBatis-Plus 默認(rèn)不更新 null?
這是 MyBatis-Plus 的設(shè)計行為,不是 bug。
默認(rèn)情況下:
@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?=??
適合場景
- • 這個字段本來就允許被清空
- • 例如:備注、頭像、手機(jī)號、郵箱
方式二:在實體類級別統(tǒng)一策略
@TableName(value = "user", autoResultMap = true)
public?class?User?{
}
配合全局配置(不太常用,可以了解):
mybatis-plus: ? global-config: ? ? db-config: ? ? ? update-strategy:?ignored
慎用
- • 會導(dǎo)致所有字段都能被更新為 null
- • 風(fēng)險較大,不適合復(fù)雜業(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?=??
適合場景
- • 后臺管理
- • 批量操作
- • 精準(zhǔn)控制 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;
一定要確認(rèn):
Wrapper里有沒有被邏輯刪除條件影響- 有些更新失敗,其實是 被邏輯刪除過濾了
到此這篇關(guān)于MyBatis-Plus 默認(rèn)不更新null的4種方法的文章就介紹到這了,更多相關(guān)MyBatis-Plus 默認(rèn)不更新null內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
工作中禁止使用Executors快捷創(chuàng)建線程池原理詳解
這篇文章主要為大家介紹了工作中禁止使用Executors快捷創(chuàng)建線程池原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
File.createTempFile創(chuàng)建臨時文件的示例詳解
這篇文章主要介紹了File.createTempFile創(chuàng)建臨時文件的示例詳解,在默認(rèn)臨時文件目錄中創(chuàng)建一個空文件,使用給定前綴和后綴生成其名稱。 如果感興趣來了解一下2020-07-07
SpringBoot+WebMagic實現(xiàn)網(wǎng)頁爬蟲的示例代碼
本文是對spring?boot+WebMagic+MyBatis做了整合,使用WebMagic爬取數(shù)據(jù),然后通過MyBatis持久化爬取的數(shù)據(jù)到mysql數(shù)據(jù)庫,具有一定的參考價值,感興趣的可以了解一下2023-10-10
SpringBoot分布式文件存儲數(shù)據(jù)庫mongod
MongoDB是一個基于分布式文件存儲的NoSQL數(shù)據(jù)庫,由C++語言編寫,旨在為Web應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案。MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫中功能最豐富最像關(guān)系數(shù)據(jù)庫的2023-02-02
基于Java實現(xiàn)本地APK文件搜索與HTTP下載服務(wù)
在移動應(yīng)用開發(fā)和測試過程中,經(jīng)常需要從本地服務(wù)器獲取最新的 APK 安裝包,本文將詳細(xì)介紹如何使用 Java 構(gòu)建一個能夠搜索本地最新 APK 文件并通過 HTTP 請求提供下載服務(wù)的應(yīng)用2025-07-07

