Mybatis 批量操作存在则更新或者忽略,不存在则插入
Mybatis 批量操作新增,如果存在重复有下列2种处理方式:
1、存在则忽略代码示例:
<insert id="insertDuplicateKeyIgnoreList">
INSERT IGNORE INTO specs(`status`,`type`,`code`,`name`,`create_time`,`create_by`)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.status,jdbcType=INT},
#{item.type,jdbcType=INT},
#{item.code,jdbcType=VARCHAR},
#{item.name,jdbcType=VARCHAR},
#{item.createTime,jdbcType=DATETIME},
#{item.createBy,jdbcType=VARCHAR} )
</foreach>
</insert>
如果你想知道 INSERT IGNORE 实际影响了多少行,可以使用 SELECT ROW_COUNT():
如:
<insert id="insertDuplicateKeyIgnoreList">
INSERT IGNORE INTO specs(`status`,`type`,`code`,`name`,`create_time`,`create_by`)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.status,jdbcType=INT},
#{item.type,jdbcType=INT},
#{item.code,jdbcType=VARCHAR},
#{item.name,jdbcType=VARCHAR},
#{item.createTime,jdbcType=DATETIME},
#{item.createBy,jdbcType=VARCHAR} )
</foreach>;
SELECT ROW_COUNT(); -- 返回实际插入的行数
</insert>
2、存在则更新代码示例:
INSERT INTO specs(`status`,`type`,`code`,`name`,`create_time`,`create_by`)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.status,jdbcType=INT},
#{item.type,jdbcType=INT},
#{item.code,jdbcType=VARCHAR},
#{item.name,jdbcType=VARCHAR},
#{item.createTime,jdbcType=DATETIME},
#{item.createBy,jdbcType=VARCHAR} )
</foreach>
ON DUPLICATE KEY UPDATE
<trim prefix="" suffixOverrides=",">
<foreach collection="list" separator="," item="item">
<if test="item.name != null and item.name != ''">
`name` = VALUES(name)
</if>
</foreach>
</trim>
ON DUPLICATE KEY UPDATE 语句中的“重复键”是指那些定义了唯一性约束的列。这些列可能是:
1. 主键(PRIMARY KEY):表中的主键必须是唯一的。
2. 唯一索引(UNIQUE INDEX):除了主键之外,还可以定义唯一索引,保证某些列的组合是唯一的。
当插入的数据在这些唯一性约束列上与现有数据发生冲突时,MySQL 将不会插入新的记录,而是根据 ON DUPLICATE KEY UPDATE 子句进行相应的更新操作。
总结
INSERT IGNORE:当插入记录违反唯一键约束时,忽略该记录,并继续处理其他记录。
ON DUPLICATE KEY UPDATE:当插入记录违反唯一键约束时,更新已存在的记录。