MyBatis批量插入數據


一、批量插入

1.1 一條語句

1.1.1、說明和注意

數據庫支持單條 INSERT 語句有多組值。只需每組值用一對圓括號括起來,多組值之間用逗號分隔即可。

說明和注意:

  1. DAO 層傳入的是 List,List 里一個元素代表一條數據,同時 List 放入 Map 中;
  2. XML 中使用 foreach 遍歷,每條數據中的元素全部用括號括起來,多條數據之間用逗號分割;
  3. 如果 List 為空,MyBatis 拼接的 SQL 會沒有 value 部分,數據庫會報錯。故在批量插入之前做好數據判斷。

1.1.2、代碼示例

1.1.2.1 DAO 部分

@Override
public Integer batchInsert(List<VirtualOrderStatistics> virtualOrderStatisticsList) {
    Map<String, Object> queryMap = Maps.newHashMap();
    queryMap.put("virtualOrderStatisticsList", virtualOrderStatisticsList);
    return this.insert(this.getNameSpace("batchInsert"), queryMap);
}

1.1.2.2 SQL 部分

<insert id="batchInsert" parameterType="java.util.Map" useGeneratedKeys="true" keyProperty="id">
    insert into virtual_order_statistics
    (id, count_date, order_count, vendor_id, business_code, time_interval,
      order_success_count, order_fail_count, order_cancel_count,order_refund_count,time_out,
      recharge_time_out, recharge_success_time_out,
      recharge_fail_time_out, recharge_no_response_time_out,
      is_deleted, created, modified)
    values
    <foreach collection="virtualOrderStatisticsList" item="item" index="i" separator=",">
        (#{item.id,jdbcType=INTEGER}, #{item.countDate,jdbcType=TIMESTAMP}, #{item.orderCount,jdbcType=INTEGER}, #{item.vendorId,jdbcType=INTEGER}, #{item.businessCode,jdbcType=VARCHAR}, #{item.timeInterval,jdbcType=INTEGER},
        #{item.orderSuccessCount,jdbcType=INTEGER}, #{item.orderFailCount,jdbcType=INTEGER}, #{item.orderCancelCount,jdbcType=INTEGER}, #{item.orderRefundCount,jdbcType=INTEGER},#{item.timeOut,jdbcType=INTEGER},
        #{item.rechargeTimeOut,jdbcType=INTEGER}, #{item.rechargeSuccessTimeOut,jdbcType=INTEGER},
        #{item.rechargeFailTimeOut,jdbcType=INTEGER}, #{item.rechargeNoResponseTimeOut,jdbcType=INTEGER},
        0, now(), now())
    </foreach>
</insert>

1.1.3、參考:

  1. MyBatis 批量插入數據 (MySql) - Admol - 博客園

1.2 多條語句

方法同上,區別在於,上面的SQL部分只是使用 foreach拼接數據部分,實際我們可以使用foreach拼接多條SQL語句,每條語句之間使用;分割即可。

<insert id="batchInsert" parameterType="java.util.Map" useGeneratedKeys="true" keyProperty="id">
    <foreach collection="virtualOrderStatisticsList" item="item" index="i" separator=";">
		insert into virtual_order_statistics
		(id, count_date, order_count, vendor_id, business_code, time_interval,
		  order_success_count, order_fail_count, order_cancel_count,order_refund_count,time_out,
		  recharge_time_out, recharge_success_time_out,
		  recharge_fail_time_out, recharge_no_response_time_out,
		  is_deleted, created, modified)
		values
		(#{item.id,jdbcType=INTEGER}, #{item.countDate,jdbcType=TIMESTAMP}, #{item.orderCount,jdbcType=INTEGER}, #{item.vendorId,jdbcType=INTEGER}, #{item.businessCode,jdbcType=VARCHAR}, #{item.timeInterval,jdbcType=INTEGER},
        #{item.orderSuccessCount,jdbcType=INTEGER}, #{item.orderFailCount,jdbcType=INTEGER}, #{item.orderCancelCount,jdbcType=INTEGER}, #{item.orderRefundCount,jdbcType=INTEGER},#{item.timeOut,jdbcType=INTEGER},
        #{item.rechargeTimeOut,jdbcType=INTEGER}, #{item.rechargeSuccessTimeOut,jdbcType=INTEGER},
        #{item.rechargeFailTimeOut,jdbcType=INTEGER}, #{item.rechargeNoResponseTimeOut,jdbcType=INTEGER},
        0, now(), now())
    </foreach>
</insert>

二、批量更新

思路同上述【1.2 多條語句】插入情況,具體自行結合需要拼接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM