SQL 文をデータベースに発行するときには必ず、 Statement、または、PreparedStatement のインスタンスが必要です。Statement または PreparedStatement のインスタンスがあれば、問い合わせを発行できます。これは、結果全体を保持する ResultSet のインスタンスを返します。次に示す Example 8-1 は、この処理を示します。
Example 8-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();
Statement、または PreparedStatement インタフェースを使用する際は、以下のことを考慮しなければいけません。
必要なときには何回でも 1 つの Statement のインスタンスを使用できます。接続を開いたらすぐにこのインスタンスを作成でき、この接続が有効な期間内で使用することができます。しかし、1つの Statement、または PreparedStatement には 1 つの ResultSet しかあり得ないことを覚えておかなければいけません。
ResultSet の処理中に問い合わせを実行する必要があれば、単純に別の Statement を作成して、それを使用してください。
スレッドを使用し、複数スレッドがデータベースを使用する場合、各スレッドに Statement インスタンスを分けて使わなければいけません。スレッドの使用を考えているのなら、Section 8.8を参照してください。いくつか重要な点が記載されています。
Statement または PreparedStatement を使用し終えたら、それを閉じなければなりません。
ResultSet インタフェースを使用する際、以下のことを考慮しなければいけません。
値を読む前に必ず、next() を呼び出してください。結果があれば真を返します。しかし重要なことは、これにより処理のための行が準備されるということです。
JDBC の仕様では、1 回しかフィールドにアクセスできません。この規則を厳守することは最も安全なのですが、現時点での PostgreSQL のドライバでは、必要ならば何回でもフィールドにアクセスすることができます。
ResultSet に対する処理が完了したら、 close() を呼び出して ResultSet を閉じなければいけません。
ResultSet を作成するときに使用していた Statement に別の問い合わせを作ると、その時点で開いていた ResultSet インスタンスは自動的に閉じられます。
ResultSet は現在読みとり専用です。 ResultSet を通してデータを更新することはできません。データを更新する場合は、SQL の更新文を発行するといった古い形式での方法をとらなければなりません。これは ドライバはこの機能を提供する必要がないというJDBC 仕様に従ったものです。