广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Mybatis如何实现InsertOrUpdate功能
  • 875
分享到

Mybatis如何实现InsertOrUpdate功能

2024-04-02 19:04:59 875人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录实现InsertOrUpdate功能需求实现mybatis学习笔记:InsertOrUpdate环境前言DaoMapper XML文件行别名主键和唯一索引 实

实现InsertOrUpdate功能

需求

最近在项目开发中遇到这样一个需求:每天需要对相同的数据(也有可能是不同的)进行两次入库操作,数据不存在便insert,存在则update。于是就用到了Mybatis的InsertOrUpdate功能。

实现

每次操作数据库之前,先根据id查询有没有记录,有则进行update操作,没有则进行insert操作。

model类代码如下。其中count为非业务字段(也不是表sheet中的字段),只是方便Mybatis进行insertOrUpdate操作的附加字段。 

import lombok.Data;
@Data
public class Sheet {
 
    
    private String id;
    
    private String customerName;
    
 
    
    private int count;
}

Mybatis的mapper.xml配置文件代码如下。

代码含义:先执行selecTKEy语句,把结果赋值给Sheet类的count属性。

  • 如果count大于0,表示记录已存在,则进行update操作。
  • 如果count等于0,表示没有记录,则进行insert操作。
<update id="insertOrUpdate" parameterType="Sheet" >
        <selectKey keyProperty="count" resultType="int" order="BEFORE">
            select count(1) from sheet where ID= #{id}
        </selectKey>
        <if test="count > 0">
            update sheet 
            <set>
                <if test="customerName != null and customerName != ''">
                    CUSTOMER_NAME= #{customerName},
                </if>
            </set>
            where ID = #{id}
        </if>
        <if test="count==0">
            insert into sheet
            <trim prefix="(" suffix=")" suffixOverrides=",">
                ID,
                <if test="customerName != null and customerName != ''">
                    CUSTOMER_NAME,
                </if>
            </trim>
            <trim prefix="values (" suffix=")" suffixOverrides=",">
                #{id},
                <if test="customerName != null and customerName != ''">
                    #{customerName},
                </if>
            </trim>
        </if>
    </update>

selectKey标签可以给update标签中的parameterType属性(model类)对应的对象设置属性值。selectKey标签的属性描述:

  • keyProperty:selectKey 语句结果应该被设置的目标属性。此处对应的就是Sheet类的count属性。
  • resultType:结果的类型,此处为属性count的类型。
  • order:可以被设置为 BEFORE 或 AFTER。BEFORE表示先执行selectKey语句,后执行update语句;AFTER表示先执行update语句,后执行selectKey语句。

Mybatis学习笔记:InsertOrUpdate

环境

前言

以前使用mongoDB、JOOQ组件的时候都是有insertOrUpdate的功能,现在使用mybatis似乎没有提供这种功能。

最近研究了,这个功能其实是mysql提供的,利用的是duplicate key update;

假设,我们有这么一张表: 

