我有这样一种方法:
private static ResultSet select (Connection connection, String query) {
PreparedStatement selectQuery = null;
ResultSet resultSet = null;
try {
selectQuery = connection.prepareStatement(query);
resultSet = selectQuery.executeQuery();
selectQuery.close();
} catch (SQLException e) {
System.out.println(e);
}
return resultSet;
}
当我关闭preparedStatement时,resultSet始终为空。
如果我用衣服readymentment //selectQuery.close();
注释掉这一行,一切都很好。
在为resultSet赋值后,我将其关闭。那为什么它是空的?
答案 0 :(得分:1)
ResultSet
与已执行的Statement
相关联。关闭语句和结果集,清除其中的任何数据。
您需要在关闭语句之前处理结果集,因此您的方法将无效。
答案 1 :(得分:1)
因为javadoc这样说:
注意:当
Statement
对象关闭时,其当前ResultSet object
(如果存在)也将关闭。
理由:Statement.close()
所述的行为是释放所有资源。其中一个资源是用于读取结果的服务器端游标。但是如果你释放它,那么ResultSet
没有任何东西可以从中获取数据。
我很好奇你是如何确定(已关闭的)ResultSet
是"空的"。看起来关闭ResultSet
上的所有操作(除了close()
)都应该抛出异常。
答案 2 :(得分:1)
在检索结果集的数据之前,您不必关闭语句,否则这些可能无法访问
调用此方法时,其ResultSet对象将关闭。
因此,只有在使用完Statement后,才能调用Statement.close()
方法。
收盘应在最终声明中执行 通过这种方式,您可以确保不必担心何时关闭它。
使用您的实际代码:
private static ResultSet select (Connection connection, String query) {
PreparedStatement selectQuery = null;
ResultSet resultSet = null;
try {
selectQuery = connection.prepareStatement(query);
resultSet = selectQuery.executeQuery();
} catch (SQLException e) {
System.out.println(e);
}
finally {
if (selectQuery != null) { selectQuery.close(); }
}
return resultSet;
}
}
更好的选择是使用try-with-resources语句:
try (Statement stmt = con.createStatement()) {
// ...
}
答案 3 :(得分:1)
您必须遍历ResultSet。你有一个高级别的例子:
try{
// execute the query
ResultSet rs = st.executeQuery(query);
// iterate through the result set
while (rs.next())
{
// Replace with your data
int id = rs.getInt("id");
String name = rs.getString("name");
// do stuff with the result set, add to a List of objects (for example)
}
selectQuery.close();
}catch(SQLException e) {
System.out.println(e);
}