下语句实现MySQL批量插入更新功能。插入数据,如果数据库中主键已存在则更新on duplicate key update后的字段,主键不变。
<insert id="saveOrUpdate" parameterType="java.util.List">
insert into order_audit_stat
<trim prefix="(" suffix=")" >
day
,shop_code
,source_trade_order_num
,sys_trade_order_num
,today_manual_audit_order_num
,today_auto_audit_order_num
,today_audit_order_total_num
,goods_manual_audit_num
,goods_manual_audit_split_num
,goods_sys_audit_num
,goods_sys_audit_split_num
,create_time
,update_time
</trim>
values
<foreach collection="list" item="item" index="index" separator=",">
<trim prefix=" (" suffix=")" suffixOverrides="," >
#{item.day}
,#{item.shopCode}
,#{item.sourceTradeOrderNum}
,#{item.sysTradeOrderNum}
,#{item.todayManualAuditOrderNum}
,#{item.todayAutoAuditOrderNum}
,#{item.todayAuditOrderTotalNum}
,#{item.goodsManualAuditNum}
,#{item.goodsManualAuditSplitNum}
,#{item.goodsSysAuditNum}
,#{item.goodsSysAuditSplitNum}
,#{item.createTime}
,#{item.updateTime}
</trim>
</foreach>
on duplicate key update
source_trade_order_num = VALUES(source_trade_order_num)
,sys_trade_order_num = VALUES(sys_trade_order_num)
,today_manual_audit_order_num = VALUES(today_manual_audit_order_num)
,today_auto_audit_order_num = VALUES(today_auto_audit_order_num)
,today_audit_order_total_num = VALUES(today_audit_order_total_num)
,goods_manual_audit_num = VALUES(goods_manual_audit_num)
,goods_manual_audit_split_num = VALUES(goods_manual_audit_split_num)
,goods_sys_audit_num = VALUES(goods_sys_audit_num)
,goods_sys_audit_split_num = VALUES(goods_sys_audit_split_num)
,update_time = VALUES(update_time)
</insert>
on duplicate key update后面执行的更新语句用VALUES取值,因为这些字段在执行插入时已用#{}赋过值。
另外replace into 也可实现更新已存在的记录,但是表中定义的主键会变化。