Mybatis-Plus的saveOrUpdateBatch(null)問題及解決
Mybatis-Plus的saveOrUpdateBatch(null)問題
Mybatis-Plus的saveOrUpdateBatch對象屬性為空(null)不更新的問題
saveOrUpdateBatch對象屬性為空(null)不更新的問題
在屬性上假如注解即可updateStrategy = FieldStrategy.IGNORED
就是為null的時候也更新字段值
? @ApiModelProperty(value = "固定電話") ? ? @TableField(value = "FIXED_TELEPHONE",updateStrategy = FieldStrategy.IGNORED) ? ? private String fixedTelephone;
mybatis-plus的saveOrUpdate問題
項目場景
在使用mybatis-plus的時候傳入的數(shù)據(jù)id不為空的時候
問題描述
出現(xiàn)問題是一直是新增而不是修改
service.savaOrUpdate(User user);
這里的User是實體類
含有屬性 id 主鍵、name 姓名
原因分析
這里我先說明一下saveOrUpdate()的底層原理是:
先進行查詢 如果這個id為空 -----就新增
如果有id的話就會通過這個id先進行查詢 如果查到數(shù)據(jù)就進行修改,如果沒有查到數(shù)據(jù)就進行新增
現(xiàn)在讓我們看一下它的源碼:
public boolean saveOrUpdate(T entity) {
if (null == entity) {
return false;
} else {
TableInfo tableInfo = TableInfoHelper.getTableInfo(this.entityClass);
Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!", new Object[0]);
String keyProperty = tableInfo.getKeyProperty();
Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!", new Object[0]);
Object idVal = tableInfo.getPropertyValue(entity, tableInfo.getKeyProperty());
return !StringUtils.checkValNull(idVal) && !Objects.isNull(this.getById((Serializable)idVal)) ? this.updateById(entity) : this.save(entity);
}
}核心代碼是最后的一句
!StringUtils.checkValNull(idVal) && !Objects.isNull(this.getById((Serializable)idVal)) ? this.updateById(entity) : this.save(entity);
- 首先第一個
!StringUtils.checkValNull(idVal)
這一句是idVal是id值
checkValNull 點進去


這句代表的是id是否為空 如果為空的話就 最后結(jié)果就是真 (因為有!)
- 第二個
!Objects.isNull(this.getById((Serializable)idVal))
this.getById((Serializable)idVal)這個方法是

是通過id進行查詢是否有id的這個數(shù)據(jù) 如果有的話就就是真
這樣兩個條件都成立 ---也就是id不為空,id這個數(shù)據(jù)存在的話 ---就進行修改
否則就是新增
這就是saveOrUpdate的底層原理
敲黑板 我出現(xiàn)的問題

這個方法的selectById()
我的情況是我在mapper中自己寫了一個方法名字跟這個一樣。
因為mapper是繼承了BaseMapper這個類,調(diào)用的時候子類有方法就調(diào)用了子類的方法
因此我的情況是變成了有id也變成了新增

最后總結(jié) !?。》浅V匾氖?我們自己mapper中定義的方法一定不要跟mybatisplus的中方法名一樣,防止出現(xiàn)這種錯誤
這也是我代碼規(guī)范沒有寫好,大家寫的時候一定要按照阿里的開發(fā)規(guī)約進行開發(fā),取名要正規(guī)
最后
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java基于IDEA實現(xiàn)qq郵件發(fā)送小程序
這篇文章主要介紹了Java基于IDEA實現(xiàn)qq郵件發(fā)送小程序功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
在Java中使用Redis實現(xiàn)緩存優(yōu)化的操作步驟
在現(xiàn)代高并發(fā)的應(yīng)用中,數(shù)據(jù)庫訪問的性能往往成為瓶頸,為了提高性能,我們通常會使用緩存機制,Redis 是一種開源的內(nèi)存數(shù)據(jù)存儲系統(tǒng),廣泛應(yīng)用于緩存系統(tǒng)的構(gòu)建中,本文將深入探討如何在Java中使用Redis實現(xiàn)緩存優(yōu)化,需要的朋友可以參考下2025-07-07
Spring?Task實現(xiàn)定時任務(wù)的示例
定時任務(wù)的是按照指定的時間或時間間隔,自動執(zhí)行的任務(wù),?在應(yīng)用程序中通常用于自動化處理一些定期或周期性的操作,特別是與時間相關(guān)的任務(wù),本文就來詳細的介紹一下Spring?Task實現(xiàn)定時任務(wù)的示例,感興趣的可以了解一下2026-04-04
解決mybatis-generator生成Mapper文件沒有Selective結(jié)尾的問題
這篇文章主要介紹了解決mybatis-generator生成Mapper文件沒有Selective結(jié)尾的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java中Set集合轉(zhuǎn)為List集合常見的兩種方式
List是Java中比較常用的集合類,指一系列存儲數(shù)據(jù)的接口和類,可以解決復(fù)雜的數(shù)據(jù)存儲問題,這篇文章主要給大家介紹了關(guān)于Java中Set集合轉(zhuǎn)為List集合常見的兩種方式,需要的朋友可以參考下2023-12-12

