我有一种通过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;
}

我应该如何使用Java7try-with-resources来改进这段代码?

我试过使用下面的代码,但它使用了try个块,并且对readability块没有多大改进.我应该用另一种方式使用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 ,因此您至少可以从3降到2,而且您也不需要在资源列表的末尾关闭;.使用两个try块的优点是,所有代码都提前呈现,因此不必参考单独的方法:

public List<User> getUser(int userId) {
    String sql = "SELECT id, username FROM users WHERE id = ?";
    List<User> users = new ArrayList<>();
    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;
}

Java相关问答推荐

在Keycloak测试容器中的测试之间清理数据库

JLS中形式参数列表后面的任何括号对用于确定方法结果中的精确数组类型的具体含义是什么?

通过推送通知向自己发送Matrix消息

如何在Android上获取来电信息

在Java中将Charsequence数组更改为String数组或List String<>

Spring boot:Bean和动态扩展器

scanner 如何在执行hasNextLine一次后重新读取整个文件?

ApachePOI:不带换行的新行

基本时态运算的ISO-8601周数据表示法

XPages-在第二次点击按钮之前延迟

如何使用SpringBoot中的可分页对整数作为字符串存储在数据库中时进行排序

与Spring Boot相关的实体未正确保存

为什么我的回收视图会显示重复的列表?

在添加AdMob时无法为Google Play构建应用程序包:JVM垃圾收集器崩溃和JVM内存耗尽

我怎样才能让IntelliJ标记toString()的任何实现?

AbstractList保证溢出到其他方法

对角线填充二维数组

持续时间--为什么在秒为负数的情况下还要做额外的工作?

当使用不同的参数类型调用时,为什么围绕Objects.equals的类型安全包装不会失败?

如何在Spring Security中设置一个任何人都可以打开的主页?