>我有这个问题:首先,我使用 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 驱动程序上尝试过,并且该驱动程序不支持可滚动结果集,因此如果您的驱动程序不支持它,则需要将结果缓存在某些集合中,如此处的其他答案所述。
如果它是可滚动的,您还可以查看上面链接中的absolute
和relative
方法,以跳转到 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);
}