Java チュートリアルでは、次のことができると述べていますtry-with-resources
。
try (Statement stmt = con.createStatement()) {
ResultSet rs = stmt.executeQuery(query);
...
} catch (SQLException e) {
...
}
このチュートリアルでは、 が閉じられることはありません。したがって、次のようにインターフェイスも実装しているため、ResultSet
を含めたいと思います。ResultSet
AutoCloseable
try (Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query)) {
...
} catch (SQLException e) {
...
}
これは問題なく動作しますが、クエリを実行する前にPreparedStatements
いくつかの値を設定できるようにしたいと考えています。
String name = "Ian";
try (PreparedStatement pstmt = getPreparedStatement(con, stmt);
pstmt.setString(1, name);
ResultSet rs = pstmt.executeQuery(query)) {
...
} catch (SQLException e) {
...
}
変数の割り当てのみが許可されているため (私は推測しています)、これによりさまざまなコンパイル エラーが発生します。
try-with-resources
同じブロックでこれをきちんと行う方法はありますか?
私はすでに考えました:
- ネストされた try-with-resources (これは私が避けようとしているものです)。そうすることに「悪い」ことは何もないことに気づきました。読みやすくするためにこれをやりたいだけです。
次の場合を考慮してください。
try (MyObject1 o1 = new MyObject1()) {
o1.setSomeValue();
try (MyObject2 o2 = new MyObject2(o1)) {
o2.setSomeValue();
try (MyObject3 o3 = new MyObeject3(o2) {
o3.setSomeValue();
// do work here
}
}
} catch (Exception e) {
...
}
対
try (MyObject1 o1 = new MyObject1();
o1.setSomeValue();
MyObject3 o2 = new MyObeject2(o1);
o2.setSomeValue();
MyObject3 o3 = new MyObeject3(o2);
o3.setSomeValue()) {
// do work here
} catch (Exception e) {
...
}
- メソッドにオブジェクトを
setString()
返させ、代入に含める - 接続を作成し、それに応じてパラメーターを設定する、ある種のヘルパー メソッドを作成します。
何かのようなもの:
public PreparedStatement createPreparedStatement(Connection con, String stmt, Object ... params) {
}