Перебрать 3 разных набора результатов JDBC - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь сжать 3 CSV файлы из 3 разных таблиц в один zip-файл your_files_12354627.zip.

Итак, у меня есть следующий метод, который прекрасно работает для генерации zip-файлов с 1 CSV-файлом. Я пытаюсь сделать это для нескольких файлов, и поэтому я изменил приведенный ниже код (как показано под рабочим кодом):

РАБОЧИЙ КОД НИЖЕ:

public void sendMessage(String msg) throws DaoException {

    DataSource ds = null;
    Connection conn = null;
    PreparedStatement pstmt = null;
    PreparedStatement pstmtEmployee = null;
    PreparedStatement pstmtCompany = null; 
    PreparedStatement pstmBuilding = null; 

    ResultSet rs = null;
    ResultSet resultSetFirst = null;
    ResultSet resultSetSecond = null;
    ResultSet resultSetThird = null;


     String[] parts = msg.split("#");
     String requestID = parts[0].trim();
     String userName = parts[1].trim();
     String applicationName = parts[2].trim();




    try {

        ds = jdbcTemplate.getDataSource();
        conn = ds.getConnection();  

        pstmtEmployee = conn.prepareStatement(getPatientEmployeeSQL);
        pstmtEmployee.setString(1, requestID);
        resultSetFirst = pstmtEmployee.executeQuery();

        pstmtCompany = conn.prepareStatement(getCompanySQL);
        pstmtCompany.setString(1, requestID);
        resultSetSecond = pstmtCompany.executeQuery();

        pstmtBuilding = conn.prepareStatement(getBuildingSQL);
        pstmtBuilding.setString(1, requestID);
        resultSetThird = pstmtBuilding.executeQuery();




        Path dir = Paths.get("/srv/custom_users", userName);
        Files.createDirectories(dir);

        OutputStream fos = Files.newOutputStream(dir.resolve("your_files_"+ unixTimestamp +".zip"));
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        ZipOutputStream zos = new ZipOutputStream(bos); 

        Path employeeFile = dir.resolve("employee_custom_file_" + unixTimestamp + ".csv");
        Path companyFile = dir.resolve("company_custom_file_" + unixTimestamp + ".csv");
        Path buildingFile = dir.resolve("building_custom_file_" + unixTimestamp + ".csv");


        ZipEntry firstEntry = new ZipEntry(employeeFile.getFileName().toString());
        zos.putNextEntry(firstEntry);
        try (CSVWriter writer = new CSVWriter(new OutputStreamWriter(zos,StandardCharsets.UTF_8)))) {
               writer.writeAll(resultSetFirst, true);
               writer.flush();
               zos.closeEntry();
        }

        /*ZipEntry secondEntry = new ZipEntry(companyFile.getFileName().toString());
        zos.putNextEntry(secondEntry);
        try (CSVWriter writer = new CSVWriter(new OutputStreamWriter(zos,StandardCharsets.UTF_8)))) {
               writer.writeAll(resultSetSecond, true);
               writer.flush();
               zos.closeEntry();
        }

        ZipEntry thirdEntry = new ZipEntry(buildingFile.getFileName().toString());
        zos.putNextEntry(thirdEntry);
        try (CSVWriter writer = new CSVWriter(new OutputStreamWriter(zos,StandardCharsets.UTF_8)))) {
               writer.writeAll(resultSetThird, true);
               writer.flush();
               zos.closeEntry();
        }*/




        zos.close();

        }
        catch(Throwable th) {
            throw new DaoException(th.getMessage(), th);
        }
        finally {
            //resource Closing statements

        }   



}

ИЗМЕНЕННЫЙ КОД НИЖЕ:

Как мне перебрать 3 разных набора результатов, чтобы я мог использовать writer.writeAll(resultSetFirst, true);, writer.writeAll(resultSetSecond, true); и writer.writeAll(resultSetThird, true); соответственно? Я пытаюсь перебрать имена файлов, как показано в приведенном ниже коде, но не уверен, как мне обрабатывать различные наборы результатов внутри цикла for, как показано ниже. Я прокомментировал в месте, где я пытаюсь выяснить эту вещь цикла.

