mybaits切片处理,分批插入;数据库插入数据报错

文章讲述了在Java后端开发中,由于参数数量超过SpringJDBC和SQLServer的限制而引发的错误。作者介绍了三种解决策略,包括service层分条插入、MyBatisforeach标签循环和前端按需传参,以及作者个人偏好的Lists.partition分片处理方法。

程序报错:

org.springframework.jdbc.UncategorizedSQLException:
Error updating database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 传入的请求具有过多的参数。该服务器支持最多 2100 个参数。请减少参数的数目,然后重新发送该请求。

 

 原因:

        原因是java后端通过idea编译器向数据库插入或者增加数据时,次向数据库传入参数超出限制,即 (list的size)乘(一行数据包含的参数)>2100 

解决方法:

         通过查阅资料(基于我的现有知识储备)个人总结有三种方式:

                1、service层for循环分条插入

                2、mapper映射文件mybaits的<foreach>标签循环

                3、前端设置字段按需少量传入接口

   有博主测过一些方法的速率:MyBatis 批量插入数据的 3 种方法!和一些分析 MyBatis批量插入几千条数据为何慎用foreach_java_脚本之家

 个人方法:

        我个人还是比较喜欢使用service层分片处理数据,具体方法使用的是Lists.partition()集合

 @Override
    public Result<Boolean> saveBxjhData(List<BxjhDTO> list) {
        //对前端list分条,这里要注意 dto类的数量*分条数(我这里是400)< 2100
        Lists.partition(list,400).forEach(data-> bxjhMapper.insertData(data));
        return new Result<>(true);
    }

还有一种方式:

 for (int i = 0; i < czList.size(); i += 100) {
      int length = i + 100;
       //限制截取数据的总长度
      if (length > czList.size()) {
          length = czList.size();
      }
      //每100条数据 截取一次
      List newList = ywthbList.subList(i, length);
      //执行数据库操作
      ywtjbSaveMapper.saveYwtjbData(newList);
}

结语:希望方法能帮助困惑的朋友,一方面主要好用的方法分享,一方面记录平时自己的方法以后遇到参考改进

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值