Mybatis執行批量插入返回數據庫主鍵列表

原文地址

【推薦閱讀】微服務還能火多久?>>>

我們都知道Mybatis在插入單條數據的時候有兩種方式返回自增主鍵:

1、對於支持生成自增主鍵的數據庫:增加 useGenerateKeys和keyProperty ,<insert>標籤屬性。

2、不支持生成自增主鍵的數據庫:使用<selectKey>。

<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username, password, email, bio) values
  <foreach item="item" collection="list" separator=",">
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
  </foreach>
</insert>

從官網資料可以看出Mybatis是支持批量插入時返回自增主鍵的。

但是在本地測試的時候使用上述方式確實不能返回自增id,而且還報錯(不認識keyProperty中指定的Id屬性),然後在網上找相關資料。終於在Stackoverflow上面找到了一些信息。

解決辦法:

1、升級Mybatis版本到3.3.1。官方在這個版本中加入了批量新增返回主鍵id的功能

2、在Dao中不能使用@param註解。

3、Mapper.xml中使用list變量(parameterType="Java.util.List")接受Dao中的參數集合。

下面是具體代碼過程,可供參考

mapper.xml層代碼

<!-- 批量新增 -->  
    <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id" >  
        INSERT INTO  
        <include refid="t_shop_resource" />  
        (relation_id, summary_id, relation_type)  
        VALUES  
        <foreach collection="list" index="index" item="shopResource" separator=",">  
            (  
                #{shopResource.relationId}, #{shopResource.summaryId}, #{shopResource.relationType}  
            )  
        </foreach>  
    </insert>  

dao實現層代碼

public List<ShopResource> batchinsertCallId(List<ShopResource> shopResourceList){  
        this.getSqlSession().insert(getStatement(SQL_BATCH_INSERT_CALL_ID), shopResourceList);  
        return shopResourceList;// 重點介紹  
    }  

爲什麼最後返回的參數不是挑用mybatis後的insert的返回值呢,細心的話可以發現,如果使用debug模式觀察,會看到調用mybatis後insert的返回值是[],也就是空集合元素.

在mybatis3.3.1中,雖然加入了批量新增返回主鍵id的功能,但是它是這樣運行的,在需要新增插入新元素集合對象時,它會需要參數對象,當執行完插入操作後,給之前的參數對象設置id值,也就是改變了需要插入對象集合中的元素的屬性id值, 所以接收返回時,返回方法形參參數即可,同樣的地址引用改變了內容,返回後的集合也是改變後的集合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章