- CSDN上经常看到有博主写MybatisPlus的IService批量插表效率如何之高,事实果真如此吗?
- 代码测试
import com.atguigu.mytest.entity.User;
import com.atguigu.mytest.service.UserService;
import com.atguigu.mytest.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
@RestController
public class UserController {
@Autowired
public UserService userService;
/**
*
* PreparedStatement批量处理
*/
@GetMapping("/test")
public R testInsert(){
return userService.testInsert();
}
/**
*
* MybatisPlus的IService批量插表
*/
@GetMapping("/test2")
public R testInsert2(){
ArrayList<User> list = new ArrayList<>();
for(int i= 0 ;i<100000; i++){
User user = new User();
user.setId(i+1);
user.setUserId("abc");
user.setDepartmentId(10);
list.add(user);
}
long sTime = System.currentTimeMillis();
boolean b = userService.saveBatch(list,10000);
long eTime = System.currentTimeMillis();
System.out.println("插入10W数据,耗时:" + (eTime - sTime));
return R.ok();
}
}
import com.atguigu.mytest.entity.User;
import com.atguigu.mytest.utils.R;
import com.baomidou.mybatisplus.extension.service.IService;
public interface UserService extends IService<User> {
R testInsert();
}
import com.atguigu.mytest.entity.User;
import com.atguigu.mytest.mapper.UserMapper;
import com.atguigu.mytest.service.UserService;
import com.atguigu.mytest.utils.R;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@SneakyThrows
@Override
public R testInsert() {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase?useServerPrepStmts=false&rewriteBatchedStatements=true&serverTimezone=GMT%2B8",
"root", "root");
int begin = 1;
int end = begin + 10000;
PreparedStatement statement;
String sql = "insert into users values (?,?,?)";
statement = conn.prepareStatement(sql);
long sTime1 = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
while (begin < end) {
statement.setInt(1, begin);
statement.setString(2, "abc");
statement.setInt(3, 10);
statement.addBatch();
begin++;
}
statement.executeBatch();
end += 10000;
}
long eTime1 = System.currentTimeMillis();
System.out.println("插入10W数据,耗时:" + (eTime1 - sTime1));
return R.ok();
}
}
运行结果
PreparedStatement批量处理:插入10W数据,耗时:2215
MybatisPlus的IService批量插表:插入10W数据,耗时:27591实测显示:MybatisPlus的IService批量插表效率实属一般;其saveBatch()要么全部插入成功,要么全部失败;而PreparedStatement批量处理当遭遇服务器宕机时,以批次为单位可保存部分批次数据进表
版权声明:本文为weixin_51681634原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。