做微服务项目的时候,需要大量的虚假信息,所以想到了批量插入,但是之前只学过mybatis的批量插入,还没有试过springboot整合的批量插入,所以今天试了试
首先在mapper.xml里面写sql
<!--准备数据-->
<insert id="insertUserList">
insert into user (id,user_account, user_account_crc32,
user_password, user_other)
values
<foreach collection="list" item="user" index="index" separator=",">
(#{user.id},#{user.userAccount}, CRC32(#{user.userAccountCrc32}),#{user.userPassword}, #{user.userOther})
</foreach>
</insert>
然后定义了一个方法批量插入
public void readyData(){
List<User> list=new ArrayList<>();
for(int i=0;i<10000;i++){
User user=new User();
String s=String.valueOf(10000+i);
user.setId(100+i);
user.setUserAccount(s);
user.setUserAccountCrc32(s);
user.setUserPassword(s);
list.add(user);
}
System.out.println("开始插入");
Long startTime=System.currentTimeMillis();
userMapper.insertUserList(list);
System.out.println((System.currentTimeMillis()-startTime));
}
运行完以后确实比一条一条插入快了很多倍,1w条数据1k毫秒,刚刚查了查,一直记得batch批量插入是最快的,但是不知道快多少,刚刚研究了研究,总结了几种方法的速度
看到测试结果,并不是像网上说的那样,使用batch,性能比for循环一条一条插入快不到哪里去,
单纯的foreach拼装sql语句有大小限制。
batch可以解决sql语句大小限制的问题,但是相应的batch也有自己的缺点
===============================================================
补充一下,在测试批量插入数据库数据的时候,需要将mysqlid重置,下面分享一下具体的重置方法,mysql数据太多,如果删除以后,id还是从最后一位开始加,但是正常测试数据的时候,想要的效果是删除了id1,再次插入的时候还是id1,这个时候应该这样删除
这样删除后的user表数据,再次插入的时候,id是从1开始计算的