需求:有个表中数据需实现在为曾录入情况下新增,录入之后进行修改。
前面看同事代码每次都是先拿数据去数据库查找,之后再根据返回结果进行新增或修改操作。觉得比较麻烦,所以想到了ON DUPLICATE KEY UPDATE。
使用前提:基于唯一索引(单一自动或复合字段的唯一索引)或者主键使用。
开始正题
建表:设置主键
编写对应的控制层和服务层代码,下面主要描述sql。
这里我们写成动态sql,使用trim和if标签来控制,具体的标签使用,可以下来再查查,此处只简单描述。
<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号}] 新增/修改成功
我们再去数据库查看,可以看到数据已经录入
那么我们进行修改操作
在上图中我们可以看到,由于主键重复,进行了修改操作,数据库显示修改之后数据。
欧克,简单的测试就到这里了。