java - 我应该如何在 JDBC 中使用 try-with-resources?

标签 java jdbc java-7 try-with-resources

我有一种使用 JDBC 从数据库中获取用户的方法:

public List<User> getUser(int userId) {
    String sql = "SELECT id, name FROM users WHERE id = ?";
    List<User> users = new ArrayList<User>();
    try {
        Connection con = DriverManager.getConnection(myConnectionURL);
        PreparedStatement ps = con.prepareStatement(sql); 
        ps.setInt(1, userId);
        ResultSet rs = ps.executeQuery();
        while(rs.next()) {
            users.add(new User(rs.getInt("id"), rs.getString("name")));
        }
        rs.close();
        ps.close();
        con.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return users;
}

我应该如何使用 Java 7 try-with-resources改进这段代码?

我尝试过下面的代码,但它使用了许多 try block ,并没有提高 可读性。我应该以其他方式使用 try-with-resources 吗?

public List<User> getUser(int userId) {
    String sql = "SELECT id, name FROM users WHERE id = ?";
    List<User> users = new ArrayList<>();
    try {
        try (Connection con = DriverManager.getConnection(myConnectionURL);
             PreparedStatement ps = con.prepareStatement(sql);) {
            ps.setInt(1, userId);
            try (ResultSet rs = ps.executeQuery();) {
                while(rs.next()) {
                    users.add(new User(rs.getInt("id"), rs.getString("name")));
                }
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return users;
}

最佳答案

我意识到这个问题很久以前就得到了回答,但我想提出一种额外的方法来避免嵌套的 try-with-resources 双 block 。

public List<User> getUser(int userId) {
    try (Connection con = DriverManager.getConnection(myConnectionURL);
         PreparedStatement ps = createPreparedStatement(con, userId); 
         ResultSet rs = ps.executeQuery()) {

         // process the resultset here, all resources will be cleaned up

    } catch (SQLException e) {
        e.printStackTrace();
    }
}

private PreparedStatement createPreparedStatement(Connection con, int userId) throws SQLException {
    String sql = "SELECT id, username FROM users WHERE id = ?";
    PreparedStatement ps = con.prepareStatement(sql);
    ps.setInt(1, userId);
    return ps;
}

关于java - 我应该如何在 JDBC 中使用 try-with-resources?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8066501/

相关文章:

Java 7 的 nio.file 包在创建新文件时非常慢

java - Spring 安全 : How to use multiple URL patterns in FilterRegistrationBean?

java - 使用 OnClickListener() 是策略模式的示例吗?

java - 将 Adob​​e Flex 前端与 Java 后端连接时,我创建的服务未显示在数据向导中

java - 如何在 for 循环中接收对象的数据

java - JDK 日期/时间的问题是否已修复,或者是否仍被视为已损坏?

java - 如何在 Eclipse 中使用 gson 将 ResultSet 查询转换为 JSON?

mysql - 如何在 Play Framework 配置文件中为 mysql db url 设置 autoReconnect 属性?

tomcat - 未知的 sun.jdbc.odbc.JdbcOdbcDriver 的实例

java - 如何在newBufferWriter中设置路径