web-dev-qa-db-ja.com

jdbcのResultSet.getBinaryStream()を使用して、すべての列から値を取得するにはどうすればよいですか?

Jdbcを使用してテーブル全体をフラットファイル(テキストファイル)に書き込むにはどうすればよいですか?これまでのところ、私は次のことを試みました:

Statement statement = connection.createStatement();
   ResultSet result = statement.executeQuery("SELECT * FROM tablename");
   BufferedInputStream buffer;
   FileOutputStream out = new FileOutputStream("flatfile.txt");
   while(result.next() )
   {
      buffer =  new BufferedInputStream(result.getBinaryStream("????") );
      byte[] buf = new byte[4 * 1024]; //4K buffer
      int len;
      while( (len = buffer.read(buf, 0, buf.length) ) != -1 )
      {
          out.write(buf, 0, len );
      }
   }
   out.close();

「????」私のプレースホルダーです。私は引数として何を渡すかで立ち往生しています。

20

以下のコードを使用して、テーブルからすべての列名とデータ全体を取得できます。 writeToFileメソッドには、ファイルに書き込むためのロジックが含まれます(それが十分に明白でない場合:))

    ResultSetMetaData metadata = rs.getMetaData();
    int columnCount = metadata.getColumnCount();    
    for (int i = 1; i <= columnCount; i++) {
        writeToFile(metadata.getColumnName(i) + ", ");      
    }
    System.out.println();
    while (rs.next()) {
        String row = "";
        for (int i = 1; i <= columnCount; i++) {
            row += rs.getString(i) + ", ";          
        }
        System.out.println();
        writeToFile(row);

    }
30
Adarsh

JDBC接続からテーブルをダンプする方法は次のとおりです。たとえば、メモリ(例:HSQL)DBにあるすべての行を表示する場合のデバッグに非常に役立ちます。

  public static void spitOutAllTableRows(String tableName, Connection conn) {
    try {
      System.out.println("current " + tableName + " is:");
      try (PreparedStatement selectStmt = conn.prepareStatement(
              "SELECT * from " + tableName, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
           ResultSet rs = selectStmt.executeQuery()) {
        if (!rs.isBeforeFirst()) {
          System.out.println("no rows found");
        }
        else {
          while (rs.next()) {
            for (int i = 1; i < rs.getMetaData().getColumnCount() + 1; i++) {
              System.out.print(" " + rs.getMetaData().getColumnName(i) + "=" + rs.getObject(i));
            }
            System.out.println("");
          }
        }
      }
    }
    catch (SQLException e) {
      throw new RuntimeException(e);
    }
  }

出力は

 current <yourtablename> is:
 ID=1 COLUMN1=abc COLUMN2=null
 ID=2 COLUMN1=def COLUMN2=ghi
 ...
7
rogerdpack

result.getBinaryStream("????")は、プレースホルダーとして配置したときのその列の値のみを返します。

すべての列を取得する場合は、ResultSetMetaDataからResultSetを使用する必要があります

    ResultSetMetaData metadata = resultSet.getMetaData();
    int columnCount = metadata.getColumnCount();
    for (int i=1; i<=columnCount; i++) 
    {
        String columnName = metadata.getColumnName(i);
        System.out.println(columnName);
    }
1
sendon1982