色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MybatisPlus使用 saveOrUpdate方法踩坑記錄

jf_ro2CN3Fa ? 來源:芋道源碼 ? 作者:芋道源碼 ? 2022-11-02 16:25 ? 次閱讀

慎用!

UpdateWrapper 小貼士

后續

今天的想法是,要在插入數據庫時,如果有某某一個主要字段的值重復,則不插入,否則則插入!看了一下mybatis-Plus是有這個saveOrUpdate 方法!

原本使用save時是沒有問題了,改成saveOrUpdate 用了一下就報錯了。

com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: error: can not execute. because can not find column for id from entity!

就是這個mybatisPlus不能找到哪個是主鍵字段,因為這個saveOrUpdate默認是根據主鍵執行操作的!

所有需要在原本的實體類的主鍵頭上,打個@TableId,如下,后面是對應數據庫的字段,已經主鍵自動遞增。

@Data
@AllArgsConstructor
@NoArgsConstructor
publicclassSubject{

@TableId(value="subject_Code",type=IdType.AUTO)
privatelongsubjectCode;

privateStringsubjectNameCn;

privateStringsubjectNameEn;

privateStringsubjectHref;

privatelongsubjectParentCode;

privatelonglevelCode;

privateintisDelete;

privatelongoperateTimestamp;


}

不過還有個問題,就是這個是根據主鍵做操作的,但是我主鍵本來就是自動遞增肯定不會有問題的,接下來就是想個辦法,讓他根據指定字段做操作,好像是有提供了一個口子。

//根據updateWrapper嘗試更新,否繼續執行saveOrUpdate(T)方法
booleansaveOrUpdate(Tentity,WrapperupdateWrapper);

我再去看一下怎么操作的!

研究嘗試了半天,終于搞出來了,可能是很少有人會像我這樣做吧!所以我自己嘗試了下。

當saveOrUpdate不使用條件構造器時,會先做根據主鍵查詢,如果查出來的結果為0,那么就執行插入操作,如果查出來的結果不為0,則執行更新操作。

但是一般情況下,主鍵都不會重復啊!所有我就用條件構造器Wrapper!

UpdateWrappersubject_name_cn=newUpdateWrapper()
.eq("subject_Name_Cn",subjectNameCn);
subjectService.saveOrUpdate(subject,subject_name_cn);

這樣改變后的結果就是會先執行修改,如果執行一條,則執行成功,如果執行結果為0,再執行根據主鍵查詢,然后做插入操作!

其實有點多此一舉的感覺,因為既然都已經更新不到結果了,那么肯定是沒有這個字段咯!

不過轉念一想,你是指定字段沒有,又不是主鍵沒有!

但是主鍵自增那肯定沒有啊!

所有我又想到一個騷操作,我不傳UpdateWrapper而傳QueryWrapper會怎么樣呢!

會不會加在查詢條件種呢!我丟進去沒有報錯,有點小激動,不知道結果如何!

QueryWrappersubject_name_cn1=newQueryWrapper()
.eq("subject_Name_Cn",subjectNameCn);
subjectService.saveOrUpdate(subject,subject_name_cn1);

好吧!上來全給我Update了!絲毫不留情面!我把數據刪了再試試!

好吧!然并卵!幻想破滅!跟傳UpdateWrapper沒有區別!~告辭!

看了一下源碼,默認參數是Wrapper類型,然后根據條件構造器更新,成功則返回,不成功則走無條件構造器的方法。

defaultbooleansaveOrUpdate(Tentity,WrapperupdateWrapper){
returnthis.update(entity,updateWrapper)||this.saveOrUpdate(entity);
}

我感覺應該加個類型判斷!

if(updateWrapperinstanceofQueryWrapper){
//去拼接查詢語句!
}
if(updateWrapperinstanceofUpdateWrapper){
//去拼接更新語句!
}

這樣就不會只根據ID來死查了!

為什么要用updateWrapper?

它與queryWrapper的區別就是:updateWrapper用set來設置修改的數據;queryWrapper應用select來設置要查出來的數據。

saveOrUpdate 是否有映射id

我們知道mybatis在插入時,會映射id,但是如果是saveOrUpdate會怎么樣呢?

比如我saveOrUpdate()后,需要用他的id,但是我傳進去的對象是沒有id的。

@Test
voidsaveOrUpdate(){
UserTextuserText=newUserText();
userText.setUserSex(Sex.MAN);
booleanb=userTextService.saveOrUpdate(userText);
System.out.println(userText.getUserId());
}

可以看到他先通過id查了沒有再進行插入,然后返回新的id。

