2016-09-16 89 views
0

这是Windows 8上的Java 8,Oracle JVM,并使用最新的JDBC Java 8兼容的MS-SQL驱动程序(如果它有所不同)。tocollection()方法使用的JDBC JDBC行集使用

我想用toCollection()法成完整的行的Collection从JDBC RowSet转换/投/移动数据,如CachedRowSet。这将允许我使用stream()和lambda来处理我的Java程序中的行集。

单列toCollection("colname")方法适用于我。

我想知道如何将JDBC行集合转换为包含行集合的所有列行集合。 我搜索的例子,但没有找到任何,任何指针,将非常感激。

+0

这正是'toCollection()'已经做的事。不清楚你在问什么。 – EJP

+0

我想看看使用toCollection()方法将CachedRowSet转换为集合的示例。不是用于单列,而是用于整行,即该行的所有列。因此,输出是行的集合,其中每行包含所有列。 –

+0

就是这样。阅读Javadoc。如果您要求提供离线资源,那么您在这里是脱离主题的,但是肯定在Oracle JDBC Tutorial中有一个例子吗?当然你已经尝试了一些你自己的尝试,我们可以评论一下? – EJP

回答

-1

请看看下面的代码片段:

ResultSetMetaData rsmd = rs.getMetaData(); 
HashMap<String,Object> map; 
while(rs.next()){ 
    int numColumns = rsmd.getColumnCount(); 
    map = new HashMap<String,Object>(); 
    for (int i=1; i<=numColumns; i++) { 
     String colName = rsmd.getColumnName(i); 
     if(rsmd.getColumnType(i)==java.sql.Types.ARRAY){ 
      map.put(colName, rs.getArray(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.BIGINT){ 
      map.put(colName, rs.getInt(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.BOOLEAN){ 
      map.put(colName, rs.getBoolean(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.BLOB){ 
      map.put(colName, rs.getBlob(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.DOUBLE){ 
      map.put(colName, rs.getDouble(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.FLOAT){ 
      map.put(colName, rs.getFloat(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.INTEGER){ 
      map.put(colName, rs.getInt(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.NVARCHAR){ 
      map.put(colName, rs.getNString(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.VARCHAR){ 
      map.put(colName, rs.getString(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.TINYINT){ 
      map.put(colName, rs.getInt(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.SMALLINT){ 
      map.put(colName, rs.getInt(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.DATE){ 
      map.put(colName, rs.getDate(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.TIMESTAMP){ 
      map.put(colName, rs.getTimestamp(colName)); 
     } 
     else{ 
      map.put(colName, rs.getObject(colName)); 
     } 
    } 
    //do something with the map here.. 
} 
+1

这不回答我的问题。我想知道如何使用CachedRowSet的toCollection()方法将行集的所有行复制到包含所有行和所有列的Collection中。 –

2

正如上面提到的,你需要使用toCollection()方法,但返回的com.sun.rowset.internal.Row收集需要被转化与流API工作。看例子:

ResultSetMetaData md = rowset.getMetaData(); 
List<Map<String, Object>> res = new ArrayList<>(); 
Collection<Row> c = (Collection<Row>) rowset.toCollection(); 
for(Row row: c) { 
    Map<String, Object> m = new HashMap<String, Object>(); 
    for (int i = 1; i <= md.getColumnCount(); i++) { 
     m.put(md.getColumnName(i), row.getColumnObject(i)); 
    } 
    res.add(m); 
} 
res.stream().forEach(m -> System.out.println(m)); 
+0

谢谢,但我得到访问限制试图从com.sun.rowset.internal.Row访问类行; –

+0

加上它被定义为内部,所以我不确定它是否支持我使用这个类? –

+0

我认为它正在使用的JDBC驱动程序的实现细节。使用最新版本的jtds(net.sourceforge.jtds.jdbc.Driver)它可以正常工作。 – mv200580

0

这可能有助于别人,我不知道。 事实证明,我的代码实际上是确定的。 我必须更改IDE Eclipse设置才能将受限访问消息从默认设置“错误”更改为“警告”。此更改允许我使用Java Collection of Row(内部Sun类,导入)并将JDBC行集转换为适用于Java 8流的Java集合。我不知道这是实践还是支持,或者如果它通过导入com.sun.rowset.internal。*;使用Sun内部Row类甚至是一个好习惯。但代码现在正确运行。