最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis-Plus使用saveOrUpdate及問題解決方法

 更新時間:2023年01月11日 10:51:17   作者:Java充電樁  
本文主要介紹了Mybatis-Plus使用saveOrUpdate及問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

今天的想法是,要在插入數(shù)據(jù)庫時,如果有某某一個主要字段的值重復(fù),則不插入,否則則插入!
看了一下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默認是根據(jù)主鍵執(zhí)行操作的!

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

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Subject {

  @TableId(value = "subject_Code", type = IdType.AUTO)
  private long subjectCode;

  private String subjectNameCn;

  private String subjectNameEn;

  private String subjectHref;

  private long subjectParentCode;

  private long levelCode;

  private int isDelete;

  private long operateTimestamp;


}

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

// 根據(jù)updateWrapper嘗試更新,否繼續(xù)執(zhí)行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);

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

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

當(dāng)saveOrUpdate不使用條件構(gòu)造器時,會先做根據(jù)主鍵查詢,如果查出來的結(jié)果為0,那么就執(zhí)行插入操作,如果查出來的結(jié)果不為0,則執(zhí)行更新操作。

但是一般情況下,主鍵都不會重復(fù)??!所有我就用條件構(gòu)造器Wrapper!

UpdateWrapper<Subject> subject_name_cn = new UpdateWrapper<Subject>()
			.eq("subject_Name_Cn", subjectNameCn);
subjectService.saveOrUpdate(subject,subject_name_cn );

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

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

不過轉(zhuǎn)念一想,你是指定字段沒有,又不是主鍵沒有!

但是主鍵自增那肯定沒有?。?/p>

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

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

QueryWrapper<Subject> subject_name_cn1 = new QueryWrapper<Subject>()
                    .eq("subject_Name_Cn", subjectNameCn);
subjectService.saveOrUpdate(subject,subject_name_cn1);

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

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

看了一下源碼,默認參數(shù)是Wrapper類型,然后根據(jù)條件構(gòu)造器更新,

成功則返回,

不成功則走無條件構(gòu)造器的方法。

default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) {
    return this.update(entity, updateWrapper) || this.saveOrUpdate(entity);
}

我感覺應(yīng)該加個類型判斷!

if(updateWrapper instanceof QueryWrapper){
 	去拼接查詢語句!
 }
  if(updateWrapper instanceof UpdateWrapper){
 	去拼接更新語句!
 }

這樣就不會只根據(jù)ID來死查了!

2021-05-21 11:07:24

我才終于明白~

為什么要用updateWrapper了!

它與queryWrapper的區(qū)別就是。

updateWrapper用set來設(shè)置修改的數(shù)據(jù)。

queryWrapper應(yīng)用select來設(shè)置要查出來的數(shù)據(jù)。

哈哈,這個還是很重要的!

saveOrUpdate 是否有映射id

我們知道m(xù)ybatis在插入時,會映射id,但是如果是saveOrUpdate會怎么樣呢?

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

@Test
 void saveOrUpdate(){
       UserText userText = new UserText();
       userText.setUserSex(Sex.MAN);
       boolean b = userTextService.saveOrUpdate(userText);
       System.out.println(userText.getUserId());
   }

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

==>  Preparing: SELECT user_id,user_name,user_sex,start_time FROM user_text WHERE user_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: INSERT INTO user_text ( user_sex ) VALUES ( ? )
==> Parameters: 1(Integer)
<==    Updates: 1

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

@Test
void saveOrUpdate(){
     UserText userText = new UserText();
     userText.setUserSex(Sex.MAN);
     UpdateWrapper<UserText> objectUpdateWrapper = new UpdateWrapper<UserText>()
             .eq("user_sex",Sex.MAN);
     boolean b = userTextService.saveOrUpdate(userText,objectUpdateWrapper);
     System.out.println(userText.getUserId());
 }

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

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

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

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

boolean saveOrUpdate(T entity);	

default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) {
	return this.update(entity, updateWrapper) || this.saveOrUpdate(entity);
}

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

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

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

慎用!

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

而主鍵生成的數(shù)據(jù),一般都不會去寫一個id,所以?。≮s快看看吧!

UpdateWrapper 小貼士

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

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

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

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

如果你只想改一條屬性,也可以多寫一個set,不過感覺沒啥必要,不過比較靈活的就是。
你想寫另外一個值,就可以寫進set里。

2021-05-21 13:31:32

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

