mybatis没有实现oracle的批量插入,网上提供的的jdbctemplate方式不能很好控制事务,而xml方式也总不如人意,因在项目中用到该类型情况,整好了,发出来大家共享共享。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<insert id=
"insertBatch"
parameterType=
"java.util.List"
>
<selectKey resultType=
"java.lang.Long"
keyProperty=
"seqId"
order=
"BEFORE"
>
SELECT
0
FROM DUAL
</selectKey>
insert into T_CSM_MERCH_IMP_DATA_ATTR (SEQ_ID, IMP_SEQ_ID, BATCH_ID,
CHECK_KEY, ATTR_ID, ATTR_TYPE,
ATTR_VAL, STATE)
SELECT SQ_CSM_MECH_IMP_DATA_ATTR_ID.NEXTVAL , A.* FROM
(
<foreach collection=
"list"
item=
"item"
index=
"index"
separator=
"union all"
>
select
#{item.impSeqId,jdbcType=DECIMAL}, #{item.batchId,jdbcType=VARCHAR},
#{item.checkKey,jdbcType=VARCHAR}, #{item.attrId,jdbcType=VARCHAR}, #{item.attrType,jdbcType=VARCHAR},
#{item.attrVal,jdbcType=VARCHAR}, #{item.state,jdbcType=CHAR}
from dual
</foreach>
) A
</insert>
|
网上很多方法都不注意
1
2
3
|
<selectKey resultType=
"java.lang.Long"
keyProperty=
"seqId"
order=
"BEFORE"
>
SELECT
0
FROM DUAL
</selectKey>
|
这个地方,使用了
1
2
3
|
<selectKey resultType=
"java.lang.Long"
keyProperty=
"seqId"
order=
"BEFORE"
>
SQ_CSM_MECH_IMP_DATA_ATTR_ID.NEXTVAL
</selectKey>
|
这样会造成序列的多次执行,可是去掉selectKey标签又报错,所以只要改成
1
|
SELECT
0
FROM DUAL
|
就可以了