Springboot Mybatis 不存在插入数据,存在则更新数据

前言

是不是经常看到代码, 查一下数据库,如果存在数据,就做更新语句调用; 如果不存在,就插入。

今天该篇介绍的 是使用 

   INSERT INTO
   
   ON DUPLICATE KEY UPDATE

   
   来实现我们上述的场景, 不需要自己再判断来判断去的。

正文

ON DUPLICATE key update

是根据主键索引或者唯一索引字段是否重复来判断是否执行,如果重复则执行update,否则则执行insert。

优先级主键>唯一索引

当主键重复时则执行update
当主键不重复,唯一索引重复时也执行update
当主键和唯一索引值都不重复才执行insert
 

取决于我们写的sql带没带主键或者唯一索引。

开搞 ,举个例子 ,角色数据,角色编码 CODE 是唯一的, 然后我们角色名称和使用状态是允许修改编辑的。

简单贴下代码 :

实体Role:
 

@Data
@Accessors(chain = true)
public class Role {

    private Integer id;
    private String  code;
    private String name;
    private Integer status;
}

mapper :

/**
 * @author JCccc
 */
@Mapper
public interface RoleMapper {

   void insertOrUpdate (Role role);

}

mapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.dotest.mapper.RoleMapper">
    <resultMap id="BaseResultMap" type="com.example.dotest.entity.Role">
        <result column="ID" property="id" jdbcType="INTEGER"/>
        <result column="CODE" property="code" jdbcType="VARCHAR"/>
        <result column="NAME" property="name" jdbcType="VARCHAR"/>
        <result column="STATUS" property="status" jdbcType="INTEGER"/>
    </resultMap>
    <insert id="insertOrUpdate" parameterType="com.example.dotest.entity.Role">

         INSERT INTO `product` (code,name,status)

         VALUES (#{code,jdbcType=VARCHAR},#{name,jdbcType=VARCHAR}, #{status,jdbcType=INTEGER})

         ON DUPLICATE KEY UPDATE name =#{name,jdbcType=VARCHAR} ,status=#{status,jdbcType=INTEGER};

       </insert>
</mapper>

简单介绍下:

实践看看效果 :

当前数据

执行下调用,新增一个角色 :
 

可以看到数据新增了,所以触发的是 insert into  因为数据库里面刚才确实不存在 角色code为 ZDD01 的数据:

 

这时候,我们把角色名字name 和 status 改下 ,code 不变,继续调用这个方法,看看效果:
 

可以看到 触发了更新, code ZDD01数据存在,所以执行了后面的name 、status 更新:

 

 好了该篇就到这。

猜你喜欢

转载自blog.csdn.net/qq_35387940/article/details/131417615
今日推荐