2016-10-07 6 views
1

Oracleデータベースと対話するためにspring jdbctemplateを使用しています。 特定の条件に対して複数の行をフェッチする場合は、列名をヘッダーとして持つcsvファイルに結果を格納します。csv複数行のフェッチ中にspring-jdbctemplateを使用して出力する場合

私はいくつかの方法を試してみました -

customizedrowmapperで

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

、私は結果セットから行をフェッチし、Beanクラス内のフィールドを設定しています。私はbeanからcsvファイルに変換する簡単な方法を見つけることができませんでした。私はBeanクラスコードにアクセスできません。

私が見つけた2番目の方法は、opencsvライブラリを使用して、以下のようにcsvファイルに直接ResultSetを書き込むことでした。

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

これは大丈夫働いているが、CSVファイルへの書き込み中には、1行を飛ばしています。私はいくつかのクエリを試した。手動では、結果に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(); 
     } 
    } 
} 

はそれがお役に立てば幸いです。

関連する問題