2014-07-24 50 views
12

如何使用jdbc将整个表写入平面文件?到目前为止,我尝试了以下方法:如何使用jdbc中的ResultSet.getBinaryStream()从所有列中获取值?

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(); 

“????”只是我的占位符。我被卡在什么传递作为参数。

+0

什么是你的问题? –

+0

我只是将'????'用“”来获取所有列或者在ResultSet或其他类中是否有另一个函数来获取整行?我只想整行。不只是该记录的一列。我没有数据库连接测试,所以我只是想提前弄清楚,所以我准备好了。 – HarishV

+2

'ResultSet'不提供处理整行的方法。你需要单独处理列。您可能会发现[getMetaData()](http://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#getMetaData--)方法有用。 – GriffeyDog

回答

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); 

    } 
+1

啊,太糟糕了,没有ResultSet.getRow方法! –

1

result.getBinaryStream("????")只会返回该列的值作为占位符。

如果你想获得的所有列,您需要使用ResultSetMetaDataResultSet

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

谢谢sendon1982,我想我可以用getBinaryCount()来循环遍历表中的每一列,然后传入列索引来打印整个表。我只是想知道是否有办法用一个单一的函数吐出整个表格,但是这样做。 – HarishV

+0

不客气。 不,你必须使用循环来逐一显示它们。 – sendon1982

1

以下是我甩从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 
... 
相关问题