最近项目中使用oracle,现在要将一个包含对象的list集合批量插入到数据库中,由于项目使用的是mybaits,所以便想着用foreach功能进行批量插入。但是oracle与mysql的批量插入有很大的不同,首先oracle不支持主键自增,所以要在数据库中创建序列,才能实现与mysql相同的功能。
下面是创建序列的方式:
语法 CREATE SEQUENCE 序列名 [相关参数]
参数说明
- INCREMENT BY :序列变化的步进,负值表示递减。(默认1)
- START WITH:序列的初始值 。(默认1)
- MAXvalue:序列可生成的最大值。(默认不限制最大值,NOMAXVALUE)
- MINVALUE:序列可生成的最小值。(默认不限制最小值,NOMINVALUE)
- CYCLE:用于定义当序列产生的值达到限制值后是否循环(NOCYCLE:不循环,CYCLE:循环)。
- CACHE:表示缓存序列的个数,数据库异常终止可能会导致序列中断不连续的情况,默认值为20,如果不使用缓存可设置NOCACHE
例如: - create sequence seq_xx --创建序列名称
- increment by 1 --增长幅度
- start with 1 --初始值
- maxvalue 9999999999999999; --最大值
插入语句:
mybatis映射中可以通过<foreach></foreach>标签来实现Oracle的批量插入、更新和删除
<foreach>标签中主要有以下属性:
collection、item、index、open、separate、close
- collection:该属性必须指定,指代Dao层接口传递的数据类型,主要有三种:
- ①:list集合类型;collection=”list“
- ②:array数组类型;collection=”array“
- ③:map映射类型;collection=”map“
- item:别名,表示集合中每一个元素迭代时的别名,获取数据时必须指定用别名来指定,不然会报错。
- index:迭代下标,即迭代过程中的位置。
- open:表示语句以什么开始。
- separate:表示每次迭代之间以什么符号作为分割。
- close:表示语句以什么结束。
Oracle中可以使用java中的for循环逐条插入数据库,但是这种效率比较低,不适合一次性插入大量的数据,所以可以利用Oracle中的“dual”表实现批量处理,并且效率高。
<insert id="insertUserList" parameterType="java.util.List">
INSERT INTO ZZC_USER
(ID,NAME,AGE,CREATE_TIME,UPDATE_TIME)
SELECT SEQ_ZZC_USER.NEXTVAL CITY_ID, A.*
FROM(
<foreach collection="list" item="item" index="index" separator="UNION ALL">
SELECT
#{item.name,jdbcType=VARCHAR} NAME,
#{item.age,jdbcType=NUMBER} AGE,
#{item.createTime,jdbcType=TIMESTAMP} CREATE_TIME,
#{item.updateTime,jdbcType=TIMESTAMP} UPDATE_TIME
FROM dual
</foreach>
)A
</insert>
sql文与mysql的批量插入有很大的不同之处,使用时要注意两者的区别。