mybatis+oracle/mysql批量插入

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值