MyBatis-Plus解決字段不更新為null的六大解決方案
MyBatis-Plus 默認(rèn)情況下不會(huì)將字段更新為 null,這是出于防止誤操作的考慮。以下是幾種解決方案:
1.使用 UpdateWrapper(推薦)
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("name", null)
.set("age", null)
.eq("id", 1);
userMapper.update(null, updateWrapper); // null表示不使用實(shí)體類傳遞參數(shù)
2.使用 LambdaUpdateWrapper(類型安全)
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(User::getName, null)
.set(User::getAge, null)
.eq(User::getId, 1);
userMapper.update(null, updateWrapper); // null表示不使用實(shí)體類傳遞參數(shù)
3.實(shí)體類 + 字段策略配置(全局/局部)
全局配置(在配置文件中)
mybatis-plus:
global-config:
db-config:
# 忽略null值字段,這里設(shè)置為false才會(huì)更新null值
update-strategy: ignored
# 可選值:
# ignored: 忽略null值(默認(rèn))
# not_null: 只更新非null值
# not_empty: 只更新非空值
局部配置(在字段上使用注解)
public class User {
@TableField(strategy = FieldStrategy.IGNORED) // 總是更新,包括null
private String name;
@TableField(updateStrategy = FieldStrategy.IGNORED) // 僅更新時(shí)忽略策略
private Integer age;
}
FieldStrategy 選項(xiàng):
IGNORED:忽略判斷,總是更新(包括null)NOT_NULL:非 NULL 判斷(默認(rèn))NOT_EMPTY:非空判斷(字符串額外檢查空串)NEVER:不加入SQL
4.使用insertOrUpdate方法
User user = new User(); user.setId(1L); user.setName(null); // 需要結(jié)合字段策略配置 userMapper.insertOrUpdate(user);
5.自定義 SQL(復(fù)雜情況)
// 在 Mapper 接口中
@Update("UPDATE user SET name = null WHERE id = #{id}")
int updateNameToNull(@Param("id") Long id);
6.使用alwaysUpdateSomeColumnById方法(插件方式)
添加插件配置:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new AlwaysUpdateSomeColumnByIdInnerInterceptor());
return interceptor;
}
最佳實(shí)踐建議
場(chǎng)景1:偶爾需要更新為null
// 使用 UpdateWrapper,不需要修改實(shí)體類注解
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.set("email", null)
.eq("id", userId);
userMapper.update(null, wrapper);
場(chǎng)景2:特定字段經(jīng)常需要更新為null
// 在實(shí)體類字段上添加注解
public class User {
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String nickname; // 該字段可以更新為null
}
場(chǎng)景3:批量更新為null
List<Long> ids = Arrays.asList(1L, 2L, 3L);
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.set(User::getAvatar, null)
.in(User::getId, ids);
userMapper.update(null, wrapper);
注意事項(xiàng)
- 性能考慮:
FieldStrategy.IGNORED會(huì)使該字段在所有更新操作中都參與SQL生成 - 數(shù)據(jù)安全:謹(jǐn)慎使用全局配置,防止誤操作
- 推薦做法:需要更新為null的字段使用注解,其他字段保持默認(rèn)
- 版本兼容:不同版本的MyBatis-Plus可能有不同的策略名稱
常見(jiàn)問(wèn)題
Q:為什么設(shè)置了null但數(shù)據(jù)庫(kù)沒(méi)更新?
A:檢查字段是否使用了 @TableField(updateStrategy = NOT_NULL)(默認(rèn)策略)
Q:如何讓某個(gè)字段插入時(shí)可以為null,更新時(shí)不為null?
@TableField(insertStrategy = FieldStrategy.IGNORED,
updateStrategy = FieldStrategy.NOT_NULL)
private String phone;
Q:更新部分字段為null,部分字段保持原值?
User user = new User();
user.setId(1L);
user.setName(null);
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.set(User::getName, null) // 更新為null
.set(User::getAge, user.getAge()) // 保持原值
.eq(User::getId, user.getId());
userMapper.update(null, wrapper);
建議
根據(jù)具體場(chǎng)景選擇合適的方法,一般推薦使用 UpdateWrapper 方式,因?yàn)樗铎`活且不會(huì)影響其他操作的默認(rèn)行為。
// ? 錯(cuò)誤:實(shí)體對(duì)象無(wú)法設(shè)置null值(默認(rèn)策略會(huì)忽略null)
User user = new User();
user.setId(1L);
user.setName(null); // 這個(gè)null會(huì)被忽略,不會(huì)更新到數(shù)據(jù)庫(kù)
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id", 1);
userMapper.update(user, wrapper); // name不會(huì)被更新為null
// ? 正確:使用wrapper.set()可以更新為null
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.set("name", null) // 明確設(shè)置null值
.eq("id", 1);
userMapper.update(null, wrapper); // name會(huì)被更新為NULL
到此這篇關(guān)于MyBatis-Plus解決字段不更新為null的六大解決方案的文章就介紹到這了,更多相關(guān)MyBatis Plus更新字段為null內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javaWEB實(shí)現(xiàn)相冊(cè)管理的簡(jiǎn)單功能
這篇文章主要介紹了javaWEB實(shí)現(xiàn)相冊(cè)管理的簡(jiǎn)單功能,包括圖片的上傳、統(tǒng)一瀏覽、單個(gè)下載、單個(gè)刪除,還有一個(gè)功能只能刪除自己上傳的文件,感興趣的小伙伴們可以參考一下2015-11-11
SpringBoot整合Quartz實(shí)現(xiàn)動(dòng)態(tài)配置的代碼示例
這篇文章將介紹如何把Quartz定時(shí)任務(wù)做成接口,實(shí)現(xiàn)以下功能的動(dòng)態(tài)配置添加任務(wù),修改任務(wù),暫停任務(wù),恢復(fù)任務(wù),刪除任務(wù),任務(wù)列表,任務(wù)詳情,文章通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
java分析html算法(java網(wǎng)頁(yè)蜘蛛算法示例)
近來(lái)有些朋友在做蜘蛛算法,或者在網(wǎng)頁(yè)上面做深度的數(shù)據(jù)挖掘,下面使用示例2014-03-03
深度解析@JsonSerialize注解及其在Jackson 序列化中的應(yīng)用小結(jié)
本文詳細(xì)介紹了Jackson庫(kù)中的@JsonSerialize注解,探討其用途、優(yōu)點(diǎn)、缺點(diǎn)以及在日期格式處理、特殊數(shù)據(jù)類型、敏感信息隱藏和自定義邏輯等場(chǎng)景的應(yīng)用,通過(guò)實(shí)例演示了如何在Person類中使用注解定制日期序列化,感興趣的朋友一起看看吧2025-10-10
多線程計(jì)數(shù),怎么保持計(jì)數(shù)準(zhǔn)確的方法
這篇文章主要介紹了多線程計(jì)數(shù)的方法,有需要的朋友可以參考一下2014-01-01
SpringMVC HttpMessageConverter消息轉(zhuǎn)換器
??HttpMessageConverter???,報(bào)文信息轉(zhuǎn)換器,將請(qǐng)求報(bào)文轉(zhuǎn)換為Java對(duì)象,或?qū)ava對(duì)象轉(zhuǎn)換為響應(yīng)報(bào)文。???HttpMessageConverter???提供了兩個(gè)注解和兩個(gè)類型:??@RequestBody,@ResponseBody???,??RequestEntity,ResponseEntity??2023-04-04
Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解
這篇文章主要介紹了Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
SpringCloud Eureka實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn)
Eureka是一種基于REST(具像狀態(tài)傳輸)的服務(wù),主要用于AWS云中定位服務(wù),以實(shí)現(xiàn)中間層服務(wù)器的負(fù)載平衡和故障轉(zhuǎn)移。本文記錄一個(gè)簡(jiǎn)單的服務(wù)注冊(cè)與發(fā)現(xiàn)實(shí)例。感興趣的小伙伴們可以參考一下2019-01-01
解決使用json-lib包實(shí)現(xiàn)xml轉(zhuǎn)json時(shí)空值被轉(zhuǎn)為空中括號(hào)的問(wèn)題
網(wǎng)上能查到的xml轉(zhuǎn)json的jar包大部分是net.sf.json-lib,但是JSON json =xmlSerializer.read(xml); 方法會(huì)出現(xiàn)將空值轉(zhuǎn)化為[]的問(wèn)題,下面為大家提供兩種解決方法2018-03-03

