PostgreSQLポータルサイト <Let's Postgres> http://lets.postgresql.jp/
入門から運用、チューニングノウハウ、新機能の解説など、幅広い内容の技術解説記事をお読みいただけます。

31.3. 問い合わせの発行と結果の処理

SQL 文をデータベースに発行する時には必ず、Statement、または、PreparedStatement のインスタンスが必要です。 Statement または PreparedStatement のインスタンスがあれば、問い合わせを発行できます。 これは、結果全体を保持する ResultSet のインスタンスを返します。 (この動作の変更方法については項31.3.1を参照してください。) 次に示す 例31-1 は、この処理を示します。

例 31-1. JDCB で簡単な問い合わせを処理

この例は、Statement を使用して、簡単な問い合わせを発行し、各行の最初の列を表示します。

Statement st = db.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
while (rs.next()) {
    System.out.print("Column 1 returned ");
    System.out.println(rs.getString(1));
}
rs.close();
st.close();

この例は、PreparedStatement と問い合わせにバインドする値を使用して、同一の問い合わせを発行します。

int foovalue = 500;
PreparedStatement st = db.prepareStatement("SELECT * FROM mytable WHERE columnfoo = ?");
st.setInt(1, foovalue);
ResultSet rs = st.executeQuery();
while (rs.next()) {
    System.out.print("Column 1 returned ");
    System.out.println(rs.getString(1));
}
rs.close();
st.close();

31.3.1. カーソルに基づいて結果を取り出す

デフォルトでは、ドライバは問い合わせの結果を一度にすべて収集します。 これは巨大なデータセットには不向きですので、JDBCドライバは、データベースカーソル上にResultSetを置き、少量の行だけを取り出す手段を提供しています。

行のごく一部は接続のクライアント側に一時保存され、カーソルの移動によって次の行ブロックが取り出された時に破棄されます。

例 31-2. カーソルの有効、無効を変更するための抽出サイズの設定

コードをカーソルモードに変更することは簡単で、Statementの抽出サイズを適当なサイズに設定するだけです。 抽出サイズを0に戻せば、(デフォルトの動作である)すべての行が取り出されるようになります。

Statement st = db.createStatement();
// カーソルの使用を有効にする。
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("a row was returned.");
}
rs.close();
// カーソルを無効にする。
st.setFetchSize(0);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("many rows were returned.");
}
rs.close();
// 文を閉じる。
st.close();

31.3.2. Statement または PreparedStatement インタフェースの使用

Statement、または PreparedStatement インタフェースを使用する際は、以下のことを考慮しなければいけません。

  • 必要な時には何回でも 1 つの Statement のインスタンスを使用できます。 接続を開いたらすぐにこのインスタンスを作成でき、この接続が有効な期間内で使用することができます。 しかし、1つのStatement、または PreparedStatement には、ある時点で1つのResultSetしかあり得ないことを覚えておかなければいけません。

  • ResultSet の処理中に問い合わせを実行する必要があれば、単純に別の Statement を作成して、それを使用してください。

  • スレッドを使用し、複数スレッドがデータベースを使用する場合、各スレッドに Statement インスタンスを分けて使わなければいけません。 スレッドの使用を考えているのなら、項31.9 を参照してください。 いくつか重要な点が記載されています。

  • Statement または PreparedStatement を使用し終えたら、それを閉じなければなりません。

31.3.3. ResultSet インタフェースの使用

ResultSetインタフェースを使用する際、以下のことを考慮しなければいけません。

  • 値を読む前に必ず、next() を呼び出してください。 結果があれば真を返します。 しかし重要なことは、これにより処理のための行が準備されるということです。

  • JDBC の仕様では、1 回しかフィールドにアクセスできません。 この規則を厳守することは最も安全なのですが、現時点での PostgreSQL のドライバでは、必要ならば何回でもフィールドにアクセスすることができます。

  • ResultSet に対する処理が完了したら、close() を呼び出して ResultSet を閉じなければいけません。

  • ResultSet を作成する時に使用していた Statement に別の問い合わせを作ると、その時点で開いていた ResultSet インスタンスは自動的に閉じられます。