一、DUPLICATE KEY UPDATE +关键字
1、准备一个表
2、给特定字段创建一个唯一索引(可以是组合索引)
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `status` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `create_date` datetime NULL DEFAULT NULL, `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `update_date` datetime NULL DEFAULT NULL, `remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `Indexes_1`(`username`, `phone`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1;
3、上手操作,示例SQL
insert into user(username,phone,status,create_by,create_date,update_by,update_date,remarks) values('test','123456789','0','system','2022-01-01','system','2022-01-01','') ON DUPLICATE KEY UPDATE status = values(status), create_by = values(create_by), create_date = values(create_date), update_by = values(update_by), update_date = values(update_date), remarks = values(remarks)
可以看到已经插入一条数据了,然后我们修改一下 status = ‘1’
insert into user(username,phone,status,create_by,create_date,update_by,update_date,remarks) values('test','123456789','1','system','2022-01-01','system','2022-01-01','') ON DUPLICATE KEY UPDATE status = values(status), create_by = values(create_by), create_date = values(create_date), update_by = values(update_by), update_date = values(update_date), remarks = values(remarks)
这个时候我们就已经达到效果了,数据库并没有新增新的数据,而是直接修改
二、MyBatis中配置
1、单条数据修改SQL配置
<insert id="" parameterType="User"> INSERT INTO user <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id != null">id,</if> <if test="username != null">username,</if> <if test="phone != null">phone,</if> <if test="status != null">status,</if> <if test="createBy != null">create_by,</if> <if test="createDate != null">create_date,</if> <if test="updateBy != null">update_by,</if> <if test="updateDate != null">update_date,</if> <if test="remarks != null">remarks,</if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="id != null">#{id},</if> <if test="username != null">#{username},</if> <if test="phone != null">#{phone},</if> <if test="status != null">#{status},</if> <if test="createBy != null">#{createBy},</if> <if test="createDate != null">#{createDate},</if> <if test="updateBy != null">#{updateBy},</if> <if test="updateDate != null">#{updateDate},</if> <if test="remarks != null">#{remarks},</if> </trim> <trim prefix=" ON DUPLICATE KEY UPDATE " suffixOverrides=","> <if test="status != null">status = values(status),</if> <if test="createBy != null">create_by = values(create_by),</if> <if test="createDate != null">create_date = values(create_date),</if> <if test="updateBy != null">update_by = values(update_by),</if> <if test="updateDate != null">update_date = values(update_date),</if> <if test="remarks != null">remarks = values(remarks),</if> </trim> </insert>
2、多条数据批量修改
<insert id="" parameterType="java.util.List"> insert into user(username,phone,status,create_by,create_date,update_by,update_date,remarks) values <foreach collection="list" item="entity" separator=","> ( #{entity.username}, #{entity.phone}, #{entity.status}, #{entity.createBy}, #{entity.createDate}, #{entity.updateBy}, #{entity.updateDate}, #{entity.remarks} ) </foreach> ON DUPLICATE KEY UPDATE status = values(status), create_by = values(create_by), create_date = values(create_date), update_by = values(update_by), update_date = values(update_date), remarks = values(remarks) </insert>
/* 单条数据修改 */
public long insertOrUpdate(User user);
/* 多数据批量修改或新增 */
public void insertOrUpdateList(List<User> list);