Java書籤 #MyBatis之批量插入並返回自增主鍵id

有時有味發表於2020-10-16

楔子:當然,世上有很多優秀的女性,我也會被她們吸引。這對男人來說是理所當然的。但目光被吸引和內心被吸引是截然不同的。- 東野圭吾《黎明之街》

1.今日書籤

通過 mybatis 框架,實現SQL批量插入並返回每條數的主鍵id。
 

2.山重水複

通過使用 MyBatis,在插入單條資料的時候有兩種方式返回自增主鍵id:

  1. 對於支援生成自增主鍵的資料庫:<insert> 標籤屬性增加 useGenerateKeys 和 keyProperty
  2. 對於不支援生成自增主鍵的資料庫:在SQL語句中使用 <selectKey> 標籤。

案例詳見連結:Java書籤 #MyBatis返回插入/更新記錄的id,及selectKey標籤的巧用
 

3.柳暗花明

MyBatis 是支援批量插入時返回每條資料自增主鍵id的。需要注意有四點:

  1. 升級 MyBatis 依賴版本到 3.3.1 或以上。因為官方在這個版本中加入了批量新增返回主鍵id的功能。
  2. 要操作的表的主鍵id設定的是自增。
  3. 在 DAO interface 介面入參中不能使用 @param 註解。否則,會出現異常:
    org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: org.apache.ibatis.binding.BindingException: Parameter 'couponId' not found. Available parameters are [couponCodeList, param1]
  4. Mapper.xml 中的批量插入SQL入參物件變數名一定要使用 list 變數名,<insert> 標籤引數型別用 parameterType="java.util.List" 接收 DAO 介面中的引數集合。否則,會出現異常:
    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'couponCodeList' not found. Available parameters are [collection, list]

3.1.程式碼示例

1)mybatis jar 包依賴

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.3.1</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.0</version>
</dependency>

2)mapper xml 示例

<insert id="saveBatch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="couponId">
    INSERT INTO
        t_coupon (activity_id, coupon_code, use_status, create_user, create_time)
    VALUES
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.activityId}, #{item.couponCode}, 0, 'meiwei', NOW())
    </foreach>
</insert>

3)DAO 介面示例

public interface TCouponMapper {

    int saveBatch(List<TCoupon> couponCodeList);
}

這裡的 keyProperty="couponId" 對應的是取插入表的自增id欄位,入參物件定義的自增id欄位名須與其保持嚴格一致。示例程式碼入參物件這裡使用的自增id是別名 couponId,所以 keyProperty 的返回欄位嚴格保持一致,也為 couponId。
 
一般情況下,入參物件的主鍵屬性定義為 id,使用 keyProperty="id" 即可。
 

3.2.單元測試

批量插入資料前,每條資料自增id為空:

在這裡插入圖片描述

批量插入資料後,每條資料自增id已經通過入參物件列表返回:

在這裡插入圖片描述

相關文章