ON DUPLICATE KEY UPDATE 使用

需求:有个表中数据需实现在为曾录入情况下新增,录入之后进行修改。

前面看同事代码每次都是先拿数据去数据库查找,之后再根据返回结果进行新增或修改操作。觉得比较麻烦,所以想到了ON DUPLICATE KEY UPDATE。

使用前提:基于唯一索引(单一自动或复合字段的唯一索引)或者主键使用。

开始正题

建表:设置主键

 编写对应的控制层和服务层代码,下面主要描述sql。

这里我们写成动态sql,使用trimif标签来控制,具体的标签使用,可以下来再查查,此处只简单描述。

   <insert id="insertOrUpdate">
        INSERT INTO t_notification_card (
        <trim suffixOverrides=",">/**trim标签:suffixOverrides 去除sql语句后面的关键字或者字符*/
            <if test="chemicalsId!=null">CHEMICALS_ID,</if>
            <if test="chemicalsName!=null">CHEMICALS_NAME,</if>
            <if test="warningWords!=null">WARNING_WORDS,</if>
            <if test="hazardDescription!=null">HAZARD_DESCRIPTION,</if>
            <if test="casNo!=null">CAS_NO,</if>
        </trim>)
        VALUES
        (<trim suffixOverrides=",">
        <if test="chemicalsId!=null">#{chemicalsId},</if>
        <if test="chemicalsName!=null">#{chemicalsName},</if>
        <if test="warningWords!=null">#{warningWords},</if>
        <if test="hazardDescription!=null">#{hazardDescription},</if>
        <if test="casNo!=null">#{casNo},</if>
    </trim>)
        ON DUPLICATE KEY UPDATE /**前提:该表有主键索引.*/
        <trim suffixOverrides=",">
            <if test="chemicalsId!=null">CHEMICALS_ID=values(CHEMICALS_ID),</if>
            <if test="chemicalsName!=null">CHEMICALS_NAME=values(CHEMICALS_NAME),</if>
            <if test="warningWords!=null">WARNING_WORDS=values(WARNING_WORDS),</if>
            <if test="hazardDescription!=null">HAZARD_DESCRIPTION=values(HAZARD_DESCRIPTION),</if>
            <if test="casNo!=null">CAS_NO=values(CAS_NO),</if>
        </trim>
    </insert>

下面我们使用ApiPost来进行接口测试

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@59bc58cd] was not registered for synchronization because synchronization is not active
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@228f4424] will not be managed by Spring
==>  Preparing: INSERT INTO t_notification_card ( /**trim标签:suffixOverrides 去除sql语句后面的关键字或者字符*/ CHEMICALS_ID, CHEMICALS_NAME, WARNING_WORDS, HAZARD_DESCRIPTION, CAS_NO ) VALUES ( ?, ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE /**前提:该表有主键索引.*/ CHEMICALS_ID=values(CHEMICALS_ID), CHEMICALS_NAME=values(CHEMICALS_NAME), WARNING_WORDS=values(WARNING_WORDS), HAZARD_DESCRIPTION=values(HAZARD_DESCRIPTION), CAS_NO=values(CAS_NO) 
==> Parameters: 0070b18d86254f049cee8ccaac18d07f(String), 化学品中文名(String), 警示词(String), 象形图,危险性说明(String), CAS号(String)
<==    Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@59bc58cd]
接口[/NotificationCard/insertOrUpdate], 参数[{chemicalsId=0070b18d86254f049cee8ccaac18d07f, chemicalsName=化学品中文名, warningWords=警示词, hazardDescription=象形图,危险性说明, casNo=CAS号}] 新增/修改成功 

我们再去数据库查看,可以看到数据已经录入

 那么我们进行修改操作

 

 在上图中我们可以看到,由于主键重复,进行了修改操作,数据库显示修改之后数据。

欧克,简单的测试就到这里了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值