下语句实现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 也可实现更新已存在的记录,但是表中定义的主键会变化。