2016-10-07 2 views
1

jdbctemplate을 사용하여 Oracle 데이터베이스와 상호 작용합니다. 주어진 조건에 대해 여러 행을 가져 오는 경우 열 이름을 헤더로 갖는 CSV 파일에 결과를 저장하려고합니다.여러 줄을 가져 오는 동안 spring-jdbctemplate을 사용하여 csv 출력

List<Bean> list = jdbcTemplate.query('query','parameters',customizedrowmapper);

customizedrowmapper에서, 나는 결과 집합에서 행을 페치와 콩 클래스의 필드를 설정하고 -

나는 몇 가지 방법을 시도했다. 내가 콩에서 CSV 파일로 변환하는 쉬운 방법을 찾을 수 없습니다. 나는 bean 클래스 코드에 접근 할 수 없다.

내가 찾은 두 번째 방법은 opencsv 라이브러리를 사용하여 아래의 csv 파일에 직접 결과 세트를 작성하는 것이 었습니다.

CSVWriter wr = new CSVWriter(new FileWriter("Report.csv"), ','); wr.writeAll(rs, true); wr.flush(); wr.close();

이 괜찮 노력하고 있습니다 만, CSV로 쓰는 동안 그것은 하나 개의 행을 건너 뛰는된다. 몇 가지 쿼리를 시도했다. 수동으로 결과에 4 행을 볼 수 있지만 CSV에서는 3 행만 저장합니다. 누구든지 비슷한 문제에 직면 했습니까?

또는 다른 방법으로 우리는 ResultSet에서 수동으로 각 레코드를 가져 와서 쉼표로 구분 된 문자열로 만들고 파일에 저장하지 않고도 동일한 결과를 얻을 수 있습니다.

답변

0

jdbcTemplate이 ResultSet을 RowCallbackHandler 또는 Mapper에 전달할 때 이미 rs.next()가 호출 된 첫 번째 레코드에 위치했음을 유의하십시오. CSVWriter는 레코드를 처리하기 전에 rs.next()를 다시 호출하므로 첫 번째 레코드가 기록되지 않습니다. 당신은 자신이 뭔가를 수행하여 데이터를 기록해야합니다

public class CustomRowCallbackHandler implements RowCallbackHandler { 
    @Override 
    public void processRow(ResultSet rs) throws SQLException { 
     try { 
      CSVWriter w = new CSVWriter(new FileWriter("Report.csv"), ','); 
      int columnCount = rs.getMetaData().getColumnCount(); 
      //Write column names 
      String[] ssn = new String[columnCount]; 
      for(int i = 1; i < columnCount; i++){ 
       ssn[i - 1] = rs.getMetaData().getColumnName(i); 
      } 
      w.writeNext(ssn); 
      //Write data 
      do{ 
       String[] ss = new String[columnCount]; 
       for(int i = 1; i < columnCount; i++){ 
        ss[i - 1] = rs.getString(i); 
       } 
       w.writeNext(ss); 
      }while(rs.next()); 
      w.flush(); 
      w.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

는 희망이 도움이됩니다.

관련 문제