在日常开发中,需要从数据库中批量导入所有数据,同时这些数据可能在目标表中存在,也可能不存在。因为数据量还比较大,如果一条一条在业务代码里判断然后插入或者更新,非常非常慢。
这个时候,我们可以对判断【数据是否存在】的字段建立UNIQUE索引,然后使用如下的方式,进行批量地插入/更新
<insert id="insertBatch" >
INSERT INTO table(org_id, org_name, org_fullid, org_fullname, creator, gmt_create, modifier)
VALUES
<foreach collection="allCollections" separator="," item="fullIdOrg">
(
#{fullIdOrg.orgId},
#{fullIdOrg.orgName},
#{fullIdOrg.orgFullid},
#{fullIdOrg.orgFullname},
#{fullIdOrg.creator},
#{fullIdOrg.gmtCreate},
#{fullIdOrg.modifier}
)
</foreach>
ON DUPLICATE KEY UPDATE
org_fullid=VALUES(org_fullid),
org_name=VALUES(org_name),
org_fullname=VALUES(org_fullname),
modifier=VALUES(modifier)
</insert>
这边UPDATE的字段不需要和INSERT语句的字段对应,foreach中迭代的变量也可以在循环外获取到。
因为是跨数据源,所以这边用到了一个foreach的迭代,如果是单数据源,应该可以用INSERT INTO (,) VALUE (SELECT xxx FROM xxx) 代替