myatisplus的saveOrUpdate的提交總是update問(wèn)題
背景
很多朋友,想把新增和編輯做在一起。
沒(méi)想到自己遇到坑了,
自己的saveOrUpdate的提交總是update。
控制臺(tái)sql輸出
UPDATE t_course_type SET course_type_name=?, create_time=?, create_user=?, update_time=?, update_user=?
報(bào)錯(cuò)
com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Prohibition of table update operation
官方文檔
// TableId 注解存在更新記錄,否插入一條記錄 boolean saveOrUpdate(T entity); // 根據(jù)updateWrapper嘗試更新,否繼續(xù)執(zhí)行saveOrUpdate(T)方法 boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
分析
發(fā)現(xiàn)上面的sql沒(méi)有where條件。
以為是新增操作,沒(méi)有id,主鍵是自增的,就加了個(gè)判斷
ObjectUtils.isNotEmpty(courseTypeId)。
發(fā)現(xiàn)是updateWrapper的eq方法 不能加condition參數(shù)。
錯(cuò)誤方式
updateWrapper.eq(ObjectUtils.isNotEmpty(courseTypeId), CourseTypeEntity::getCourseTypeId, courseTypeId);
正確方式
去除第一個(gè)condition參數(shù)。保留2個(gè)參數(shù)即可。
updateWrapper.eq(CourseTypeEntity::getCourseTypeId, courseTypeId);
成功案例實(shí)現(xiàn)源碼分享
LambdaUpdateWrapper<CourseTypeEntity> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(CourseTypeEntity::getCourseTypeId, courseTypeId); CourseTypeEntity courseTypeEntity = new CourseTypeEntity(); if (courseTypeIdNotEmpty) { courseTypeEntity.setCourseTypeId(courseTypeId) .setUpdateTime(LocalDateTime.now()) .setUpdateUser(username) .setCourseTypeName(courseTypeName) .setCourseCount(courseCount); } else { courseTypeEntity.setCourseTypeName(courseTypeName) .setCreateTime(LocalDateTime.now()) .setCreateUser(username) .setUpdateTime(LocalDateTime.now()) .setUpdateUser(username); } boolean saveOrUpdate = this.saveOrUpdate(courseTypeEntity, updateWrapper);
注意
要去了解這個(gè)saveOrUpdate的源碼的處理機(jī)制。
源碼
default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) { return this.update(entity, updateWrapper) || this.saveOrUpdate(entity); }
因?yàn)樵摲椒J(rèn)是使用實(shí)體對(duì)象的id去匹配,
如果有就更新,
如果沒(méi)有就插入。
對(duì)于主鍵自增的場(chǎng)景,
一般不會(huì)手動(dòng)設(shè)置id,每一次的id都不相同,
所以如果不使用條件選擇器,一定是插入。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Java動(dòng)態(tài)字節(jié)碼技術(shù)
Java字節(jié)碼增強(qiáng)指的是在Java字節(jié)碼生成之后,對(duì)其進(jìn)行修改,增強(qiáng)其功能,可減少冗余代碼,提高性能等。本文將詳細(xì)介紹Java動(dòng)態(tài)字節(jié)碼技術(shù)。2021-05-05java?poi導(dǎo)入純數(shù)字等格式問(wèn)題及解決
這篇文章主要介紹了java?poi導(dǎo)入純數(shù)字等格式問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03jmeter中json提取器如何提取多個(gè)參數(shù)值
關(guān)于jmeter中的正則表達(dá)式及json提取器可以提取響應(yīng)值,但是實(shí)際可以需要上個(gè)接口的多個(gè)響應(yīng)值,本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下2021-11-11Spring配置多個(gè)數(shù)據(jù)源并實(shí)現(xiàn)數(shù)據(jù)源的動(dòng)態(tài)切換功能
這篇文章主要介紹了Spring配置多個(gè)數(shù)據(jù)源并實(shí)現(xiàn)數(shù)據(jù)源的動(dòng)態(tài)切換功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01java調(diào)用opencv身份證號(hào)識(shí)別詳解
這篇文章主要為大家詳細(xì)介紹了java如何調(diào)用opencv實(shí)現(xiàn)身份證號(hào)的識(shí)別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03詳解Spring的兩種代理方式:JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理
這篇文章主要介紹了詳解Spring的兩種代理方式:JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04