使用参数进行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是否仍可跟踪所有内容“?
答案 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仅与返回的对象有关。