spring mybatis组合下对oracle的批量插入

mybatis没有实现oracle的批量插入,网上提供的的jdbctemplate方式不能很好控制事务,而xml方式也总不如人意,因在项目中用到该类型情况,整好了,发出来大家共享共享。

<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>

网上很多方法都不注意

 <selectKey resultType="java.lang.Long" keyProperty="seqId" order="BEFORE">
  SELECT 0 FROM DUAL
 </selectKey>

这个地方,使用了

<selectKey resultType="java.lang.Long" keyProperty="seqId" order="BEFORE">
  SQ_CSM_MECH_IMP_DATA_ATTR_ID.NEXTVAL
 </selectKey>

这样会造成序列的多次执行,可是去掉selectKey标签又报错,所以只要改成

SELECT 0 FROM DUAL

就可以了

你可能感兴趣的:(spring,oracle,mybatis,批量插入,insert,batch)