public void sendMessage(String msg) throws DaoException {

    DataSource ds = null;
    Connection conn = null;
    PreparedStatement pstmt = null;
    PreparedStatement pstmtEmployee = null;
    PreparedStatement pstmtCompany = null; 
    PreparedStatement pstmBuilding = null; 

    ResultSet rs = null;
    ResultSet resultSetFirst = null;
    ResultSet resultSetSecond = null;
    ResultSet resultSetThird = null;


     String[] parts = msg.split("#");
     String requestID = parts[0].trim();
     String userName = parts[1].trim();
     String applicationName = parts[2].trim();




    try {

        ds = jdbcTemplate.getDataSource();
        conn = ds.getConnection();  

        pstmtEmployee = conn.prepareStatement(getPatientEmployeeSQL);
        pstmtEmployee.setString(1, requestID);
        resultSetFirst = pstmtEmployee.executeQuery();

        pstmtCompany = conn.prepareStatement(getCompanySQL);
        pstmtCompany.setString(1, requestID);
        resultSetSecond = pstmtCompany.executeQuery();

        pstmtBuilding = conn.prepareStatement(getBuildingSQL);
        pstmtBuilding.setString(1, requestID);
        resultSetThird = pstmtBuilding.executeQuery();




        Path dir = Paths.get("/srv/custom_users", userName);
        Files.createDirectories(dir);

        OutputStream fos = Files.newOutputStream(dir.resolve("your_files_"+ unixTimestamp +".zip"));
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        ZipOutputStream zos = new ZipOutputStream(bos); 

        Path employeeFile = dir.resolve("employee_custom_file_" + unixTimestamp + ".csv");
        Path companyFile = dir.resolve("company_custom_file_" + unixTimestamp + ".csv");
        Path buildingFile = dir.resolve("building_custom_file_" + unixTimestamp + ".csv");


        List<String> csvFileNames = new ArrayList<String>();
             csvFileNames.add(employeeFile.getFileName().toString());
             csvFileNames.add(companyFile.getFileName().toString());
             csvFileNames.add(buildingFile.getFileName().toString());


        for (String entries : csvFileNames) {

                 ZipEntry entry = new ZipEntry(entries);
                 zos.putNextEntry(entry);

                 CSVWriter writer = new CSVWriter(new OutputStreamWriter(zos,StandardCharsets.UTF_8));
                 //How should I loop through different resultsets here so that I can make use of writer.writeAll(resultSetFirst, true);
                 // writer.writeAll(resultSetSecond, true); and writer.writeAll(resultSetThird, true); respectively?


                System.out.println("Printing entries");
                System.out.println(entries); 

             }   



        /*ZipEntry firstEntry = new ZipEntry(employeeFile.getFileName().toString());
        zos.putNextEntry(firstEntry);
        try (CSVWriter writer = new CSVWriter(new OutputStreamWriter(zos,StandardCharsets.UTF_8)))) {
               writer.writeAll(resultSetFirst, true);
               writer.flush();
               zos.closeEntry();
        }*/

        /*ZipEntry secondEntry = new ZipEntry(companyFile.getFileName().toString());
        zos.putNextEntry(secondEntry);
        try (CSVWriter writer = new CSVWriter(new OutputStreamWriter(zos,StandardCharsets.UTF_8)))) {
               writer.writeAll(resultSetSecond, true);
               writer.flush();
               zos.closeEntry();
        }

        ZipEntry thirdEntry = new ZipEntry(buildingFile.getFileName().toString());
        zos.putNextEntry(thirdEntry);
        try (CSVWriter writer = new CSVWriter(new OutputStreamWriter(zos,StandardCharsets.UTF_8)))) {
               writer.writeAll(resultSetThird, true);
               writer.flush();
               zos.closeEntry();
        }*/




        zos.close();

        }
        catch(Throwable th) {
            throw new DaoException(th.getMessage(), th);
        }
        finally {
            //resource Closing statements

        }   



}

1 Ответ

2 голосов
/ 18 июня 2019

Во-первых, я бы посоветовал вам разбить ваш код на несколько разных методов.Здесь много повторений.

Я немного озадачен тем, пытаетесь ли вы написать один ResultSet для каждого из файлов или все три для каждого файла.Частично это файлы file, fileFacts и fileEncounters, которые нигде не упомянуты.

Если вы пытаетесь поместить один ResultSet в каждую запись, вы можете использоватьСопоставить файл с ResultSet, а затем перебрать записи или ключи.Что-то вроде ....

....
  Map<String,ResultSet> dataMap = new HashMap<>();
  dataMap.put(file.getFileName().toString(),resultSetFirst);
  dataMap.put(filefacts.getFileName().toString(),resultSetSecond);
  dataMap.put(fileEncounters.getFileName().toString(),resultSetThird);

  for (Map.Entry<String,ResultSet> e : dataMap.entrySet()){
    zos.putNextEntry(new ZipEntry(e.getKey()));
    try (CSVWriter writer = new CSVWriter(new OutputStreamWriter(zos,StandardCharsets.UTF_8))){
      writer.writeAll(e.getValue(), true);
      writer.flush();
      zos.closeEntry();
    }
  }
....

Но, вероятно, было бы проще и понятнее просто использовать метод ...

....
  makeEntry(zos,file.getFileName().toString(),resultSetFirst);
  makeEntry(zos,filefacts.getFileName().toString(),resultSetSecond);
  makeEntry(zos,fileEncounters.getFileName().toString(),resultSetThird);
....
}

private static void makeEntry(ZipOutputStream zos,String name, ResultSet res) throws SomeExceptions{
    zos.putNextEntry(new ZipEntry(name));
    try (CSVWriter writer = new CSVWriter(new OutputStreamWriter(zos,StandardCharsets.UTF_8))){
      writer.writeAll(res, true);
      writer.flush();
      zos.closeEntry();
  }
}

Таким образом, вам не нужно создавать иЗаполните карту (или список) только для того, чтобы запустить один и тот же код три раза.

Вы можете / должны по-прежнему использовать метод, если решите итерировать по карте, чтобы сделать вещи более понятными:

  Map<String,ResultSet> dataMap = new HashMap<>();
  dataMap.put(file.getFileName().toString(),resultSetFirst);
  dataMap.put(filefacts.getFileName().toString(),resultSetSecond);
  dataMap.put(fileEncounters.getFileName().toString(),resultSetThird);

  for (Map.Entry<String,ResultSet> e : dataMap.entrySet()){
    makeEntry(zos, e.getKey(), e.getValue());
  }
...

Ищите другие области, подобные этой, чтобы преобразовать методы.Приличным правилом является создание метода каждый раз, когда вы думаете, что должны вырезать и вставить код.

Обратите внимание, что ни один из этого кода на самом деле не был скомпилирован или запущен

...