前提
Oracle JDK8を使って、Javaの勉強をしています。
現在は、JDBCで、データベースへのアクセスをしているのですが、
try-with-resources文におけるResultSetのクローズ処理の扱いで、よくわからないところがあります。
該当のソースコード
以下のコードは、テキストのコードを参考にして書いたものです。
コード1では、tryの宣言文の中に、ResultSetが宣言されています。
この場合、try-with-resources文を抜けた後、ResultSetがクローズされる、という理解をしております。
java
1// コード 1 2 public List<People> selectAll() throws SQLException { 3 4 List<People> peopleList = new ArrayList<People>(); 5 6 // データベースへの接続の取得、PreparedStatementの取得 7 try (Connection con = ConnectionManager.getConnection(); 8 Statement stmt = con.createStatement(); 9 // ここでResultSetが宣言されている 10 ResultSet res 11 = stmt.executeQuery("SELECT * FROM m_people")) { 12 // 結果の操作 13 while (res.next()) { 14 /* 省略 */ 15 } 16 } 17 18 return PeopleList; 19 } 20
それに対して、以下のコード2では、try句の中に、ResultSetが定義されています。
Java
1// コード 2 2public List<String> selectName(String section) throws SQLException { 3 4 List<String> nameList = new ArrayList<String>(); //氏名 5 6 // データベースへの接続の取得、PreparedStatementの取得 7 try (Connection con = ConnectionManager.getConnection(); 8 PreparedStatement pstmt 9 = con.prepareStatement("SELECT name FROM m_people WHERE section = ?")) { 10 11 // プレースホルダへの値の設定 12 pstmt.setString(1, section); 13 14 // ここでResultSetが宣言されている、これはクローズされる? 15 ResultSet res = pstmt.executeQuery(); 16 17 // 結果の操作 18 while (res.next()) { 19 /* 省略 */ 20 } 21 } 22 23 return nameList; 24 25 }
このコード2の場合、ResultSetはクローズされるのか疑問に思いました。
調べてみたこと
ResultSetの公式ドキュメントをあたってみました。
ResultSetオブジェクトは、このオブジェクトを生成したStatementオブジェクトが閉じられるとき、再実行されるとき、あるいは一連の複数の結果から次の結果を取り出すために使われるときに、自動的に閉じられます。
https://docs.oracle.com/javase/jp/8/docs/api/java/sql/ResultSet.html
それを踏まえての質問事項です。
(1) 上記の「調べてみたこと」の引用で、「一連の複数の結果から次の結果を取り出すために使われるときに、自動的に閉じられる」とのことです。これは、ResultSetを作成した後、ResultSet.next()でデータを読み出すことでしょうか?
(2) 上記のコード1では、tryの宣言文にResultSetが宣言されています。コード2では、tryの中にResultSetが宣言されています。この違いは何でしょうか? コード1では、tryの宣言文に明記しないと、自動的に閉じられないのでしょうか?
補足情報
java version 1.8.0_181
回答2件
あなたの回答
tips
プレビュー