项目背景: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语句等价于:
insert into user (username, age, sex, birthday) values (?, ?,?,?) , (?, ?,?,?) , (?, ?,?,?)