gpt4 book ai didi

java - 如何使用 Try-with-Resources 两次使用 PreparedStatement?

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:07:27 24 4
gpt4 key购买 nike

在常规 Java Try-Catch block 中使用 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 执行此操作的正确方法是什么?这是我尝试过的方法,但是“无法分配 try-with-resources 语句的资源 pstmt”。

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 方法仅在 block 执行完毕时针对 pstmt 所指的内容调用,因此 close 永远不会在第一个 PreparedStatement 上调用。

而是制作嵌套的 try-with-resources block :

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-with-Resources 两次使用 PreparedStatement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37215886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com