MyBatis批量插入数据

项目背景:springboot+mybatis

GitHub地址:https://github.com/ChaseDreamBoy/SpringBootDemo

一、批量操作的xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xh.mybatis.bulk.dao.UserDao">

    <insert id="bulkAddUser" parameterType="java.util.List">
        insert into user
        (username, age, sex, birthday)
        values
        <foreach collection="users" item="user" index="index" separator=",">
            (#{user.userName}, #{user.age},#{user.sex},#{user.birthday})
        </foreach>
    </insert>

</mapper>

我这里的id是通过mysql自动递增的,如果使用类似于序列添加id可以使用:

    <insert id="bulkAddUser" parameterType="java.util.List">
        <selectKey resultType ="java.lang.Long" keyProperty= "id" order= "AFTER">
            SELECT USER_SEQ()
        </selectKey >
        insert into user
        (username, age, sex, birthday)
        values
        <foreach collection="users" item="user" index="index" separator=",">
            (#{user.userName}, #{user.age},#{user.sex},#{user.birthday})
        </foreach>
    </insert>

二、dao层

dao层和普通dao层没有区别,只不过批量操作需要传入的是对象集合(也可以是List、Set、Map 对象或者数组对象等):

package com.xh.mybatis.bulk.dao;

import com.xh.mybatis.bulk.entity.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author xiaohe
 * @version V1.0.0
 */
public interface UserDao {

    int bulkAddUser(@Param("users") List<User> users);

}

三、foreach标签

对于xml中的foreach标签:
foreach元素的主要属性有 item,index,collection,open,separator,close。

  • item表示集合中每一个元素进行迭代时的别名
  • index指定一个名字,用于表示在迭代过程中,每次迭代到的位置
  • open表示该语句以什么开始
  • separator表示在每次进行迭代之间以什么符号作为分隔 符
  • close表示以什么结束
  • collection表示传入过来的参数的数据类型。该参数为必选。collection属性值可以为list、array,也可以为入参的名称。

foreach可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象传递给 foreach 作为集合参数。当使用可迭代对象或者数组时,index 是当前迭代的次数,item 的值是本次迭代获取的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

四、bulk sql

在我的项目中跑批量插入的测试用例打印的SQL:
sql

印证了批量插入执行的SQL语句等价于:

insert into user (username, age, sex, birthday) values (?, ?,?,?) , (?, ?,?,?) , (?, ?,?,?) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值