当结果集中有参数时,如何在自动关闭的资源中设置参数?

时间:2019-02-15 07:13:47

标签: java jdbc

使用参数进行try-with-resources连接->语句->结果集的正确方法是什么?如果我有

    try (Connection connection = dataSource.getConnection();
            PreparedStatement statement = connection.prepareStatement("select * from foo where bar = ?");
            ResultSet result = statement.executeQuery()) {
        while (result.next()) {
        }
    } catch (SQLException e) {
    }

我无法在try块内设置参数。但是,我可以在PreparedStatement statement = getStatement(connection, parameter)之类的外部函数中进行操作,但这会在自动关闭过程中产生任何副作用,还是即使connect.createStatement发生在“外部”,try-with-resources是否仍可跟踪所有内容“?

1 个答案:

答案 0 :(得分:0)

您将需要嵌套try-with-resources。像这样:

try (Connection connection = dataSource.getConnection();
     PreparedStatement statement = connection.prepareStatement("select * from foo where bar = ?");
    statement.setString(1, "baz);
    try (ResultSet result = statement.executeQuery()) {
        // etc
    }
}

行为良好的JDBC驱动程序将在连接关闭时自动关闭语句,并在语句关闭时自动关闭结果集,但最好始终进行防御性编程并确保始终正确关闭资源。

Try-with-resources不是特定于JDBC的。 try-with-resources的基本作用是固定在finally块上,该块通过调用其close()方法以正确的顺序关闭资源。结果,只要实现AutoCloseable,try-with-resources就不会在乎资源的来源。它只是确保在块末尾的资源上调用close()。因此,“ connection.createStatement是否”外部“发生” 不在乎。 createStatement方法只是返回资源的另一种方法,而try-with-resources仅与返回的对象有关。