MyBatis MySQL 实现批量不存在则插入,存在则更新

在日常开发中,需要从数据库中批量导入所有数据,同时这些数据可能在目标表中存在,也可能不存在。因为数据量还比较大,如果一条一条在业务代码里判断然后插入或者更新,非常非常慢。

这个时候,我们可以对判断【数据是否存在】的字段建立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) 代替

你可能感兴趣的:(疑难问题,SQL)