可以使用 MySQL 的 INSERT INTO … ON DUPLICATE KEY UPDATE 语句来实现批量插入更新。
假设有一个表 ams_storageCargo,其主键为 id,可以将数据列表存储在一个 List 对象中,然后使用 MyBatis 的 foreach 标签进行循环插入,同时使用 INSERT INTO … ON DUPLICATE KEY UPDATE 语句进行重复记录的更新操作。
示例代码如下:
<insert id="batchInsertOrUpdate" parameterType="java.util.List">INSERT INTO ams_storageCargo(totalAmount, number, totalWeight, leaveOrEnter, storeName, id, time, enterpriseID, warehouse, enterpriseName, channelID, storeCode)VALUES<foreach collection="list" item="item" separator=",">(#{item.totalAmount}, #{item.number}, #{item.totalWeight}, #{item.leaveOrEnter}, #{item.storeName}, #{item.id}, #{item.time}, #{item.enterpriseID}, #{item.warehouse}, #{item.enterpriseName}, #{item.channelID}, #{item.storeCode})</foreach>ON DUPLICATE KEY UPDATEtotalAmount = totalAmount + VALUES(totalAmount),totalWeight = totalWeight + VALUES(totalWeight)
</insert>
其中, 标签的 id 属性为 batchInsertOrUpdate,parameterType 属性指定参数类型为 java.util.List。VALUES 子句中的字段和值都使用占位符 #{item.xxx} 来代替,其中 item 表示列表中的对象,xxx 表示对象中对应的字段名。
ON DUPLICATE KEY UPDATE 子句用于处理重复记录的更新操作,其中使用了 MySQL 的 VALUES() 函数来获取插入时的值。注意,ON DUPLICATE KEY UPDATE 子句中的字段名必须使用反引号 ` 符号括起来,否则可能会导致语法错误。
在实际使用过程中,需要根据实际情况调整 SQL 语句,并进行性能测试和优化。同时,也需要注意数据的一致性和正确性,避免因为重复记录的更新操作导致数据出现异常。
优缺点
使用 INSERT INTO … ON DUPLICATE KEY UPDATE 语句进行批量插入更新是一种常见的做法,可以减少与数据库的交互次数,提高插入数据的效率。这种方法在处理大批量数据时比较有效。
然而,在实际使用过程中,需要根据具体场景进行优化和调整。如果数据量较大,可能会导致数据库连接超时或占用过多的内存空间,这时可以考虑将插入操作拆分成多个较小的批次进行处理,或者使用分页查询的方式进行批量插入。
同时,也需要注意数据的一致性和正确性。如果使用 INSERT INTO … ON DUPLICATE KEY UPDATE 语句进行更新操作时,需要确保更新的字段对应的值是正确的,否则可能会导致数据异常。可以通过限制更新字段的范围、增加数据校验等方法来避免这种情况。
总的来说,使用 INSERT INTO … ON DUPLICATE KEY UPDATE 语句进行批量插入更新是一种有效的做法,但需要根据实际情况进行优化和调整,并保证数据的一致性和正确性。