无法使用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>
答
仔细查看您的选择语句。在期望列名或函数的地方,你传递参数。你应该将其更改为类似(注意的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>
答
我发现第一个答案不适合我的工作,然后我发现另一种解决方案如下:
<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>
但在10000条记录它的工作原理不是插入的每个记录一个b慢速一个 – Tural 2014-10-13 04:46:49