如何保存 SQL 查询中的结果集以便多次使用



>我有这个问题:首先,我使用 Java 执行 SQL 查询,然后将结果存储到名为 rs 的 resultSet() 中。查询如下:

"select ad_id, publisher_id, date, impressions, clicks from table"

然后我使用以下方法读取所有数据:

while(rs.next()){
    (...)
}

问题是我们正在运行的代码需要多次重用来自 rs 的所有信息(运行随机梯度,因此有多次迭代),但是当它开始新的迭代(从迭代 1 到 2)时,rs 现在为空,我们必须再次执行 SQL 查询,这需要相当长的时间......

是否有一些"直接"方法可以将此查询的结果保存到变量中?我们考虑创建两个 ArrayLists 来保存整数(ad_id、publisher_id...),创建一个用于日期字段,然后迭代这些列表,但我们认为也许有一种更好、更简单的方法

可以做到这一点。

在python中,我们所要做的就是:

data = cursor.fetchall()

变量"data"可以多次使用,也许在 Java 中也有类似的东西(我还在学习 Java,所以我不确定)

感谢您的任何帮助

如果您的 JDBC ResultSet 是可滚动的(我认为在 JDBC v2 中引入),您可以通过调用 ResultSet#beforeFirst 来重用 ResultSet 本身,而不必将数据从中复制出来。 例:

Statement stmt = dbconx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                        ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
  // do stuff
}
// when finished you can reuse the ResultSet by calling beforeFirst()
rs.beforeFirst();
while (rs.next()) {
  // do more stuff
}
rs.beforeFirst();
// etc.

我已经让它与MySQL JDBC驱动程序一起使用。 我在 PostgreSQL 驱动程序上尝试过,并且该驱动程序不支持可滚动结果集,因此如果您的驱动程序不支持它,则需要将结果缓存在某些集合中,如此处的其他答案所述。

如果它是可滚动的,您还可以查看上面链接中的absoluterelative方法,以跳转到 ResultSet 中的任意点,这在某些情况下可能很有用。

更新:正如 Will 在下面的评论中指出的那样 - 您可能需要在createStatement中添加其他参数以使结果集可滚动。 我已将其添加为上面的第一行代码。

在 Java 中,ResultSet 对象是一个只向前移动的游标,你只能迭代一次。因此,如果您想多次使用它,您可以将结果存储到临时变量(如列表)中。

最好遵循一些面向对象的方法来存储结果,而不是在 HashMap 中使用松散耦合的数组或键值对。

首先,您应该将数据封装到 Java 对象中,例如创建一个这样的类

public class ClickInfo {
  private int ad_id;
  private int publisher_id;
  private Date date;
  private int impressions;
  private int clicks;
  // Create getter and setter functions for the instance variabless

}

读取数据库并创建ClickInfo对象并将其存储在数组中。

List<ClickInfo> list = new ArrayList<ClickInfo>();
while (rs.next()) {
  ClickInfo clickInfo = new ClickInfo();
  clickInfo.setAdId(rs.getInt("ad_id"));
  ...
  list.add(clickInfo);
}

现在,您可以多次循环访问列表以访问数据

for (ClickInfo cInfo : list)
  System.out.println(cInfo.getAdId());

编辑:上面的示例将结果存储在ArrayList中,ClickInfo对象可以存储在对您的应用程序有意义的任何数据结构中。

您最好的选择是完全按照您所说的操作将其保存到多维列表。

这是一个非常基本的功能:

数据成员:

List<List> multiDimensionalList = new ArrayList();

功能:

while(rs.next()){
//create temporary list
List tempList = new ArrayList();
//add results to temporary list
tempList.add(rs.getInt("ad_id")); 
...
//add temporary list to your multidimensionallist
multiDimensionalList.add(tempList);
}

相关内容

  • 没有找到相关文章

最新更新