首頁 > 軟體

Mybatis批次插入並返回主鍵id的方法

2022-03-24 19:00:28

場景

在做商城的時候,sku表進行了拆分,sku的基本資訊以及sku的庫存表。因為庫存會經常的變動,會導致行鎖。

這裡就是新增的時候,因為在新增商品的時候,會有多條sku的資料進行批次的插入,那麼有批次插入sku基本資訊以及批次插入sku的庫存資訊。

其中,就需要批次插入sku的基本資訊的時候,返回主鍵id,這就能夠在sku批次插入庫存資訊的時候能夠插入skuId;

錯誤

nested exception is org.apache.ibatis.executor.ExecutorException: 
Error getting generated key or setting result to parameter object. 
Cause: org.apache.ibatis.executor.ExecutorException: Could not determine which parameter to assign generated keys to. 
Note that when there are multiple parameters, 'keyProperty' must include the parameter name (e.g. 'id'). Specified key properties are [id] and available parameters are [XXX, XXX, param1, param2]

分析原因

  • 資料庫是否支援自動生成金鑰欄位(例如MySQL和SQL Server),那麼就只需設定useGeneratedKeys=“true” 並將 keyProperty設定為Java物件的屬性名,keyColumn是資料庫中的列名(當主鍵列不是表中的第一列的時候,它必須設定的)
  • 傳參有多個個引數,mybatis並不知道keyProperty = "id"中的 id 賦值給誰
  • (我就是這裡出錯)
  • 我看其他的部落格還有說是版本的問題,建議3.3.1以上的。

排查問題

資料庫是MySQL,設定了 useGeneratedKeys=“true” ,且 keyProperty = id是Java物件的屬性名,id是主鍵列且在第一列中

就是這裡出錯,keyProperty=“id”,導致不知道id返回到哪一個引數中

原來:

<insert id="insertBatch" useGeneratedKeys="true" keyProperty="id">
    insert into goods_sku (goods_id,images,indexes,spec,price,size,bkge_scale,team_scale,direct_scale,enable,create_time,update_time) values
    <foreach collection="param1" item="item" index="index" separator=",">
        <if test="item != null">
            (#{param2},#{item.images},#{item.indexes},#{item.spec},#{item.price},#{item.size},#{item.bkgeScale},#{item.teamScale},#{item.directScale},#{item.enable},#{param3},#{param3})
        </if>
    </foreach>
</insert>

進行修改:

<insert id="insertBatch" useGeneratedKeys="true" keyProperty="goodsSkuDTOs.id">
    insert into goods_sku
    (goods_id,images,indexes,spec,price,size,bkge_scale,team_scale,direct_scale,enable,create_time,update_time) values
    <foreach collection="param1" item="item" index="index" separator=",">
        <if test="item != null">
            (#{param2},#{item.images},#{item.indexes},#{item.spec},#{item.price},#{item.size},#{item.bkgeScale},#{item.teamScale},#{item.directScale},#{item.enable},#{param3},#{param3})
        </if>
    </foreach>
</insert>

依賴版本:

附上完整的Mapper以及Xml檔案

GoodsSkuMapper.java

int insertBatch(@Param("goodsSkuDTOs") List<GoodsSkuDTO> goodsSkuDTOs, @Param("goodsId") Long goodsId,@Param("date") Date date);

GoodsSkuMapper.xml

<insert id="insertBatch" useGeneratedKeys="true" keyProperty="goodsSkuDTOs.id">
    insert into goods_sku (goods_id,images,indexes,spec,price,size,bkge_scale,team_scale,direct_scale,enable,create_time,update_time) values
    <foreach collection="param1" item="item" index="index" separator=",">
        <if test="item != null">
            (#{param2},#{item.images},#{item.indexes},#{item.spec},#{item.price},#{item.size},#{item.bkgeScale},#{item.teamScale},#{item.directScale},#{item.enable},#{param3},#{param3})
        </if>
    </foreach>
</insert>

到此這篇關於Mybatis批次插入並返回主鍵id的方法的文章就介紹到這了,更多相關Mybatis批次插入返回主鍵內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com