7

我想编写一个 java 函数,它接受一个 SQL 查询并返回一个 ResultSet 以便在其他地方处理。这是无法完成的,因为一旦连接关闭,ResultSet 就会失效。

谷歌搜索,我发现了一篇非常古老(2004 年)的 OReilly 文章,其中有一些看起来像治愈方法的东西:CachedRowSet。您只需放入 ResultSet,CachedRowSet 保存数据,让您关闭连接并使用返回的 CachedRowSet 在别处播放数据。

这篇文章引用了 Sun 的 CachedRowSet 实现,但似乎无处可寻。

现代 javadocs(用于 Java 1.5 及更高版本)似乎有同名的东西,“CachedRowSet”,它不仅仅是 ResultSet 数据的持有者。“CachedRowSet”似乎完成了从获取连接和其他所有事情的整个数据库处理。

那个“CachedRowSet”和旧文章中讨论的一样吗?

我想要一些简单的东西,就像在旧文章中一样。在连接关闭后将 ResultSet 放入以进行处理的东西。

有这样的动物吗?

谢谢

4

3 回答 3

5

CachedRowSet是一个标准的Java 接口。Sun 编写了一个参考实现,Sun/Oracle JDK 包含它。如果您使用的是不同的 JDK,则该实现或其他实现可能可用也可能不可用。

如果您已经有 a ,那么您可以使用该方法ResultSet从中填充 a 。CachedRowSetpopulate

如果您有足够的前瞻性来使用 Java 7,那么您可以使用具有方法CachedRowSet的 a 以可移植的方式获取实例。您可以从 a 中获得 a (当然!)。RowSetFactorycreateCachedRowSetRowSetFactoryRowSetProvider

于 2012-06-22T16:41:43.593 回答
-1

如果您只是想在不需要 CachedRowSet 提供的所有功能的情况下传输数据,那么最好将结果集数据放在列表列表中。

   List<Object> list = new ArrayList<Object>();
   ResultSet rs = stmt.executeQuery("select * from myTable");
   while(rs.next()) {
         List<Object> row = new ArrayList<Object>();
         row.add(rs.getObject(1));
         row.add(rs.getObject(2));
         row.add(rs.getObject(3));
         //And so on, or you can use the ResultSetMetaData to determine the number of columns
         list.add(row);
   }
   rs.close();

完成后,您可以将该列表对象发送到您想要的任何地方,然后遍历它以获取数据。

于 2012-06-22T15:15:54.073 回答
-1

javax.sql.rowset.CachedRowSet只是一个接口。有一个 Sun/Oracle 专有的实现,但它不受支持,因此使用起来有风险。

如今,大多数代码都遵循“转换为 pojos”模型。

于 2012-04-26T21:58:49.997 回答