MySQL中,批量插入数据到表,会在一定程度提高效率。
insert into table (column1, column2)values(value1, value2), (value1, value2)
对于List<Map<String, Object>>类型的参数,使用mybatis实现上面语句需要用到动态SQL–foreach。
<insert id="batchInsert">
insert into ${table_name} (
id, name)
values
<foreach collection="list" item="item" index="index" open="(" separator="," close=")">
#{item.id, jdbcType=VARCHAR},
#{item.name, jdbcType=VARCHAR}
</foreach>
</insert>
上面的语句对于MySQL执行起来没有问题,但对Oracle数据库则会报如题错误:SQL命令未正确结束。
可以用Oracle虚拟表来解决这个问题,首先将数据foreach作为一张虚拟表,然后全量插入到新表中。
INSERT INTO TEMP_20200210 (DMC)
SELECT CD.* FROM
(
SELECT 1234567 FROM DUAL UNION
SELECT 1234568 FROM DUAL UNION
SELECT 1234568 FROM DUAL
) CD
由此,改造mybatis语句如下:
<insert id="batchInsert">
insert into ${table_name} (
id, name)
SELECT A.* FROM (
<foreach collection="list" item="item" index="index" separator="UNION ALL">
select
#{item.id, jdbcType=VARCHAR} id,
#{item.name, jdbcType=VARCHAR} name
FROM DUAL
</foreach>
) A
</insert>
标签:VARCHAR,name,jdbcType,00933,DUAL,SQL,Mybatis,id,SELECT From: https://www.cnblogs.com/xfeiyun/p/16622998.html