Mybatis-Plus的saveOrUpdateBatch(null)問題及解決
Mybatis-Plus的saveOrUpdateBatch(null)問題
Mybatis-Plus的saveOrUpdateBatch對象屬性為空(null)不更新的問題
saveOrUpdateBatch對象屬性為空(null)不更新的問題
在屬性上假如注解即可updateStrategy = FieldStrategy.IGNORED
就是為null的時(shí)候也更新字段值
? @ApiModelProperty(value = "固定電話") ? ? @TableField(value = "FIXED_TELEPHONE",updateStrategy = FieldStrategy.IGNORED) ? ? private String fixedTelephone;
mybatis-plus的saveOrUpdate問題
項(xiàng)目場景
在使用mybatis-plus的時(shí)候傳入的數(shù)據(jù)id不為空的時(shí)候
問題描述
出現(xiàn)問題是一直是新增而不是修改
service.savaOrUpdate(User user);
這里的User是實(shí)體類
含有屬性 id 主鍵、name 姓名
原因分析
這里我先說明一下saveOrUpdate()的底層原理是:
先進(jìn)行查詢 如果這個(gè)id為空 -----就新增
如果有id的話就會通過這個(gè)id先進(jìn)行查詢 如果查到數(shù)據(jù)就進(jìn)行修改,如果沒有查到數(shù)據(jù)就進(jìn)行新增
現(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);
- 首先第一個(gè)
!StringUtils.checkValNull(idVal)
這一句是idVal是id值
checkValNull 點(diǎn)進(jìn)去


這句代表的是id是否為空 如果為空的話就 最后結(jié)果就是真 (因?yàn)橛校。?/p>
- 第二個(gè)
!Objects.isNull(this.getById((Serializable)idVal))
this.getById((Serializable)idVal)這個(gè)方法是

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

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

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

