mybatis-存在则更新 ON DUPLICATE KEY UPDATE

欢迎使用Markdown编辑器

绝大多数,一般的情况是:业务逻辑、调用接口时是知道的,这条记录是新增add还是修改update的。
但是有些场景,比如添加购物车,里面有三个商品,p_001,p_002,p_003,现在顾客删除了p_003,新增了p_004.
如何实现呢?

方案1:

a 先去数据库查询购物车之前的商品列表:p_001,p_002,p_003,第一次sql;
b 和新的购物车的商品列表取交集p_001,p_002,、差集(要删除的p_003,新增是p_004);
c 删除p_003,第二次sql;
d 新增p_004,第三次sql.

如何一次数据库操作实现呢?

这就需要“存在则更新,不存在则插入的场景”。
mysql数据原生支持该逻辑。语法就是:

 insert into t_xx(...) values(...)  ON DUPLICATE KEY UPDATE coln1=newValue1,coln2=newValue2...

注意: ON DUPLICATE KEY UPDATE 后面的字段不需要包含联合唯一索引的字段。

唯一索引,根据具体业务,确认联合唯一索引,比如
UNIQUE KEY idx_intention_sbom (intention_code,sbom_code) USING BTREE
这样数据库找到一样的就更新了。
班级class_code=c_1000;
学生:student_code=s00001.
不用取数据查找该班级的学生是否存在,

下面看下mybatis的实现

单条记录

 <insert id="insertOnDuplicate" parameterType="XXXX">
    insert into t_o2oc_intention_product (
        intention_code,
        add_type,
        product_id,
        sbom_code,
        sbom_name)
    values (#{intentionCode,jdbcType=VARCHAR}, #{addType,jdbcType=INTEGER},  #{productId,jdbcType=BIGINT}, #{sbomCode,jdbcType=VARCHAR}, #{sbomName,jdbcType=VARCHAR}})
      ON DUPLICATE KEY UPDATE
      product_id = VALUES(product_id),
        sbom_name = VALUES(sbom_name),
        price = VALUES(price))
  </insert>

多条记录

  
<insert id="insertByBatchOnDuplicate" parameterType="java.util.List">
        insert into t_xxx (
        intention_code,
        add_type,
        product_id,
        sbom_code,
        sbom_name
    )
        values
        <foreach collection="list" item="item" index="index" separator=",">
            ( #{item.intentionCode,jdbcType=VARCHAR},
            #{item.addType,jdbcType=INTEGER},
            #{item.productId,jdbcType=BIGINT},
            #{item.sbomCode,jdbcType=VARCHAR},
            #{item.sbomName,jdbcType=VARCHAR}
        </foreach>
        ON DUPLICATE KEY UPDATE
        product_id = VALUES(product_id),
        sbom_name = VALUES(sbom_name)
    </insert>

仅仅是多了foreach 标签。

你可能感兴趣的:(mybatis)