• on duplicate key update 的用法说明(解决批量操作数据,有就更新,没有就新增)mybatis批量操作数据更新和添加


    项目用的ORM框架是用springdatajpa来做的,有些批量数据操作的话,用这个效率太低,所以用mybatis自己写sql优化一下。

    一般情况,我们肯定是先查询,有就修改,没有就添加,这样的话,单个操作还好,如果是大量数据的话,每次都需要先查后改(如果用springdatajpa的话,添加之前还得查一遍),太消耗资源了。

    那么mysql有没有解决的办法呢?当然是有的,我查了一些资料,有两种办法,一种是使用使用replace into ,还有一种是on duplicate key update来解决,我先来演示一下这两种办法的区别。

    首先创建一个表(我设置的username列唯一,用户名不可重复)

    CREATE TABLE user_table(
        id INT PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(10) UNIQUE KEY,
        address VARCHAR(10)
    )

    添加一条数据

    INSERT INTO user_table (id,username,address) VALUE (NULL,'胡俊杰','北京')
    

     目的:先查询数据是否存在,再修改(用一条语句实现),胡俊杰不在北京了,跑去黑龙江了

    REPLACE INTO user_table(id,username,address) VALUE (NULL,'胡俊杰','黑龙江')

    sql运行之后,显示2行收到影响。

     之后再观察数据库的数据,姓名没变,地址变了,而且id也变了

     说明replace into是先删除原来的,再新增。

    这个显然是不好的,加入有个场景,这个表的id是一个表的外键,那么这样就会造成错误,所以我们引入方法2来解决。

    方法二:

    现在,把胡俊杰在安排回北京。sql语句如下

    INSERT INTO user_table(id,username,address) VALUE (NULL,'胡俊杰','北京') ON DUPLICATE KEY UPDATE address = '北京'
    INSERT INTO user_table(id,username,address) VALUE (NULL,'胡俊杰','北京') ON DUPLICATE KEY UPDATE address = VALUES(address) //这两种方法都可以,下面这个可以动态绑定传来的值

    这次依旧是2行发生改变,我们再看数据库的数据

     id没有改变,只改变了地址,这种办法是最实用的了。

    接下来演示一下mybatis传入list批量修改该怎么做

    @Insert("<script>  insert into user_table (username,age,address)"+
                "  values  <foreach collection ='users' item='item' index= 'index' separator =','> " +
                "(#{item.username},#{item.age},#{item.address}) </foreach >" +
                " ON DUPLICATE KEY UPDATE  username = values(username), age = values(age) ,address = values(commaddr) </script>")
        void insert(@Param("users") List<User> users);
    

     有不懂的可以留言给我,希望可以帮到你!!!

  • 相关阅读:
    django系列6--Ajax03 ajax参数
    django系列6--Ajax06 使用插件,Sweet-Alert插件
    django系列6--Ajax05 请求头ContentType, 使用Ajax上传文件
    django系列6--Ajax04 请求设置(设置csrf_token)
    django系列6--Ajax01 特点, 基本格式, 向前端发送数据
    django系列4.2--自定义标签, 自定义过滤器, inclusion_tag, 引入静态文件(css,js等)
    面向对象之封装之如何隐藏属性, 封装的底层原理
    面向对象之------多态与多态性
    在子派生的新方法中重用父类功能的两种方式
    菱形继承
  • 原文地址:https://www.cnblogs.com/super-hu/p/12681749.html
Copyright © 2020-2023  润新知