欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決MybatisPlus批量插入數(shù)據(jù)報(bào)錯(cuò):Error getting generated key or setting result to parameter object問題

 更新時(shí)間:2024年09月25日 09:26:30   作者:Duktig丶  
在使用MybatisPlus進(jìn)行批量插入數(shù)據(jù)時(shí)遇到空指針異常錯(cuò)誤,分析原因是由于主鍵生成策略導(dǎo)致的,嘗試通過設(shè)置useGeneratedKeys屬性解決問題,但因批量插入方法限制,該方法未能成功,最終通過自定義mapper方法實(shí)現(xiàn)批量插入,解決了問題

問題描述

執(zhí)行的核心代碼:

objectUserService.saveBatch(objectUserList);

在使用MybatisPlus進(jìn)行執(zhí)行批量插入操作的時(shí)候報(bào)錯(cuò),導(dǎo)致每次插入數(shù)據(jù)失敗。

具體報(bào)錯(cuò)信息如下:

xiaoyun_notice- 2020-07-14 20:34:09 [http-nio-9001-exec-1] INFO  c.x.api.controller.ObjectController - 【新增通知:step02-object_user批量新增,維護(hù)中間表】: userId: 2
xiaoyun_notice- 2020-07-14 20:34:09 [http-nio-9001-exec-1] INFO  jdbc.sqltiming - batching 3 statements: 1: INSERT INTO object_user ( obj_id, user_id ) VALUES ( 151, 1 ) 2: 
INSERT INTO object_user ( obj_id, user_id ) VALUES ( 151, 2 ) 3: INSERT INTO object_user ( 
obj_id, user_id ) VALUES ( 151, 3 ) ;
 {executed in 75 msec}
xiaoyun_notice- 2020-07-14 20:34:09 [http-nio-9001-exec-1] INFO  jdbc.sqltiming - getGeneratedKeys on query: INSERT INTO object_user ( obj_id, user_id ) VALUES ( 151, 3 ) ;
 {executed in 0 msec}
xiaoyun_notice- 2020-07-14 20:34:09 [http-nio-9001-exec-1] ERROR c.x.e.handler.GlobalExceptionHandler - nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: java.lang.NullPointerException
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: java.lang.NullPointerException

主要報(bào)錯(cuò)信息:

ERROR c.x.e.handler.GlobalExceptionHandler - nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: java.lang.NullPointerException

問題分析

根據(jù)上述的主要報(bào)錯(cuò)信息,可以推測出MybatisPlus在底層執(zhí)行新增操作時(shí),返回的主鍵為空,報(bào)了個(gè)空指針的異常,又因?yàn)榧恿耸聞?wù)的緣故,所以每次執(zhí)行新增操作,失敗。

問題解決過程

百度上所說的大多數(shù)的解決策略都是說主鍵生成策略的問題。

即設(shè)置mybatis的insert語句useGeneratedKeys屬性為false即可解決問題。

網(wǎng)上大多使用的xml去配置,可以在寫到SpringBoot的時(shí)候,基本就不怎么寫xml文件,多以就想著使用注解去設(shè)置,還真有設(shè)置這樣的注解。

@Options(useGeneratedKeys=true,keyProperty="id",keyColumn="id")

option注解標(biāo)簽useGeneratedKeys=true表示使用數(shù)據(jù)庫自動(dòng)增長的主鍵,keyColumn用于指定數(shù)據(jù)庫table中的主鍵,keyProperty用于指定傳入對象的成員變量。

Springboot中 Mybatis 配置文件 Mapper參數(shù)useGeneratedKeys=“true” keyProperty=“id”,useGeneratedKeys設(shè)置為 true 時(shí),表示如果插入的表id以自增列為主鍵,則允許 JDBC 支持自動(dòng)生成主鍵,并可將自動(dòng)生成的主鍵id返回。

useGeneratedKeys參數(shù)只針對 insert 語句生效,默認(rèn)為 false;

默認(rèn)為false怎么還會(huì)生效?難道說是MybatisPlus底層有做了處理。

局限性

雖然這樣使用可能可以成功,但是批量插入的方法,是MybatisPlus底層提供的,我們沒有辦法在mapper中添加這個(gè)注解,將這個(gè)注解添加到當(dāng)前方法,還是失敗。

后續(xù)更新

經(jīng)過各種嘗試,這樣的方法還是失敗,所以這個(gè)需求暫時(shí)不使用MybatisPlus的批量新增來寫了,就自己寫個(gè)新增的mapper方法吧。

替代解決方案