UpdateWrapper<GameScorePo> updateWrapper = new UpdateWrapper<GameScorePo>()
                   .eq("game_id",gameScorePo.getGameId())
                   .eq("team_id",gameScorePo.getTeamId())
                   .eq("quarter",gameScorePo.getQuarter())
                   .set("score",gameScorePo.getScore());

           gameScoreService.saveOrUpdate(gameScorePo,updateWrapper);

這樣的執(zhí)行結(jié)果是這樣的!

兩個score,我吐了!

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

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

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

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

到此這篇關(guān)于Mybatis-Plus使用saveOrUpdate及問題解決方法的文章就介紹到這了,更多相關(guān)Mybatis-Plus saveOrUpdate內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java編程中實現(xiàn)調(diào)用js方法分析

    java編程中實現(xiàn)調(diào)用js方法分析

    這篇文章主要介紹了java編程中實現(xiàn)調(diào)用js方法,結(jié)合具體實例形式較為詳細的分析了java編程中調(diào)用js方法的常用操作技巧與注意事項,需要的朋友可以參考下
    2017-09-09
  • SpringBoot讀寫xml上傳到AWS存儲服務(wù)S3的示例

    SpringBoot讀寫xml上傳到AWS存儲服務(wù)S3的示例

    這篇文章主要介紹了SpringBoot讀寫xml上傳到S3的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-10-10
  • Java將Word轉(zhuǎn)換成PDF的常用用法

    Java將Word轉(zhuǎn)換成PDF的常用用法

    Java開發(fā)人員在處理文檔轉(zhuǎn)換時,常常需要將Word或Excel文檔轉(zhuǎn)換為PDF格式,以便于更好地保持格式一致性、便于分發(fā)和打印,這篇文章主要給大家介紹了關(guān)于Java將Word轉(zhuǎn)換成PDF的常用用法,需要的朋友可以參考下
    2024-08-08
  • nacos gateway動態(tài)路由實戰(zhàn)

    nacos gateway動態(tài)路由實戰(zhàn)

    這篇文章主要介紹了nacos gateway動態(tài)路由實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 初識Java一些常見的數(shù)據(jù)類型

    初識Java一些常見的數(shù)據(jù)類型

    這篇文章主要介紹Java一些常見的數(shù)據(jù)類型,Java是一種優(yōu)秀的程序設(shè)計語言,它具有令人賞心悅目的語法和易于理解的語義,下面文章小編就來簡單介紹為什么說Java是最好的語言并且介紹它的各種常見類型,需要的朋友可以參考一下
    2021-10-10
  • Java利用POI讀取、寫入Excel的方法指南

    Java利用POI讀取、寫入Excel的方法指南

    這篇文章主要給大家介紹了關(guān)于Java利用POI讀取、寫入Excel的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • @ConfigurationProperties遇到的坑及解決

    @ConfigurationProperties遇到的坑及解決

    這篇文章主要介紹了解決@ConfigurationProperties遇到的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java.lang.NullPointerException 如何處理空指針異常的實現(xiàn)

    java.lang.NullPointerException 如何處理空指針異常的實現(xiàn)

    這篇文章主要介紹了java.lang.NullPointerException 如何處理空指針異常的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • JAVA控制流程break?continue的示例代碼

    JAVA控制流程break?continue的示例代碼

    JAVA流程控制中有相關(guān)代碼可以終止整個流程的進程,他們就是(break和continue),本文通過實例代碼介紹下JAVA控制流程break?continue的相關(guān)知識,感興趣的朋友一起看看吧
    2022-03-03
  • 解決JDBC連接Mysql長時間無動作連接失效的問題

    解決JDBC連接Mysql長時間無動作連接失效的問題

    這篇文章主要介紹了解決JDBC連接Mysql長時間無動作連接失效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評論

丰原市| 商南县| 洱源县| 鹤岗市| 旺苍县| 富民县| 桑植县| 连江县| 固安县| 镇原县| 龙陵县| 长寿区| 穆棱市| 黄大仙区| 怀柔区| 类乌齐县| 凤山市| 新昌县| 壶关县| 托克逊县| 平乐县| 无锡市| 沙河市| 罗定市| 德清县| 三穗县| 双城市| 巴东县| 隆林| 寿宁县| 博客| 濮阳市| 疏勒县| 固镇县| 凤城市| 天峨县| 潢川县| 新沂市| 临西县| 城市| 青铜峡市|