MybatisPlus的IService批量插表效率高吗?

  1. CSDN上经常看到有博主写MybatisPlus的IService批量插表效率如何之高,事实果真如此吗?
  2. 代码测试
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();
    }
}
  1. 运行结果
    PreparedStatement批量处理:插入10W数据,耗时:2215
    MybatisPlus的IService批量插表:插入10W数据,耗时:27591

  2. 实测显示:MybatisPlus的IService批量插表效率实属一般;其saveBatch()要么全部插入成功,要么全部失败;而PreparedStatement批量处理当遭遇服务器宕机时,以批次为单位可保存部分批次数据进表


版权声明:本文为weixin_51681634原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。