==>Preparing:SELECTuser_id,user_name,user_sex,start_timeFROMuser_textWHEREuser_id=?
==>Parameters:0(Long)
<==??????Total:?0
Releasing?transactional?SqlSession?[org.apache.ibatis.session.defaults.DefaultSqlSession@6d0fe80c]
Fetched?SqlSession?[org.apache.ibatis.session.defaults.DefaultSqlSession@6d0fe80c]?from?current?transaction
==>Preparing:INSERTINTOuser_text(user_sex)VALUES(?)
==>Parameters:1(Integer)
<==????Updates:?1

不過這個update,不用試我都感覺難搞,因為你如果沒有id,那么你傳入這個對象的值,可能查出多個對象,那么他要把哪個id映射回來,是吧!

@Test
voidsaveOrUpdate(){
UserTextuserText=newUserText();
userText.setUserSex(Sex.MAN);
UpdateWrapperobjectUpdateWrapper=newUpdateWrapper()
.eq("user_sex",Sex.MAN);
booleanb=userTextService.saveOrUpdate(userText,objectUpdateWrapper);
System.out.println(userText.getUserId());
}

但還是試一下,當我們加了一個UpdateWrapper后,有執行成功,執行了3條,返回了id為0。

但是這次加了wrapper,我再試試如果只插入一條,會怎么樣。哈哈,不去讀源碼去debug,就只能這樣試試了,莫怪。

誒,對啊,我去看看源碼先,看能不能看出什么門道。

之前好像也有看了點源碼。兩種不同構造的方法,執行的邏輯也不一樣。

booleansaveOrUpdate(Tentity);

defaultbooleansaveOrUpdate(Tentity,WrapperupdateWrapper){
returnthis.update(entity,updateWrapper)||this.saveOrUpdate(entity);
}

區別不大,就是會多執行一步更新,如果執行成功就直接走,執行不成功再根據這個對象做saveOrUpdate。

進去翻了翻就是,如果通過id查到值,就根據id更新,不然就做新增。

所以也就不用試了,還是自己手寫一個吧,如果需要返回id的話。

慎用!

細思極恐,當你是主鍵自動生成的數據,一定要寫UpdateWrapper,不然你必然是一直插入!完全不會更新,因為默認是用id查詢的。

而主鍵生成的數據,一般都不會去寫一個id,所以啊!趕快看看吧!

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

UpdateWrapper 小貼士

上面雖然寫了updateWrapper可以寫一個set屬性,有兩種情況。

首先,我們一個對象,有5條屬性,只有4條有值,1條沒有值。

mybatis-plus在執行時,會先去看看你的對象哪條屬性有值,哪條沒有。

只會更新有值的屬性,所以只會更新4個屬性,另外一個屬性并不會把他置空。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://gitee.com/zhijiantianya/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

后續

我發現一個很垃圾的,前面我吹的那個updateWrapper的set多牛逼,其實是我想的太美了,他只是在原本的基礎上再加一個字段!我吐了!

UpdateWrapperupdateWrapper=newUpdateWrapper()
.eq("game_id",gameScorePo.getGameId())
.eq("team_id",gameScorePo.getTeamId())
.eq("quarter",gameScorePo.getQuarter())
.set("score",gameScorePo.getScore());

gameScoreService.saveOrUpdate(gameScorePo,updateWrapper);

這樣的執行結果是這樣的!

3be000f6-573d-11ed-a3b6-dac502259ad0.png

兩個score,我吐了!

難道是我打開的姿勢不對?

查了一下知道這個set怎么樣了

3c03605a-573d-11ed-a3b6-dac502259ad0.png

就是不要丟對象,丟一個空的對象,這樣就能set了!

單獨的set好用,但是用在saveOrUpdate就不好用咯!看自己的需求走吧!

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3845

    瀏覽量

    64584
  • 源碼
    +關注

    關注

    8

    文章

    652

    瀏覽量

    29358

