Mybatis-Plus的saveOrUpdateBatch(null)問題及解決
Mybatis-Plus的saveOrUpdateBatch(null)問題
Mybatis-Plus的saveOrUpdateBatch對(duì)象屬性為空(null)不更新的問題
saveOrUpdateBatch對(duì)象屬性為空(null)不更新的問題
在屬性上假如注解即可updateStrategy = FieldStrategy.IGNORED
就是為null的時(shí)候也更新字段值
? @ApiModelProperty(value = "固定電話") ? ? @TableField(value = "FIXED_TELEPHONE",updateStrategy = FieldStrategy.IGNORED) ? ? private String fixedTelephone;
mybatis-plus的saveOrUpdate問題
項(xiàng)目場(chǎng)景
在使用mybatis-plus的時(shí)候傳入的數(shù)據(jù)id不為空的時(shí)候
問題描述
出現(xiàn)問題是一直是新增而不是修改
service.savaOrUpdate(User user);
這里的User是實(shí)體類
含有屬性 id 主鍵、name 姓名
原因分析
這里我先說明一下saveOrUpdate()的底層原理是:
先進(jìn)行查詢 如果這個(gè)id為空 -----就新增
如果有id的話就會(huì)通過這個(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)文章
SpringBoot整合EasyExcel進(jìn)行大數(shù)據(jù)處理的方法詳解
EasyExcel是一個(gè)基于Java的簡(jiǎn)單、省內(nèi)存的讀寫Excel的開源項(xiàng)目。在盡可能節(jié)約內(nèi)存的情況下支持讀寫百M(fèi)的Excel。本文將在SpringBoot中整合EasyExcel進(jìn)行大數(shù)據(jù)處理,感興趣的可以了解一下2022-05-05使用ScheduledThreadPoolExecutor踩過最痛的坑
這篇文章主要介紹了使用ScheduledThreadPoolExecutor踩過最痛的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08SpringBoot日期格式轉(zhuǎn)換之配置全局日期格式轉(zhuǎn)換器的實(shí)例詳解
這篇文章主要介紹了SpringBoot日期格式轉(zhuǎn)換之配置全局日期格式轉(zhuǎn)換器的實(shí)例詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Spring通過三級(jí)緩存解決循環(huán)依賴問題的過程詳解
循環(huán)依賴指的是在對(duì)象之間存在相互依賴關(guān)系,形成一個(gè)閉環(huán),導(dǎo)致無(wú)法準(zhǔn)確地完成對(duì)象的創(chuàng)建和初始化,本文主要介紹了Spring通過三級(jí)緩存解決循環(huán)依賴的方法,需要的可以參考下2023-10-10Java實(shí)現(xiàn)注冊(cè)登錄與郵箱發(fā)送賬號(hào)驗(yàn)證激活功能
這篇文章主要介紹了Java實(shí)現(xiàn)注冊(cè)登錄與郵箱發(fā)送賬號(hào)驗(yàn)證激活功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12