项目场景:
十万条甚至更多的数据新增或者修改
问题描述
现在有十万条数据甚至更多数据,在这些数据中,有部分数据存在数据库中,有部分数据确是新数据,存在的数据需要更新,不存在的数据需要新增
原因分析:
几十万的数据有新增,有修改,我们肯定不能去每条都要去数据库查询验证是否存在,这样数据库也扛不住
解决方案:
提示:有两种解决方案简单记录下,在mybatis中使用的场景
1、第一种解决方式,使用on duplicate key update,主键重复去修改,不重复就新增这里的order_id就是主键
java
<insert id="addOrUpdateKryOrderMst" parameterType="list">
insert into ${schema}.me_kry_order_mst
(`order_id`,
`trade_no`,
`trade_type`,
`trade_status`,
`order_time`,
`check_out_time`,
`source`,
`source_name`,
`received_amount`,
`cust_real_pay`,
`trade_amount`,
`privilege_amount`)
values
<foreach collection="kryOrderMstParam" item="item" separator=",">
(#{item.orderId}, #{item.tradeNo}, #{item.tradeType}, #{item.tradeStatus}, #{item.orderTime}, #{item.checkOutTime}, #{item.source}, #{item.sourceName}, #{item.receivedAmount}, #{item.custRealPay}, #{item.tradeAmount}, #{item.privilegeAmount})
</foreach>
on duplicate key update
trade_no =
values (trade_no), trade_type =
values (trade_type), trade_status =
values (trade_status), order_time =
values (order_time), check_out_time =
values (check_out_time), `source` =
values (`source`), source_name =
values (source_name), received_amount =
values (received_amount), cust_real_pay =
values (cust_real_pay), trade_amount =
values (trade_amount), privilege_amount =
values (trade_amount)
</insert>
2、第二种解决方式,使用replace into,若是主键存在就删除重新新增一条
java
<insert id="addOrUpdateKryOrderMst" parameterType="list">
replace into ${schema}.me_kry_order_mst
(`order_id`,
`trade_no`,
`trade_type`,
`trade_status`,
`order_time`,
`check_out_time`,
`source`,
`source_name`,
`received_amount`,
`cust_real_pay`,
`trade_amount`,
`privilege_amount`)
values
<foreach collection="kryOrderMstParam" item="item" separator=",">
(#{item.orderId}, #{item.tradeNo}, #{item.tradeType}, #{item.tradeStatus}, #{item.orderTime}, #{item.checkOutTime}, #{item.source}, #{item.sourceName}, #{item.receivedAmount}, #{item.custRealPay}, #{item.tradeAmount}, #{item.privilegeAmount})
</foreach>
</insert>