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é) ?。?!非常重要的是 我們自己mapper中定義的方法一定不要跟mybatisplus的中方法名一樣,防止出現(xiàn)這種錯誤
這也是我代碼規(guī)范沒有寫好,大家寫的時候一定要按照阿里的開發(fā)規(guī)約進行開發(fā),取名要正規(guī)
最后
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合EasyExcel進行大數(shù)據(jù)處理的方法詳解
EasyExcel是一個基于Java的簡單、省內(nèi)存的讀寫Excel的開源項目。在盡可能節(jié)約內(nèi)存的情況下支持讀寫百M的Excel。本文將在SpringBoot中整合EasyExcel進行大數(shù)據(jù)處理,感興趣的可以了解一下2022-05-05使用ScheduledThreadPoolExecutor踩過最痛的坑
這篇文章主要介紹了使用ScheduledThreadPoolExecutor踩過最痛的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08SpringBoot日期格式轉(zhuǎn)換之配置全局日期格式轉(zhuǎn)換器的實例詳解
這篇文章主要介紹了SpringBoot日期格式轉(zhuǎn)換之配置全局日期格式轉(zhuǎn)換器的實例詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12Spring通過三級緩存解決循環(huán)依賴問題的過程詳解
循環(huán)依賴指的是在對象之間存在相互依賴關(guān)系,形成一個閉環(huán),導(dǎo)致無法準確地完成對象的創(chuàng)建和初始化,本文主要介紹了Spring通過三級緩存解決循環(huán)依賴的方法,需要的可以參考下2023-10-10Java實現(xiàn)注冊登錄與郵箱發(fā)送賬號驗證激活功能
這篇文章主要介紹了Java實現(xiàn)注冊登錄與郵箱發(fā)送賬號驗證激活功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12