春季批处理以上传CSV文件并插入数据库

时间:2018-09-01 16:15:30

标签: spring spring-mvc spring-boot spring-data spring-batch

我的项目有此要求,即用户上传一个CSV文件,该文件必须被推送到sql server数据库。 我知道我们可以使用Spring批处理来处理大量记录。但是我找不到适合我的这个要求的任何教程/示例代码。 我遇到的所有教程都只是将CSV文件名和内存数据库硬编码如下:

https://spring.io/guides/gs/batch-processing/

用户输入文件在计划的时间在共享驱动器位置可用,文件名带有前缀,例如:stack_overlfow_dd-MM-yyyy HH:mm,每天我如何至少每5-10分钟轮询一次网络共享驱动器如果与正则表达式匹配,则每天一小时,然后上传到数据库。 我如何才能首先从共享位置获取csv文件并将其存储在内存中或某个地方,然后配置spring batch将其读取为输入。 这里的任何帮助将不胜感激。提前谢谢

3 个答案:

答案 0 :(得分:1)

  

我遇到的所有教程都只是对CSV文件名和内存数据库进行了硬编码

您可以在官方仓库here中找到样本。 Here is an example,其中输入文件名不是硬编码的,而是作为作业参数传递的。

  

我该如何首先从共享位置获取csv文件并将其存储在内存中或某个位置,然后配置spring batch将其读取为输入。

您可以分两步进行:在本地下载文件,然后将其读/处理/写到数据库中(请参见https://stackoverflow.com/a/52110781/5019386)。

  

如果网络共享驱动器与regex匹配,则每天至少每5-10分钟轮询一次网络共享驱动器,然后上传到数据库。

一旦定义了工作,就可以安排它在需要时运行:

  • Quartz之类的调度程序
  • 或使用Spring的task scheduling功能。
  • 或结合使用Spring Integration和Spring Batch。 Spring集成将轮询目录,然后在适当时启动Spring Batch作业。 here对此方法进行了说明。

有关工作安排here的更多详细信息。

答案 1 :(得分:0)

我相信您的问题已经here得到了回答。

问题的作者甚至上传了他的工作结果的资料库: https://github.com/PriyankaBolisetty/SpringBatchUploadCSVFileToDatabase/tree/master/src/main/java/springbatch_example

您可以使用JCIFS API方法SmbFile.listFiles(String wildcard)在共享驱动器中检索和过滤文件列表。

答案 2 :(得分:0)

您可以创建一个服务层,该服务层可以处理excel文件并从文件中读取数据,并构造java对象以保存到DB中。在这里,我使用了 apache POI 来解析Excel数据并从excel表中读取。

public class FileUploadService {

 @Autowired
 FileUploadDao fileUploadDao;

 public String uploadFileData(String inputFilePath) {
  Workbook workbook = null;
  Sheet sheet = null;
  try {

   workbook = getWorkBook(new File(inputFilePath));
   sheet = workbook.getSheetAt(0);

   /*Build the header portion of the Output File*/
   String headerDetails = "EmployeeId,EmployeeName,Address,Country";
   String headerNames[] = headerDetails.split(",");

   /*Read and process each Row*/
   ArrayList < ExcelTemplateVO > employeeList = new ArrayList < > ();
   Iterator < Row > rowIterator = sheet.iterator();

   while (rowIterator.hasNext()) {
    Row row = rowIterator.next();
    //Read and process each column in row
    ExcelTemplateVO excelTemplateVO = new ExcelTemplateVO();
    int count = 0;
    while (count < headerNames.length) {
     String methodName = "set" + headerNames[count];
     String inputCellValue = getCellValueBasedOnCellType(row, count++);
     setValueIntoObject(excelTemplateVO, ExcelTemplateVO.class, methodName, "java.lang.String", inputCellValue);
    }

    employeeList.add(excelTemplateVO);
   }
   fileUploadDao.saveFileDataInDB(employeeList);

  } catch (Exception ex) {
   ex.printStackTrace();
  }


  return "Success";
 }