如何从ResultSet java sql包中获取所有剩余的行

时间:2018-04-30 11:24:21

标签: java jdbc resultset

我曾经使用com.datastax.driver.core.ResultSet。我可以将所有剩余的行放入我的模型类的数组中,然后将其添加到数组列表中。

以下是我之前使用datastax包中的ResultSet编写的代码。

List<ReportDescription[]> result = new ArrayList<>();
ReportDescription[] csvReportDescriptions;
csvReportDescriptions = resultSet.all().stream()
                    .map(row -> new ReportDescription(row.getObject("value"))).toArray(ReportDescription[]::new);
result.add(csvReportDescriptions);

现在我更改了数据库,所以现在我需要将ResultSet切换到java.sql.ResultSet包。有没有可能获得所有行,创建我的模型的新实例并将其放入数组列表中,就像我之前做的那样?

我自己就这样做

try {
ResultSet rS = dataSource.getConnection().createStatement().executeQuery(query.toString());
    while(rS.next()){
        descriptions.add(new ReportDescription(rS.getObject("VALUE")));
    }
    } catch (SQLException e) {
                dataSource.logError("Can't execute statement :" + query.toString());
    }               

    csvReportDescriptions = descriptions.toArray(new ReportDescription[descriptions.size()]);
    result.add(csvReportDescriptions);

2 个答案:

答案 0 :(得分:2)

您正尝试使用ResultSet以Java8方式从Streams检索数据,因此有多种方法可以执行此操作。

我们如何使用 JDBC

Java 7 中编写SQL
List<Schema> result = new ArrayList<>();
try (Connection c = getConnection()) {
    String sql = "select schema_name, is_default " +
                 "from information_schema.schemata " +
                 "order by schema_name";

    try (PreparedStatement stmt = c.prepareStatement(sql);
         ResultSet rs = stmt.executeQuery()) {

        while (rs.next()) {
            System.out.println(
                new Schema(rs.getString("SCHEMA_NAME"),
                           rs.getBoolean("IS_DEFAULT"))
            );
        }
    }
}

我们如何使用 jOOλ

Java 8 中编写SQL
try (Connection c = getConnection()) {
    String sql = "select schema_name, is_default " +
                 "from information_schema.schemata " +
                 "order by schema_name";

    try (PreparedStatement stmt = c.prepareStatement(sql) {

        // We can wrap a Statement or a ResultSet in a
        // Java 8 ResultSet Stream
        SQL.stream(stmt, Unchecked.function(rs ->
            new Schema(
                rs.getString("SCHEMA_NAME"),
                rs.getBoolean("IS_DEFAULT")
            )
        ))
        .forEach(System.out::println);
    }
}

我们如何使用 jOOQ

Java 8 中编写SQL
try (Connection c = getConnection()) {
    String sql = "select schema_name, is_default " +
                 "from information_schema.schemata " +
                 "order by schema_name";

    DSL.using(c)
       .fetch(sql)

       // We can use lambda expressions to map jOOQ Records
       .map(rs -> new Schema(
           rs.getValue("SCHEMA_NAME", String.class),
           rs.getValue("IS_DEFAULT", boolean.class)
       ))

       // ... and then profit from the new Collection methods
       .forEach(System.out::println);
}

我们如何使用 Spring JDBC

Java 8 中编写SQL
try (Connection c = getConnection()) {
    String sql = "select schema_name, is_default " +
                 "from information_schema.schemata " +
                 "order by schema_name";

    new JdbcTemplate(
            new SingleConnectionDataSource(c, true))

        // We can use lambda expressions as RowMappers
        .query(sql, (rs, rowNum) ->
            new Schema(
                rs.getString("SCHEMA_NAME"),
                rs.getBoolean("IS_DEFAULT")
            ))

        // ... and then profit from the new Collection methods
        .forEach(System.out::println);
}

来源:JOOQ

答案 1 :(得分:1)

简短的回答:你做不到。这是因为ResultSet最初是在支持具有游标支持的数据库的情况下创建的 - 所有结果可能都不在数据库服务器的内存中,实际下载所有结果也不可行。

您可以做的只是遍历结果集,在一些样板代码的帮助下将所有结果添加到列表中:

List<ReportDescription> descs = new ArrayList<>();
while (resultSet.next()) {
    descs.add(new ReportDescription(resultSet.getObject("value")));
}

编辑:要扩展答案 - ResultSet实际上始终将光标保持在一行(或特殊的准行:之前之后 EM>)。因此,您在ResultSet上调用的任何getter实际上都会从光标指向的行中获取相应的数据(如果它不在任何行上,则抛出异常)。