因?yàn)轫?xiàng)目開發(fā)需要,不能再耗時(shí)間,所以干脆就在寫個(gè)自定義的mapper批量新增的方法來解決這個(gè)問題吧。

方法如下:

/**
 * description: 新增通知時(shí),維護(hù)中間表,批量新增
 *
 * @param objId   通知id
 * @param userIds 用戶id集合
 * @return 執(zhí)行條數(shù)
 */
@Insert({
        "<script>",
        "INSERT INTO object_user(obj_id, user_id,created_at,updated_at) values ",
        "<foreach collection='userIds' item='item' index='index' separator=','>",
        "(#{objId}, #{item},now(),now())",
        "</foreach>",
        "</script>"
})
int saveObjectUserList ( int objId, List<Integer> userIds );

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于Java回顧之多線程詳解

    基于Java回顧之多線程詳解

    在這篇文章里,我們關(guān)注多線程。多線程是一個(gè)復(fù)雜的話題,包含了很多內(nèi)容,這篇文章主要關(guān)注線程的基本屬性、如何創(chuàng)建線程、線程的狀態(tài)切換以及線程通信,我們把線程同步的話題留到下一篇文章中
    2013-05-05
  • SpringMVC數(shù)據(jù)輸出相關(guān)知識(shí)總結(jié)

    SpringMVC數(shù)據(jù)輸出相關(guān)知識(shí)總結(jié)

    今天帶大家學(xué)習(xí)SpringMVC的相關(guān)知識(shí),文中對SpringMVC數(shù)據(jù)輸出作了非常詳細(xì)的代碼示例,對正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • Spring RedirectAttributes參數(shù)跳轉(zhuǎn)代碼實(shí)例

    Spring RedirectAttributes參數(shù)跳轉(zhuǎn)代碼實(shí)例

    這篇文章主要介紹了Spring RedirectAttributes參數(shù)跳轉(zhuǎn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Spring覆蓋容器中Bean的注解如何實(shí)現(xiàn)@OverrideBean

    Spring覆蓋容器中Bean的注解如何實(shí)現(xiàn)@OverrideBean

    文章介紹了在項(xiàng)目開發(fā)中如何通過偷梁換柱的方式重寫Spring容器中的內(nèi)置Bean,并指出了需要注意的兩點(diǎn):1. 對應(yīng)的Bean應(yīng)基于接口注入;2. 如果不是基于接口注入,可以使用同包名同類名的方式重寫(可能存在潛在問題,不推薦),文章還強(qiáng)調(diào)了“基于接口編程”的好處
    2025-01-01
  • Java基礎(chǔ)精講方法的使用

    Java基礎(chǔ)精講方法的使用

    方法,也稱函數(shù),如果想要重復(fù)一段或者多段代碼塊的使用,可以將這些代碼封裝成一個(gè)方法,方法具體表現(xiàn)為某種行為,使用方法可以提高代碼的復(fù)用性
    2022-05-05
  • 淺談mybatis如何半自動(dòng)化解耦(推薦)

    淺談mybatis如何半自動(dòng)化解耦(推薦)

    這篇文章主要介紹了淺談mybatis如何半自動(dòng)化解耦,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 談?wù)刯ava的concurrent用法

    談?wù)刯ava的concurrent用法

    這篇文章給大家介紹java的concurrent用法,感興趣的朋友一起學(xué)習(xí)吧
    2015-10-10
  • Spring中容器創(chuàng)建的四種方式示例

    Spring中容器創(chuàng)建的四種方式示例

    這篇文章主要介紹了Spring中容器創(chuàng)建的四種方式示例,Spring容器是Spring框架的核心部分,它負(fù)責(zé)管理和組織應(yīng)用程序中的對象,它提供了一種輕量級的、非侵入式的方式來實(shí)現(xiàn)對象的創(chuàng)建、依賴注入和生命周期管理,需要的朋友可以參考下
    2023-10-10
  • java泛型基本知識(shí)和通用方法

    java泛型基本知識(shí)和通用方法

    這篇文章主要介紹了java泛型基礎(chǔ)知識(shí)及通用方法,從以下幾個(gè)方面介紹一下java的泛型: 基礎(chǔ), 泛型關(guān)鍵字, 泛型方法, 泛型類和接口,感興趣的可以了解一下
    2021-06-06
  • Junit單元測試關(guān)于@Transactional注解引起的事務(wù)回滾問題

    Junit單元測試關(guān)于@Transactional注解引起的事務(wù)回滾問題

    這篇文章主要介紹了Junit單元測試關(guān)于@Transactional注解引起的事務(wù)回滾問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評論