Java JDBC rowset使用tocollection()方法

时间:2016-09-16 04:22:23

标签: java jdbc collections

这是Java 8,Windows / Linux上的Oracle JVM,并使用最新的JDBC Java 8兼容驱动程序用于MS-SQL(如果它有任何区别)。

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

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

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

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

这可能有助于其他人,我不知道。 事实证明我的代码实际上没问题。 我不得不更改IDE Eclipse设置,将Restricted访问消息从默认设置Error更改为Warning。这个更改允许我使用Java Collection of Row(内部Sun类,导入)并将JDBC行集转换为适合在Java 8流中使用的Java集合。我不知道是否支持这种做法,或者通过导入com.sun.rowset.internal来使用Sun内部Row类是一种很好的做法。*;但代码现在运行正常。

答案 2 :(得分:-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..
}