如何使用 Try-with-Resources 两次使用 PreparedStatement?
How to use a PreparedStatement twice with Try-with-Resources?
在常规 Java Try-Catch 块中使用 PreparedStatements 时,我可以随时将 PreparedStatement 更改为 运行 不同的查询,如下所示:
String sqlStatement = "update someTable set someValue = true";
try{
PreparedStatement pstmt = con.prepareStatement(sqlStatement);
pstmt.executeUpdate();
/* Here I change the query */
String anotherSqlStatement = "update aDifferentTable set something = false";
pstmt = con.prepareStatement(anotherSqlStatement);
pstmt.executeUpdate();
}
catch(Exception ex){
...
}
使用 Java 的 Try-with-Resources 执行此操作的正确方法是什么?
这是我试过的方法,但是 "The resource pstmt of a try-with-resources statement cannot be assigned".
try(Connection con = DriverManager.getConnection(someConnection, user, password);
PreparedStatement pstmt = con.prepareStatement(sqlStatement)){
ResultSet rs = pstmt.executeQuery();
....
/* Here I attempt to change the query, but it breaks */
String anotherSqlStatement = "select something from someTable";
pstmt = con.prepareStatement(anotherSqlStatement);
}
catch(Exception ex){
...
}
我不想再次声明变量,我知道这会破坏 Try-with-Resources 的目的,我只想将它分配给其他东西。正确的做法是什么?
想想如果 Java 让你这样做会发生什么。如果您重新分配 pstmt 引用的内容,那么在第一个 PreparedStatement 执行后,pstmt 将引用第二个 PreparedStatement。 close 方法仅在块执行完毕时针对 pstmt 所指的内容调用,因此 close 永远不会在第一个 PreparedStatement 上调用。
而是制作嵌套的 try-with-resources 块:
try (Connection con = DriverManager.getConnection(someConnection, user, password)) {
try (PreparedStatement pstmt = con.prepareStatement(sqlStatement)) {
pstmt.executeUpdate();
}
try (PreparedStatement pstmt = con.prepareStatement(anotherSqlStatement)) {
pstmt.executeUpdate();
}
}
这样就有两个不同作用域的pstmt局部变量。第一个 PreparedStatement 在第二个 PreparedStatement 开始之前关闭。
在常规 Java Try-Catch 块中使用 PreparedStatements 时,我可以随时将 PreparedStatement 更改为 运行 不同的查询,如下所示:
String sqlStatement = "update someTable set someValue = true";
try{
PreparedStatement pstmt = con.prepareStatement(sqlStatement);
pstmt.executeUpdate();
/* Here I change the query */
String anotherSqlStatement = "update aDifferentTable set something = false";
pstmt = con.prepareStatement(anotherSqlStatement);
pstmt.executeUpdate();
}
catch(Exception ex){
...
}
使用 Java 的 Try-with-Resources 执行此操作的正确方法是什么? 这是我试过的方法,但是 "The resource pstmt of a try-with-resources statement cannot be assigned".
try(Connection con = DriverManager.getConnection(someConnection, user, password);
PreparedStatement pstmt = con.prepareStatement(sqlStatement)){
ResultSet rs = pstmt.executeQuery();
....
/* Here I attempt to change the query, but it breaks */
String anotherSqlStatement = "select something from someTable";
pstmt = con.prepareStatement(anotherSqlStatement);
}
catch(Exception ex){
...
}
我不想再次声明变量,我知道这会破坏 Try-with-Resources 的目的,我只想将它分配给其他东西。正确的做法是什么?
想想如果 Java 让你这样做会发生什么。如果您重新分配 pstmt 引用的内容,那么在第一个 PreparedStatement 执行后,pstmt 将引用第二个 PreparedStatement。 close 方法仅在块执行完毕时针对 pstmt 所指的内容调用,因此 close 永远不会在第一个 PreparedStatement 上调用。
而是制作嵌套的 try-with-resources 块:
try (Connection con = DriverManager.getConnection(someConnection, user, password)) {
try (PreparedStatement pstmt = con.prepareStatement(sqlStatement)) {
pstmt.executeUpdate();
}
try (PreparedStatement pstmt = con.prepareStatement(anotherSqlStatement)) {
pstmt.executeUpdate();
}
}
这样就有两个不同作用域的pstmt局部变量。第一个 PreparedStatement 在第二个 PreparedStatement 开始之前关闭。