如果我做的话
try (
Connection conn = Database.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM table WHERE something = ? LIMIT 1");
) {
ps.setString(1, "hello world");
ResultSet results = ps.executeQuery();
if(results.next()) {
// blah
}
} catch(SQLException e) {
e.printStackTrace();
}
当PreparedStatement关闭时,ResultSet是否仍会关闭,还是我还必须显式关闭ResultSet?
答案 0 :(得分:4)
根据javax.sql.Statement.close()方法的JavaDoc:
注意:当Statement对象关闭时,它的当前ResultSet对象(如果存在)也将关闭。
因此,回答您的问题 - 是的,ResultSet
会自动关闭,因为相关的Statement
已在try-with-resources
块中关闭。
但是,请注意明确关闭ResultSet
是一个很好的做法,建议遵循,因此遵循良好做法的修改后的代码如下所示:
try (
Connection conn = Database.getConnection();
PreparedStatement ps = prepareStatement(conn, "SELECT * FROM table WHERE something = ? LIMIT 1", param);
ResultSet results = ps.executeQuery();
) {
if(results.next()) {
// blah
}
} catch(SQLException e) {
e.printStackTrace();
}
private static PreparedStatement prepareStatement(Connection connection, String sql, String param) throws SQLException {
final PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, param);
return ps;
}
答案 1 :(得分:0)
始终作为一种好习惯,请尝试关闭 ResultSet和 PreparedStatements。在最后一块。 每次,管理异常,这样就不会让资源无人看管(是泄漏的常见原因)。
除非你将它们注入到方法中,否则调用方法可能需要它们。
编辑:立场纠正。如果resultset是作为try-with-resource创建的,那么你的PS就会死掉。