前言
是不是经常看到代码, 查一下数据库,如果存在数据,就做更新语句调用; 如果不存在,就插入。
今天该篇介绍的 是使用
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 更新:
好了该篇就到这。