https://www.jacksonlhj.cn/articles/2022/03/18/1647581719475.html
一、mybatis+oracle批量插入
oracle想要主键自增就要使用序列,所以先要创建序列。
创建序列
CREATE SEQUENCE sequencename
[INCREMENT BY n] 定义序列增长步长,省略为1
[START WITH m] 序列起始值,省略为1
[{MAXVALUE n | NOMAXVALUE}] 序列最大值,
[{MINVALUE n | NOMINVALUE}] 序列最小值
[{CYCLE | NOCYCLE}] 到达最大值或最小值后,继续产生序列(默认NOCYCLE)
[{CACHE n | NOCACHE}]; CACHE默认是20
简单例子
CREATE SEQUENCE seq_test
START WITH 1
INCREMENT BY 1
批量插入代码:
<insert id="insertUserRolespl" useGeneratedKeys="false" keyProperty="id" parameterType="java.util.List">
<selectKey resultType="DECIMAL" keyProperty="id" order="BEFORE">
select seq_user_roles.nextval as id from dual
</selectKey>
insert into USER_ROLES (ID, USER_ID, ROLE_NAME)
select seq_user_roles.nextval ID,A.* from(
<foreach collection="list" index="index" item="item" separator="UNION ALL" >
(SELECT
#{item.userId},#{item.roleName}
FROM dual)
</foreach>
)A
</insert>
与mysql不同的是在oracle没有values,所以在<foreach>
标签中的属性配置为separator=“UNION ALL”,在<foreach>
标签内使用(select ..... from dual)
,如上面代码所示。
注意:必须在<insert>
中加入useGeneratedKeys=“false”,不然会报错。
对应属性的意义:
useGeneratedKeys=“true”: 使用自增主键获取主键值。
keyProperty: 对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给javaBean的哪个属性。
二、mybatis+MySQL批量插入
mysql相对oracle的批量插入简单一点,mysql可以设置主键自增,不需要像oracle一样通过创建序列。
以下看代码:
<insert id="batchInsert" parameterType="java.util.List">
insert into USER_ROLES (ID, USER_ID, ROLE_NAME)
VALUES
<foreach collection="list" item="item" separator=";">
(#{item.id},#{item.userId},#{item.roleName)
</foreach>
</insert>
整理:
foreach元素的属性主要有 item,index,collection,open,separator,close。
1、item表示集合中每一个元素进行迭代时的别名。
2、index指定一个名字,用于表示在迭代过程中,每次迭代到的位置。
3、open表示该语句以什么开始。
4、separator表示在每次进行迭代之间以什么符号作为分隔符。
5、close表示以什么结束。
6、collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:list、map、array
1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map