第5章 問い合わせの発行と結果の処理

目次

カーソルに基づいた結果の入手
StatementまたはPreparedStatementインタフェースの使用
ResultSetインタフェースの使用
更新処理
データベースオブジェクトの作成と変更

SQL文をデータベースに発行する時は常に、StatementまたはPreparedStatementのインスタンスが必要です。 一度StatementまたはPreparedStatementを作成すれば、問い合わせの発行に使用できます。 これは、結果全体を含むResultSetを返します(この動作を変更する方法についてはカーソルに基づいた結果の入手項を参照してください)。 例 5.1にこの処理を示します。

例 5.1. JDBCにおける単純な問い合わせ処理

この例では、Statementを使用して、単純な問い合わせを発行し、各行の先頭列を表示します。

Statement st = conn.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 = conn.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();

カーソルに基づいた結果の入手

デフォルトでは、ドライバは一度に問い合わせの結果をすべて収集します。 これは大規模なデータセットでは不便なことがありますので、JDBCドライバはデータベースカーソル上のResultSetに基づいた手法を用意しています。 これにより、行の一部分のみを取り出すことができます。

行の一部分は接続のクライアント側にキャッシュされ、カーソルを移動して次の行ブロックを取り出した時に破棄されます。

注意

ResultSetsに基づいたカーソルはすべての状況で使用できません。 いくつか制限があり、その場合ドライバは黙ってResultSets全体を一度に取り出すようになります。

  • サーバへの接続はV3プロトコルを使用しなければなりません。 これは、サーババージョン7.4以降のデフォルトです(、そしてバージョン7.4以降でのみサポートされています)。

  • Connectionが自動コミットモードではいけません。 トランザクションの終了時、バックエンドはカーソルを閉じます。 そのため自動コミットモードでは、バックエンドはカーソルから行を取り出す前にカーソルを閉じてしまいます。

  • StatementResultSet.TYPE_FORWARD_ONLYという種類のResultSet で生成されなければなりません。 これはデフォルトですので、このためにコードを書き換える必要はありません。 しかし、これはまた、ResultSetを逆方向に進めることや周回させることができないことを意味しています。

  • 実行する問い合わせは単一文でなければなりません。 セミコロンでまとめた複数文ではいけません。

例 5.2. 取り出しサイズを変更することでカーソルを有効/無効にする

カーソルモードへコードを変更することは簡単で、Statementの取り出しサイズを適切な値に設定するだけです。 取り出しサイズを0にすることで、すべての行をキャッシュするようになります(デフォルトの動作です。)。


// 確実に自動コミットを無効にする。
conn.setAutoCommit(false);
Statement st = conn.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);
rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("many rows were returned.");
}
rs.close();


// 文を閉じる
st.close();