前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mybatis 实现插入或更新数据功能,数据存在时只更新

mybatis 实现插入或更新数据功能,数据存在时只更新

作者头像
鳄鱼儿
发布2024-05-21 21:14:28
1130
发布2024-05-21 21:14:28
举报

需求

提供一个接口,既能保证新数据的插入操作,又能在数据存在时进行数据更新操作

实现:on duplicate key update

在mysql中,提供有on duplicate key update 指令,该指令表示如果唯一索引(UNIQUE)或主键(PRIMARY KEY)出现重复值时,则执行更新操作;如果不存在唯一冲突,则执行插入操作。

on duplicate key update 指令只是MySQL特性。

实例:单行数据

创建数据表,建立主键约束PRIMARY KEY (ue_id)和唯一约束UNIQUE KEYedge_info_UN (unique_id)

代码语言:javascript
复制
CREATE TABLE `edge_info` (
  `ue_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '设备id',
  `unique_id` varchar(50) DEFAULT '' COMMENT 'MAC',
  `temperature` varchar(500) DEFAULT '' COMMENT '温度',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`ue_id`),
  UNIQUE KEY `edge_info_UN` (`unique_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1261 DEFAULT CHARSET=utf8 COMMENT='边端信息心跳表';

insert语句末尾增加on duplicate key update 指令,当主键ue_id或unique_id重复时,会执行更新操作,否则执行插入操作。

代码语言:javascript
复制
	<insert id="insertOrUpdateEdgeInfo" parameterType="EdgeInfo" useGeneratedKeys="true" keyProperty="ueId">
        insert into edge_info
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="uniqueId != null">
                unique_id,
            </if>
            <if test="temperature != null">
                temperature,
            </if>
            <if test="createTime != null">
                create_time,
            </if>
            <if test="updateTime != null">
                update_time,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="uniqueId != null">
                #{uniqueId},
            </if>
            <if test="temperature != null">
                #{temperature},
            </if>
            <if test="createTime != null">
                #{createTime},
            </if>
            <if test="updateTime != null">
                #{updateTime},
            </if>
        </trim>
        on duplicate key update
        <trim>
            <if test="uniqueId != null">
                unique_id = #{uniqueId},
            </if>
            <if test="temperature != null">
                temperature = #{temperature},
            </if>
            <if test="createTime != null">
                create_time = #{createTime},
            </if>
            <if test="updateTime != null">
                update_time = #{updateTime}
            </if>
        </trim>
    </insert>

实例:批量数据

同样采用上述表作为示例来讲解,在原来代码基础上增加foreach标签,代码如下。同样当主键ue_id或unique_id重复时,会执行更新操作,否则执行插入操作。

代码语言:javascript
复制
	<insert id="batchInsertOrUpdateEdgeInfo" parameterType="EdgeInfo" useGeneratedKeys="true" keyProperty="ueId">
        insert into edge_info(
        	unique_id, temperature, create_time, update_time
       	)
       	values
       	<foreach collection="edgeInfoList" item="edge" separator=",">
       		(
       		#{edge.uniqueId},
            #{edge.temperature},
            #{edge.createTime},
            #{edge.updateTime}
        </foreach>
        on duplicate key update
        unique_id = values(unique_id),
        temperature = values(temperature),
        create_time = values(create_time),
        update_time = values(update_time)
    </insert>

当批量插入数据量较大时,为了确保接口响应的性能,可以考虑将数据分批地批量插入,如5000条数据需要插入,我们可以将数据分成100行执行一次批量插入。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求
  • 实现:on duplicate key update
    • 实例:单行数据
      • 实例:批量数据
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档