MybatisPlus——批量新增
第一种:利用for循环遍历每条插入数据,逐条插入
@Test
void testSaveBatch() {
// for循环插入一万条数据
for (int i = 0; i < 10000; i++) {
User user = new User();
user.setUserName("张三" + i);
user.setPassword("123456");
user.setAge(18);
user.setSalary(1000.0f);
userService.save(user);
}
}
缺点:每插入一次,就会生成一条插入语句,极其耗时
第二种:MP的批量新增,将数据存放到list集合中,每当list中有一百条数据就进行一次插入,插入一百次
@Test
void testSaveBatch2() {
// 1000条数据的集合
List<User> users = new ArrayList<User>(1000);
for (int i = 0; i < 100000; i++) {
users.add(new User("张三" + i, "123456", 18, 1000.0f));
if (users.size() == 1000) {
userService.saveBatch(users);
users.clear();
}
}
}
缺点:因为每次的插入数量的限制,这就会在预编译的批处理产生一百条插入语句,也很耗时
第三种:配置rewriteBatchedStatements,性能最好的
要想只编译为一条sql语句,就要和这样插入语句一样
<insert id="">
insert into a_user(userName,password,age,salary)
values
(#{userName},#{password},#{age},#{salary}),
(#{userName},#{password},#{age},#{salary}),
(#{userName},#{password},#{age},#{salary}),
(#{userName},#{password},#{age},#{salary});
</insert>
在yml的jdbc的配置上加入一个rewriteBatchedStatements=true
再次执行这段代码,运行时间缩短很多
@Test
void testSaveBatch2() {
// 1000条数据的集合
List<User> users = new ArrayList<User>(1000);
for (int i = 0; i < 100000; i++) {
users.add(new User("张三" + i, "123456", 18, 1000.0f));
if (users.size() == 1000) {
userService.saveBatch(users);
users.clear();
}
}
}