如何对 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 表格数据批量更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!