在开发中很多时候会用list集合存储数据,然后将数据批量插入数据库,但是一次插入数据量比较大的话,时间会很长,可能导致插入失败,如果将list集合分批次的批量插入数据库,则会减少插入数据的时间,提高效率
将list拆解可以使用List的subList方法,需要传入两个参数,截取list的开始下标和结束下标
@Test
void contextLoads() {
List<Student> list = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
list.add(new Student(i, "name" + i, "pwd" + i));
}
long timeStart = System.currentTimeMillis();
int length = list.size();
int size = 10000;
int start = 0;
int end = size;
while (length > start) {
if (end > length) {
studentMapper.insertBatch(list.subList(start, length));
break;
}
studentMapper.insertBatch(list.subList(start, end));
start += size;
end += size;
}
long timeEnd = System.currentTimeMillis();
System.out.println(timeEnd - timeStart);
}
测试所用实体类共有三个字段,如果使用lombok工具提供的自动生成set和get方法,已经无参和全参构造方法,则需要引入lombok的依赖
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private Integer id;
private String name;
private String pwd;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
此处是lombok的依赖
<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
此处提供了对比全部数据一次性批量插入的测试方法
@Test
void contextLoads1() {
List<Student> list = new ArrayList<>();
for (int i = 0; i < 1000001; i++) {
list.add(new Student(i, "name" + i, "pwd" + i));
}
long timeStart = System.currentTimeMillis();
studentMapper.insertBatch(list);
long timeEnd = System.currentTimeMillis();
System.out.println(timeEnd - timeStart);
}
经过对比运行,分批次的批量插入要比一次性批量插入消耗的时间要少一些,在数据量大或者字段比较多的情况下,一次性插入很容易操作失败