A | 您所在的位置:网站首页 › mysql2000万数据一次性更新 › 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 into user(id,username, nickname, sex, password)
values
(#{user.id},#{user.username}, #{user.nickname}, #{user.sex}, #{user.password}
public interface UserMapper{
void insertUserBatch(@Param("users") List users);
}
这种方式实质上就是sql的拼接,好处是只需要连接一次数据库。但是这种方式有限制,批量操作只能是新增或者修改,不能实现不存在的新增、存在的修改。 MyBatis foreach + MySQL DUPLICATE这里主要说的是DUPLICATE ,简单来说,它可以通过判断唯一索引是否冲突来实现数据的新增或更新。即插入的数据引起了唯一索引冲突那么这条数据则进行更新,若未引起则进行新增操作。 insert into user(id,username, nickname, sex, password) values (#{user.id},#{user.username}, #{user.nickname}, #{user.sex}, #{user.password} on duplicate key update nickname = values(nickname), sex = values(sex), password = values(password)这种方式可以实现批量数据的同时新增与更新操作。但是有使用限制:判断字段必须存在唯一索引 MyBatisPlus saveOrUpdateBatch首先需要在项目中集成 MP 相关环境,可以参考官网:https://www.baomidou.com/ saveOrUpdateBatch方法是先根据主键去查询,若不存在则新增,若存在则修改。所以它的限制就是:只能根据主键来判断新增或修改 MyBatis foreach + MySQL REPLACEreplace 也是 MySQL 提供的一个语法,用来新增数据时检查是否有主键或索引冲突,若有则先删除原来记录,在执行插入新的数据。 replace insert into user(id,username, nickname, sex, password) values (#{user.id},#{user.username}, #{user.nickname}, #{user.sex}, #{user.password} 注意 replace 和 duplicate 这两种方式在大数据量的环境下,插入效率都略低。其次若使用主键作为判断字段时,replace 要比 duplicate 慢的多。 replace 会先删除数据、再新增数据,期间还需要重新未付索引的变化duplicate则不会改变现有的索引结构,对索引的维护成本低 |
CopyRight 2018-2019 实验室设备网 版权所有 |