A-批量新增&更新

Java - 数据的批量新增&更新

环境准备

create table user
(
    id          bigint auto_increment
        primary key,
    username    varchar(32)          not null comment '登录账户',
    nickname    varchar(32)          not null comment '昵称',
    sex         char(1)              not null comment '性别:0-男;1-女',
    password    varchar(255)         not null comment '密码'
)
    comment '用户表' auto_increment = 1;

MyBatis foreach

<insert id="insertUserBatch">
    insert into user(id,username, nickname, sex, password)
    values
    <foreach collection="users" item="user" separator=",">
        (#{user.id},#{user.username}, #{user.nickname}, #{user.sex}, #{user.password}
    </foreach>
</insert>
public interface UserMapper{

    void insertUserBatch(@Param("users") List<User> users);
}

这种方式实质上就是sql的拼接,好处是只需要连接一次数据库。但是这种方式有限制,批量操作只能是新增或者修改,不能实现不存在的新增、存在的修改。

MyBatis foreach + MySQL DUPLICATE

这里主要说的是DUPLICATE ,简单来说,它可以通过判断唯一索引是否冲突来实现数据的新增或更新。即插入的数据引起了唯一索引冲突那么这条数据则进行更新,若未引起则进行新增操作。

<insert id="insertUserBatch">
    insert into user(id,username, nickname, sex, password)
    values
    <foreach collection="users" item="user" separator=",">
        (#{user.id},#{user.username}, #{user.nickname}, #{user.sex}, #{user.password}
    </foreach>
     on duplicate key update
            nickname = values(nickname),
            sex = values(sex),
            password = values(password)
</insert>

这种方式可以实现批量数据的同时新增与更新操作。但是有使用限制:判断字段必须存在唯一索引

MyBatisPlus saveOrUpdateBatch

首先需要在项目中集成 MP 相关环境,可以参考官网:https://www.baomidou.com/

saveOrUpdateBatch方法是先根据主键去查询,若不存在则新增,若存在则修改。所以它的限制就是:只能根据主键来判断新增或修改

MyBatis foreach + MySQL REPLACE

replace 也是 MySQL 提供的一个语法,用来新增数据时检查是否有主键或索引冲突,若有则先删除原来记录,在执行插入新的数据。

<insert id="insertUserBatch">
    replace insert into user(id,username, nickname, sex, password)
    values
    <foreach collection="users" item="user" separator=",">
        (#{user.id},#{user.username}, #{user.nickname}, #{user.sex}, #{user.password}
    </foreach>
</insert>

注意

  • replace 和 duplicate 这两种方式在大数据量的环境下,插入效率都略低。
  • 其次若使用主键作为判断字段时,replace 要比 duplicate 慢的多。
    • replace 会先删除数据、再新增数据,期间还需要重新未付索引的变化
    • duplicate则不会改变现有的索引结构,对索引的维护成本低
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值