方法一:
开启一个事物,使用for或者while循环遍历待插入的对象集合,逐一插入,具体代码略
方法二:
<!-- 插入规则条件 -->
<insert id="insertRuleConditionInfo" parameterClass="java.util.List">
insert into
RULE_CONDITION_INFO
(RULE_CONDITION_ID,
RULE_GROUP_ID,
RULE_TEMPLATE_ID,
RULE_TEMPLATE_VALUE,
RULE_TEMPLATE_REL)
select
SEQ_RULE_CONDITION_INFO.nextval, rule_group_id,
rule_template_id,rule_template_value,rule_template_rel
from (
<iterate conjunction="union all">
select
#v[].rule_group_id# rule_group_id,
#v[].rule_template_id# rule_template_id,
#v[].rule_template_value#
rule_template_value,
#v[].rule_template_id# rule_template_rel
from dual
</iterate>
) a
</insert>
缺点:
这种方式 是先将List里面的值,循环拼接成一个查询虚拟表,然后再通过查询虚拟表,获取每一行的数据插入到你需要插入的表里面去,所以你拼接的SQL语句的长度不能超过有没有超过64KB(Oracle的最大长度)
方法三、
< insert id =" insert_table " parameterClass ="java.util.List" >
<![CDATA[
insert into test( col1 , col2 , col3 ) values
]]>
< iterate conjunction ="," >
<![CDATA[
(#test[]. col1 #, # test []. col2 #, # test []. col3 #)
]]>
</ iterate >
</ insert >
注意:
这个方式没去尝试,但是网上说oralce不支持该方式,mysql支持
方法四、
<insert id="templateStationRelInsert" parameterClass="java.util.List">
INSERT All
<iterate conjunction=" ">
INTO template_station_rel
(template_id,station_id,create_data)
VALUES
(#list[].template_id#, #list[].station_id#,sysdate)
</iterate>
SELECT * FROM dual
</insert>
缺点:
这种方式,Oracle支持,其他的数据库就不知道支不支持,但是插入的表的列数* 你插入的行数 <1000才有效
如:有13列字段,总共需要插入266行,在执行的时候,他就报:ORA-24335 cannot support more than 1000 columns
关于四种方式的执行效率没有去测试,不知道哪一种方式最快。因为本次插入只是插入一个政策,数据量小。后续有时间补充