案例A:
try (Connection con = DriverManager.getConnection(myConnectionURL);
PreparedStatement ps = con.prepareStatement("SELECT * FROM table");
ResultSet rs = ps.executeQuery()) {
processResults(rs);
} catch (SQLException e) {
e.printStackTrace();
}
案例B:
try (ResultSet rs = DriverManager.getConnection(myConnectionURL)
.prepareStatement("SELECT * FROM table")
.executeQuery()) {
processResults(rs);
} catch (SQLException e) {
e.printStackTrace();
}
在案例A con
中,ps
和rs
将自动关闭。那么案例B 呢?在案例B 中,变量con
和ps
不会像案例A 中那样创建。
我的问题:这两种情况完全相同吗? 案例B 中是否有任何问题?
答案 0 :(得分:1)
案例B不正确,因为Connection
和PreparedStatement
都无法关闭。只有try
块中声明的项目才会自动关闭。
答案 1 :(得分:0)
是的,您正在使用try with resource(使用JDK 7或更高版本),因此您的预准备语句将自动关闭。请参阅this页面以供参考。 PreparedStatement / Connection确实在内部实现了AutoCloseable接口,这对于使用资源块尝试非常有意义。
您可以尝试以下方式:
public void doDbOperation(int id) {
try (Connection con = DriverManager.getConnection(myConnectionURL);
PreparedStatement ps = createStatement(con, userId);
ResultSet rs = ps.executeQuery()) {//auto close
processResults(rs);
} catch (SQLException e) {
e.printStackTrace();
}
return users;
}
private PreparedStatement createStatement(Connection con, int id) throws SQLException {
String sql = "SELECT myid FROM table WHERE id = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, id);
return ps;
}
private void processResults(ResultSet rs) {
// business logic
}