无法使用MyBatis批量插入到Oracle数据库中

问题描述:

我尝试使用MyBatis(与Spring集成)在Oracle数据库中批量插入表中。无法使用MyBatis批量插入到Oracle数据库中

它是在映射器接口的方法的定义:

public void savePayments(@Param("payments") List<MassPaymentItem> payments); 

它是一个MyBatis的XML映射器代码:

<insert id="savePayments" parameterType="MassPaymentFileItem" useGeneratedKeys="false"> 
    INSERT INTO mass_payments 
     (payment_id, file_id, msisdn, amount, status) 
    <foreach collection="payments" item="payment" index="index" separator=" UNION ALL "> 
     SELECT SEQ_MASS_PAYMENT.nextval, #{payment.fileId}, #{payment.msisdn}, #{payment.amount}, 0 FROM DUAL 
    </foreach> 
</insert> 

当我执行该I接收MyBatisSystemException与消息“嵌套的异常是有机.apache.ibatis.builder.BuilderException:不正确的内联参数映射格式应该是:#{propName,attr1 = val1,attr2 = val2}“

什么是错?如何解决它?

我找到了解决方案here

<insert id="savePayments"> 
    INSERT ALL 
    <foreach collection="payments" item="payment"> 
    INTO 
     mass_payments_t (payment_id, file_id, msisdn, amount) 
    VALUES 
     (seq_mass_payment.nextval, #{payment.fileId, javaType=Integer, jdbcType=NUMERIC}, #{payment.msisdn, javaType=String, jdbcType=VARCHAR}, #{payment.amount, javaType=BigDecimal, jdbcType=NUMERIC}) 
    </foreach> 
    SELECT * FROM dual 
</insert> 
+0

但在10000条记录它的工作原理不是插入的每个记录一个b慢速一个 – Tural 2014-10-13 04:46:49

仔细查看您的选择语句。在期望列名或函数的地方,你传递参数。你应该将其更改为类似(注意的from位置:

<foreach collection="payments" item="payment" index="index" separator=" UNION ALL "> 
     (SELECT SEQ_MASS_PAYMENT.nextval from DUAL), #{payment.fileId}, #{payment.msisdn}, #{payment.amount}, 0 
    </foreach> 
+0

它不工作 – Tural 2014-10-10 04:41:34

+0

我收到同样的错误 – Tural 2014-10-10 04:56:00

我发现第一个答案不适合我的工作,然后我发现另一种解决方案如下:

<insert id="savePayments" parameterType="java.util.List" useGeneratedKeys="true"> 
     <selectKey resultType="java.lang.Integer" keyProperty="payment_id" 
      order="BEFORE"> 
      SELECT SEQ_MASS_PAYMENT.nextval as payment_id FROM DUAL 
     </selectKey> 
     INSERT INTO mass_payments 
      (payment_id, file_id, msisdn, amount, status) 
      select SEQ_MASS_PAYMENT.nextval, A.* from (
     <foreach collection="payments" item="payment" index="index" separator="UNION ALL"> 
      SELECT 
      #{payment.fileId} as file_id, 
      #{payment.msisdn} as msisdn, 
      #{payment.amount} as amount, 
      0 as status 
      FROM DUAL 
     </foreach>) A 
    </insert>