原文標題:MybatisPlus 使用 saveOrUpdate() 方法踩坑記錄(慎用)

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【STM32+機智云】機智云手機APP點燈實驗記錄 精選資料分享

    【STM32+機智云】機智云手機APP點燈實驗記錄一、實驗背景因為項目開發需要用到云平臺,所以開始學習機智云平臺,聽說機智云比較容易入門,還有手機APP。因此開始了
    發表于 08-04 08:30

    開發STM32 USB HID過的

    記錄一下 開發STM32 USB HID過的一、前言二、代碼配置一、前言MCU: STM32F103C8T6CubeMX: STM32CubeMX 5.3.0二、代碼配置引腳配置時鐘樹配置我
    發表于 08-24 07:15

    使用樹莓派搭建stm32開發環境過的以及碰到的問題

    使用樹莓派搭建stm32開發環境了很多,下面主要是記錄一下過的,以及碰到的問題。##開發方式的選擇1.使用Eclipse+GDB+O
    發表于 08-24 07:47

    NodeMCU開發板經歷分享

    寫在前面今天入手了一個NodeMCU的板子,準備學習一下物聯網相關的知識。不過由于博主學藝不精,在第一步燒寫固件上就了,所以就想著把自己的經歷寫出來分享給大家,希望能有一些幫助
    發表于 11-01 07:55

    Linux學習過程過的與如何解決

    Linux記錄記錄Linux學習過程過的與如何解決
    發表于 11-04 08:44

    STM32編程常有哪些?

    STM32編程常有哪些?
    發表于 12-17 06:15

    Xavier入門PWM問題解決方法

    Xavier入門PWM問題解決方法GPIO問題解決方法PWM問題由于需要做外部傳感器的觸發同步,所以需要一個方波,考慮用Xavier的PWM,結果折騰了好久發現需要配置內部硬件,折
    發表于 01-10 08:11

    記錄寫SAM4S的bootloader所

    記錄寫SAM4S的bootloader所
    發表于 01-24 07:16

    關于RK1808板子調試過程過的記錄

    關于RK1808板子調試過程過的記錄
    發表于 02-16 06:38

    STM32H7+UCOSIII+LWIP記錄相關資料推薦

    STM32H7+UCOSIII+LWIP記錄主要功能:單片機作TCP服務器實現PC端多客戶端連接單片機,并發傳輸數據。點1、優先級問題:一個客戶端連接就創建一個線程,優先級由高到
    發表于 02-18 06:30

    嵌入式Linux記錄

    Linux記錄記錄Linux學習過程過的與如何解決
    發表于 11-01 17:21 ?10次下載
    嵌入式Linux<b class='flag-5'>踩</b><b class='flag-5'>坑</b><b class='flag-5'>記錄</b>

    STM32CubeIDE+FREERTOS記錄

    STM32CubeIDE+FREERTOS記錄
    發表于 12-05 18:06 ?15次下載
    STM32CubeIDE+FREERTOS<b class='flag-5'>踩</b><b class='flag-5'>坑</b><b class='flag-5'>記錄</b>

    STM32H7+UCOSIII+LWIP記錄

    STM32H7+UCOSIII+LWIP記錄主要功能:單片機作TCP服務器實現PC端多客戶端連接單片機,并發傳輸數據。點1、優先級問題:一個客戶端連接就創建一個線程,優先級由高到
    發表于 12-23 19:54 ?5次下載
    STM32H7+UCOSIII+LWIP<b class='flag-5'>踩</b><b class='flag-5'>坑</b><b class='flag-5'>記錄</b>

    推挽電路的,你過沒?

    推挽電路的,你過沒?
    的頭像 發表于 11-24 16:25 ?1155次閱讀
    推挽電路的<b class='flag-5'>坑</b>,你<b class='flag-5'>踩</b>過沒?

    反相輸入放大器的,你過沒有?

    反相輸入放大器的,你過沒有?
    的頭像 發表于 12-06 15:35 ?696次閱讀
    反相輸入放大器的<b class='flag-5'>坑</b>,你<b class='flag-5'>踩</b>過沒有?
    主站蜘蛛池模板: 亚洲在线中文无码首页| 国精品产露脸偷拍视频| jiz在线播放jizijzz| 啪啪啪社区| 国产美女一区二区| 体育生爆操| 黄色aa大片| yellow高清免费观看日本| 婷婷射精AV这里只有精品| 久久久影院亚洲精品| 亚洲精品无码久久久久A片空| 国产精品亚洲精品日韩电影| 世界上第一个得抑郁症的人是谁| BL低喘贯穿顶弄老师H| 无码人妻99久久密AV| 国产精品免费一区二区三区视频 | 爱豆剧果冻传媒在线播放| 无码人妻精品一区二区蜜桃色欲 | 国精产品一区一区三区有限公司| 92国产精品午夜免费福利视频| 沦为公交两奶头春药高潮迭起| 国产51麻豆二区精品AV视频| 益日韩欧群交P片内射中文| 久久99re7在线视频精品| 伊人影院亚洲| 熟女理发厅| 男男肉肉互插腐文| 黑人干肥婆| 俄罗斯bbbbbbbbb大片| 无码日韩人妻精品久久蜜桃免费| 老师的蕾丝小内内湿透了| 国产人妻麻豆蜜桃色在线| 午夜AV亚洲一码二中文字幕青青 | 熟女人妻久久精品AV天堂| 精品久久久久久久国产潘金莲| 成人无码国产AV免费看| 中文成人在线视频| 欧美日韩一区二区三区四区| 俄罗斯极品hd| 99久久麻豆AV色婷婷综合| 亚洲青青草原|