项目场景:
十万条甚至更多的数据新增或者修改
问题描述
现在有十万条数据甚至更多数据,这些数据中有的需要更新,有的需要插入,在库中存在的数据需要更新,不存在的数据则新增。
原因分析:
几十万的数据有新增,有修改,我们肯定不能在代码中写循环,每一条数据都去数据库中去查询匹配一次,要是数十万条数据那就是查数十万次数据库,这样显然是不可能的,数据库也扛不住
解决方案:
提示:有两种解决方案简单记录下,在mybatis中使用的场景
1、第一种解决方式,使用on duplicate key update,主键重复去修改,不重复就新增,这里的order_id就是主键
<insert id="addOrUpdateKryOrderMst" parameterType="list">
insert into ${schema}.xxx表
(`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="OrderParam" 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,若主键存在,则删除这一条数据,并且新增一条
<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>