如何对 Excel 表格中提取的数据进行批量更新

 更新时间:2024年06月12日 14:25:33   作者:天纵云裳  
这篇文章主要介绍了如何对Excel表格中提取的数据进行批量更新操作,本文通过示例代码介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

书接上回,这篇文章主要来讲述如何对 Excel 表格中提取的数据进行批量更新操作

一.编写查询代码

目的是根据工号, 将其对应的 Flag 变为 1 ,那么 mapper 中我们可以这样做

//Mapper层
    public int updateFlagByEmployeeID(@Param("ids") List<String> ids);
//XML文件中
    <update id="updateFlagByEmployeeID">
        update OA_JDY_Personnel_Info_Test set enableFlag = 1
        where employeeID in
        <foreach collection="ids" separator="," item="employeeID" open="(" close=")">
            #{employeeID}
        </foreach>
    </update>

二.编写 Service 层代码

我们从 String response = " " 往下看,这段代码之前的在上篇博客解释了,主要是进行数据解析

​
    public String enableFlagUpdate(String filename) {
        //获取 PersonSynData 类的 Class 对象。
        Class<PersonSynData> head = PersonSynData.class;
        List<PersonSynData> updateList = new ArrayList<>();
        ExcelReader excelReader = EasyExcel.read(filename, head, new AnalysisEventListener<PersonSynData>() {
            @Override
            public void invoke(PersonSynData personSynData, AnalysisContext analysisContext) {
                updateList.add(personSynData);
            }
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                System.out.println("Excel解析完成......");
            }
        }).build();
        //创建 sheet 对象,并且读取Excel的第一个sheet(下表从0开始),也可以根据 sheet 名称获取
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        //读取 sheet 表格数据,参数是可变参数,也可以读取多个sheet
        //这个操作会读取 excel 表格的数据
        excelReader.read(readSheet);
        //需要自己关闭流操作,在读取文件的时候会创建临时文件,如果不关闭的话,会损耗磁盘
        excelReader.finish();
        String success = "";
        //创建更新集合
        List<String> employeeIDs = new ArrayList<>();
        for(int i = 0; i < updateList.size(); i++){
            //这里可以拿到表格内的所有数据,根据表格中的员工号,批量修改Flag
            String employeeID = updateList.get(i).getEmployeeID();
            employeeIDs.add(employeeID);
        }
        int totalUpdatedCount = 0;
        for (int i = 0; i < employeeIDs.size(); i += BATCH_SIZE) {
            List<String> batchIds = employeeIDs.subList(i, Math.min(i + BATCH_SIZE, employeeIDs.size()));
            int updatedCount = jdcloudDao.updateFlagByEmployeeID(batchIds);
            totalUpdatedCount += updatedCount;
        }
        //进行批量更新 每次只更新 2008条
        //int count = jdcloudDao.updateFlagByEmployeeID(employeeIDs);
        return "更新成功的条数:" + totalUpdatedCount + "<br>";
    }
​

 1. List<String> employeeIDs = new ArrayList<>(); 这段代码在经过下面的 for 循环后,里面存储的是每一列的信息,包括 姓名,工号,Flag 

2. 下面的 totalUpdatedCount 是用来记录更新成功的总条数

3.List<String> batchIds = employeeIDs.subList(i, Math.min(i + BATCH_SIZE, employeeIDs.size())); 最为关键的代码就是这个,它的意思是从结果集合 employeeIDs 中截取指定长度的元素集合,每次取的都是 i + BATCH_SIZE(2000)大小的元素。举个例子,假如出文件中的数据有 4200 条

第一次:employeeIDs.subList(0, Math.min(2000, 4200));   截取了 0 ~ 2000的数据进行更新

第二次:employeeIDs.subList(2000, Math.min(4000, 4200)); 截取了 2000~4000 的数据进行更新

第三次:employeeIDs.subList(4000, Math.min(6000, 4200)); 截取了 4000 ~ 4200 的数据更新

其实最关键的就是第三次,这段代码保证了如果最后一次的数据不够  BATCH_SIZE(2000)那么会截取到末尾的位置,来保证不会越界。

三.为什么要进行批量更新

在Mybatis和SqlServer数据源情况下,如果一次更新超过了 2100 条,会报:The incoming request has too many parameters. The server supports a maximum of 2100 parameters. Reduce the number of parameters and resend the request.; nested exception isxxxx  的错误

也就是它不支持一次更新太多的数据,所以就有了 Service 层中的批量更新操作

到此这篇关于如何对 Excel 表格中提取的数据进行批量更新的文章就介绍到这了,更多相关Excel 表格数据批量更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java生成PDF文档方法

    详解Java生成PDF文档方法

    这篇文章主要介绍了Java生成PDF文档方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • java 打印一字符串,并在main()方法内调用它

    java 打印一字符串,并在main()方法内调用它

    编写一个方法(名字自定,但要符合Java编码规范),方法内打印一字符串,并在main()方法内调用它。
    2017-02-02
  • Java关于后端怎么去接收Date、LocalDateTime类型的参数详解

    Java关于后端怎么去接收Date、LocalDateTime类型的参数详解

    这篇文章主要介绍了java关于后端怎么去接收Date、LocalDateTime类型的参数,文中有详细的代码流程,对我们学习或工作有一定的参考价值,需要的朋友可以参考下
    2023-06-06
  • MyBatis Mapper XML中比较操作符转义问题解决

    MyBatis Mapper XML中比较操作符转义问题解决

    在使用MyBatis编写Mapper XML时,有时会遇到比较操作符需要进行转义的情况,本文主要介绍了MyBatis Mapper XML中比较操作符转义问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 使用1招搞定maven打包空间不足的问题

    使用1招搞定maven打包空间不足的问题

    这篇文章主要介绍了使用1招搞定maven打包空间不足的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • java代码执行字符串中的逻辑运算方法

    java代码执行字符串中的逻辑运算方法

    今天小编就为大家分享一篇java代码执行字符串中的逻辑运算方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • MyBatis-Plus使用sl4j日志打印SQL的代码详解

    MyBatis-Plus使用sl4j日志打印SQL的代码详解

    以下是关于使用 Spring Boot 起始器替换 slf4j-api 和 logback 依赖的详细步骤和注意事项,包括 MyBatis-Plus 的默认日志级别信息,需要的朋友可以参考下
    2024-10-10
  • Spring中利用IOC实现注入的方式

    Spring中利用IOC实现注入的方式

    Spring IOC(控制反转)实现依赖注入,将对象创建和依赖关系的管理交由Spring容器处理,通过注解或XML配置,实现对象之间的松耦合,提高代码复用性和可维护性
    2023-04-04
  • 教你安装eclipse2021并配置内网maven中心仓库的图文详解

    教你安装eclipse2021并配置内网maven中心仓库的图文详解

    本文能通过图文并茂的形式给大家介绍安装eclipse2021并配置内网maven中心仓库的相关知识,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-09-09
  • Mybatis的核心架构及源码解读

    Mybatis的核心架构及源码解读

    这篇文章主要介绍了Mybatis的核心架构及源码解读,mybatis是一款半自动化的持久层框架,它封装了JDBC操作,支持定制化SQL,高级映射,但它的数据库无关性较低,需要的朋友可以参考下
    2023-08-08

最新评论