Java 7,try-with-resources:我可以省略创建Connection和PreparedStatement吗?

时间:2014-12-15 11:55:32

标签: java try-catch java-7 autocloseable

案例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中,psrs将自动关闭。那么案例B 呢?在案例B 中,变量conps不会像案例A 中那样创建。

我的问题:这两种情况完全相同吗? 案例B 中是否有任何问题?

2 个答案:

答案 0 :(得分:1)

案例B不正确,因为ConnectionPreparedStatement都无法关闭。只有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
}