CREATE TABLE `relation` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(64) NOT NULL DEFAULT '' COMMENT '名称',
  `relation_id` varchar(64) NOT NULL DEFAULT '' COMMENT '关联id',
  `type` int(11) NOT NULL DEFAULT '0' COMMENT '0:默认',
  `is_delete` tinyint(4) NOT NULL DEFAULT '0' COMMENT ' 状态值',
  `create_at` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人',
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_at` varchar(64) NOT NULL DEFAULT '' COMMENT '更新人',
  `updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新人',
  PRIMARY KEY (`id`),
  UNIQUE KEY `ix_relation_id_type` (`relation_id`,`type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

注意: ix_relation_id_type:唯一索引

Dao

@Mapper
public interface FlowModelMapper {
    void insertOrUpdate(List<FlowModel> flowModel);
}

Mapper XML文件

<insert id="insertOrUpdate">
    insert into flow_model(name, relation_id, type, is_delete,create_at,update_at)
    values
    <foreach collection="list" item="p" index="index" separator=",">
        (
        #{p.name},
        #{p.relationId},
        #{p.type},
        #{p.isDelete},
        #{p.createAt},
        #{p.updateAt}
        )
    </foreach>
    on duplicate key update
    name=values(name),
    update_at=values(update_at)
</insert>

说明:

  • on duplicate key update这个是非常关键的地方,需要有唯一键和主键。
  • on duplicate key update后面跟着的name=values(name)算是一个固定写法,作用:动态的传入要修改的值。

在Mysql 8.0.20之后,VALUES()在mysql未来的版本会被删除。

官方建议,使用列别名的方式来写:

<insert id="insertOrUpdate">
    insert into flow_model(name, relation_id, type, is_delete,create_at,update_at)
    values
    <foreach collection="list" item="p" index="index" separator=",">
        (
        #{p.name},
        #{p.relationId},
        #{p.type},
        #{p.isDelete},
        #{p.createAt},
        #{p.updateAt}
        )
    </foreach>
    AS fm
    on duplicate key update
    name=fm.name,
    update_at=fm.update_at
</insert>

行别名

insert into …values

语法:insert into ...values(...) AS 行别名 ON DUPLICATE KEY UPDATE 使用行别名。

例如:下面的 new就是行别名。

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;

列别名

或者是:insert into ...values(...) AS 行别名(列别名,列别名,列别名) ON DUPLICATE KEY UPDATE 使用别名

下面的m,n,p是随便取的列别名

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;

注意:

当使用列别名时,必须在VALUES子句后面使用行别名,即使在后面的子句中不使用行别名。

除了insert into … values 场景,insert into …set场景也适用。

语法和上面是一样的:

INSERT INTO t1 SET a=1,b=2,c=3 AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
INSERT INTO t1 SET a=1,b=2,c=3 AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;

主键和唯一索引 

现在假设我们有这些索引:

唯一索引:biz_id、name、code

主键:id

insert into template_url(id,name, code, url, scope, description,
    biz_id, create_by, create_user_id, update_by, update_user_id)
    values
      (
	1,'yutao','yutao','www.baidu.com','yutao','yutao',0,'yutao',0,'yutao',0
      )
    ON DUPLICATE KEY UPDATE
	name=values(name),
    description=values(description),
    url=values(url),
    scope=values(scope),
    update_by=values(update_by),
    update_user_id=values(update_user_id)

主键冲突

假设这时,主键冲突,那么MySQL就会接着判断是否 唯一索引冲突:

① 唯一索引不冲突,那么久执行更新

② 唯一索引冲突,就会报错:

1062 - Duplicate entry '0-yutao-yutao111' for key 'template_url.uk_biz_id_code_name', Time: 0.004000s

编辑时,唯一索引的字段不要修改

小结一下:insertOrUpdate的实现是基于mysql的on duplicate key update 来实现的。

使用ON DUPLICATE KEY UPDATE,如果行作为新行插入,则每行受影响的行值为1。如果更新现有行,则每行受影响的行值为2;如果将现有行设置为其当前值,则每行受影响的行值为0(可以通过配置,使其受影响的行值为1)。

官方地址:

13.2.6.2 INSERT … ON DUPLICATE KEY UPDATE Statement

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Mybatis如何实现InsertOrUpdate功能

本文链接: https://www.lsjlt.com/news/149316.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mybatis如何实现InsertOrUpdate功能
    目录实现InsertOrUpdate功能需求实现Mybatis学习笔记:InsertOrUpdate环境前言DaoMapper XML文件行别名主键和唯一索引 实...
    99+
    2022-11-13
  • Mybatis怎么实现InsertOrUpdate功能
    本篇内容主要讲解“Mybatis怎么实现InsertOrUpdate功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mybatis怎么实现InsertOrUpdate功能”吧!实现I...
    99+
    2023-06-30
  • Mybatis Limit实现分页功能
    1. Limit实现分页 1.1 为什么需要分页 减少数据的处理量 1.2 使用Limit实现分页 select * from user limit startInde...
    99+
    2022-11-12
  • mybatis中如何实现executor包懒加载功能 
    这篇文章主要为大家展示了“mybatis中如何实现executor包懒加载功能 ”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mybatis中如何实现executor包懒加载功能&nb...
    99+
    2023-06-29
  • 如何使用mybatis-plus实现分页查询功能
    今天就跟大家聊聊有关使用mybatis-plus如何实现分页查询功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 引入依赖...
    99+
    2022-11-13
  • 如何MyBatis在使用MyCat实现多租户功能
    本篇文章给大家分享的是有关如何MyBatis在使用MyCat实现多租户功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MyCat 基本配置首先针对多租户配置了多个数据库,在 ...
    99+
    2023-05-31
    mybatis mycat
  • MyBatis超详细讲解如何实现分页功能
    目录概述:一般用法:student表:Student.javaStudentMapper.xmlStudentService.javaStudentServiceImpl.javaA...
    99+
    2022-11-13
  • MyBatis-Plus如何实现字段自动填充功能
    这篇文章给大家分享的是有关MyBatis-Plus如何实现字段自动填充功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言在项目中,我们有一些公共的字段需要做修改如:gmt_create:创建时间creat...
    99+
    2023-06-25
  • MyBatis拦截器实现分页功能实例
    由于业务关系 巴拉巴拉巴拉好吧 简单来说就是原来的业务是 需要再实现类里写 selectCount 和selectPage两个方法才能实现分页功能现在想要达到效果是 只通过一个方法就可以实现 也就是功能合并 所以就有了下面的实践既然是基于M...
    99+
    2023-05-31
    mybatis 拦截器 分页
  • Spring MVC+mybatis实现注册登录功能
    本文实例为大家分享了Spring MVC mybatis实现注册登录功能的具体代码,供大家参考,具体内容如下前期准备: 如下图所示,准备好所需要的包 新建工程,导入所需要的包,在web.xml中配置好所需要的,如下<...
    99+
    2023-05-31
    spring mvc mybatis
  • 利用mybatis如何实现一个一对多查询功能
    利用mybatis如何实现一个一对多查询功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.需求分析:在开发中会遇到这样一个问题,查询订单信息,级联查询出用户信息和订单明...
    99+
    2023-05-31
    mybatis 一对多查询
  • Oracle+mybatis如何实现对数据的增删改查功能
    这篇文章主要介绍了Oracle+mybatis如何实现对数据的增删改查功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是 MyBati...
    99+
    2022-10-18
  • springmvc+spring+mybatis实现用户登录功能(上)
    由于本人愚钝,整合ssm框架真是费劲了全身的力气,所以打算写下这篇文章,一来是对整个过程进行一个回顾,二来是方便有像我一样的笨鸟看过这篇文章后对其有所帮助,如果本文中有不对的地方,也请大神们指教。一、代码结构整个项目的代码结构如图所示: c...
    99+
    2023-05-31
    springmvc spring mybatis
  • Mybatis CURD及模糊查询功能的实现
    命名空间namespace: 配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致! 1.查询(select) select: 接...
    99+
    2022-11-12
  • Springboot+Mybatis实现分页加条件查询功能
    本文实例为大家分享了Springboot+Mybatis实现分页加条件查询的具体代码,供大家参考,具体内容如下 User.xml <xml version="1.0" enco...
    99+
    2022-11-13
  • SpringBoot整合Mybatis-plus实现多级评论功能
    目录数据库设计用户表评论表后端实现相关依赖实体类Mapper接口Service层和Controller层前端实现总结在本文中,我们将介绍如何使用SpringBoot整合Mybatis...
    99+
    2023-05-18
    SpringBoot整合Mybatis-plus SpringBoot多级评论
  • Mybatis实现联表查询并且分页功能
    今天同学突然问我这个怎么搞。 然后自己搞了一下发现这个玩意有坑。。就记录一下 0. 表结构 person表 cat表 一个person有多个cat 实体类就这么写 1. 实体类 ...
    99+
    2022-11-11
  • mybatis-plus多表关联查询功能的实现
    学习目标: mybatis-plus多表关联查询 学习内容: mybatis-plus多表关联查询 实体类部分代码 @Data @AllArgsConstructor @NoAr...
    99+
    2022-11-12
  • Mybatis怎么实现动态增删改查功能
    这篇文章给大家分享的是有关Mybatis怎么实现动态增删改查功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、Mybatis 流程简介最近在看 Mybatis 的源码,大致了解整个框架流程后便手写了一个特别简...
    99+
    2023-06-14
  • SpringBoot整合Mybatis-plus和Redis实现投票功能
    目录一、背景介绍二、开发环境三、技术实现1. 配置Redis2. 配置MyBATis-plus3. 实现投票功能四、测试运行五、总结一、背景介绍 投票功能是一个非常常见的Web应用场景,SpringBoot作为当今流行的...
    99+
    2023-06-01
    SpringBoot Redis实现投票功能 SpringBoot Redis投票 Redis投票
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作