2014-10-09 131 views
0

我嘗試使用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}「

什麼是錯?如何解決它?

回答

1

我找到了解決方案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

0

仔細查看您的選擇語句。在期望列名或函數的地方,你傳遞參數。你應該將其更改爲類似(注意的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

1

我發現第一個答案不適合我的工作,然後我發現另一種解決方案如下:

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