結果セットのカスタマイズ
最新の JDBC API を使用すると、オブジェクトを大幅にカスタマイズできます。声明と結果セット。たとえば、次のように使用します。結果セットデータベース内の行を変更できます。
ステートメント オブジェクトを作成するときに、多くの要望をそれに渡すことができます。これらの願いは 3 つのグループに分類できます。
- ベース接続タイプ
- 同時アクセス制御
- 永続性とトランザクション
これらのパラメータは、オブジェクトの作成時に渡すことができます。声明また準備されたステートメント。例:
Statement statement = connection.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
ResultSet.CLOSE_CURSORS_OVER_COMMIT );
PreparedStatement statement = connection.prepareStatement(sql,
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
ResultSet.CLOSE_CURSORS_OVER_COMMIT);
これらのことについては詳しく調査しませんが、他の人のコードで同様のものを見つけた場合は、これが可能であることを知っておいてください。
ResultSet タイプ
ResultSet は特定のタイプにすることができます。この型は、ResultSet の特性と機能の一部を定義します。
すべてのタイプがすべてのデータベースおよび JDBC ドライバーでサポートされているわけではありません。データベースと JDBC ドライバーをチェックして、使用したいタイプをサポートしているかどうかを確認する必要があります。DatabaseMetaData.supportsResultSetType(int type)メソッドは、指定された型がサポートされているかどうかに応じてtrueまたはfalseを返します。
この記事の執筆時点では、ResultSet には次の 3 種類があります。
- ResultSet.TYPE_FORWARD_ONLY
- ResultSet.TYPE_SCROLL_INSENSITIVE
- ResultSet.TYPE_SCROLL_SENSITIVE
デフォルトのタイプは TYPE_FORWARD_ONLY です。
TYPE_FORWARD_ONLY は、ResultSet が前方にのみ移動できることを意味します。つまり、行 1、行 2、行 3 などからのみ移動できます。ResultSet では、後方に移動することはできません。つまり、10 番目の行を読み取った後に 9 行目のデータを読み取ることはできません。
TYPE_SCROLL_INSENSITIVE は、ResultSet を前後に移動 (スクロール) できることを意味します。現在の位置を基準とした相対位置に移動したり、絶対位置に移動したりすることもできます。
このタイプの ResultSet は、ResultSet が開いている間は、基になるデータ ソースへの変更の影響を受けません。つまり、ResultSet 内のエントリが別のスレッドまたはプロセスによってデータベース内で変更された場合、すでに開かれているエントリには反映されません。結果セットこのタイプのもの。
TYPE_SCROLL_SENSITIVE は、ResultSet を前後に移動 (スクロール) できることを意味します。現在の位置を基準とした相対位置に移動したり、絶対位置に移動したりすることもできます。
このタイプの ResultSet は、ResultSet が開いている間、基になるデータ ソースの変更の影響を受けやすくなります。つまり、ResultSet 内のエントリが別のスレッドまたはプロセスによってデータベース内で変更された場合、それはすでに開いているエントリに反映されます。結果セットこのタイプのもの。
同時実行性
ResultSet の同時実行性によって、ResultSet が更新できるか読み取りのみが可能かが決まります。
一部のデータベースと JDBC ドライバーは ResultSet の更新をサポートしていますが、すべてではありません。DatabaseMetaData.supportsResultSetConcurrency(int concurrency)メソッドは、指定された同時実行モードがサポートされているかどうかに応じてtrueまたはfalseを返します。
ResultSet には、次の 2 つのレベルの同時実行性のいずれかを指定できます。
- ResultSet.CONCUR_READ_ONLY
- ResultSet.CONCUR_UPDATABLE
CONCUR_READ_ONLY は、 ResultSet が読み取りのみできることを意味します。
CONCUR_UPDATABLE は、 ResultSet の読み取りと変更が可能であることを意味します。
データベース内のデータを変更する例
これらのパラメータを使用すると、生成された Statement とその ResultSet を制御できます。
たとえば、更新可能な ResultSet を作成し、それを使用してデータベースを変更できます。ステートメントを作成するときは、次の条件に従うことが重要です。
- テーブルが 1 つだけ指定されている
- join 句や group by 句が含まれていない
- クエリ列には主キーが含まれている必要があります
上記の条件が満たされる場合、更新された ResultSet を使用してデータベース内のテーブルを更新できます。Statement オブジェクトを作成するときは、次のパラメータを指定する必要があります。
Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)
このようなステートメントを実行した結果は、更新可能な結果セットになります。更新方法は、ResultSet カーソルを更新したい行に移動し、updateXXX()メソッドを呼び出します。
updateXXXメソッドはgetXXX()メソッドと同様に機能します。updateXXX()メソッドには2 つのパラメータがあります。1 つ目は更新される列の番号で、列名またはシリアル番号を指定できます。2 番目は更新する必要があるデータで、このデータ型は XXX と同じである必要があります。
データベース内の行を実際に更新するには、ResultSet カーソルが変更された行から離れる前にupdateRow()メソッドを呼び出す必要があります。そうしないと、変更がデータベースに反映されません。
テーブルに新しい行を追加することもできます。
まず、カーソルを空の行に移動する必要があります。これを行うには、moveToInsertRow()メソッドを呼び出します。
次に、 updateXXX()メソッドを使用して、この行にデータを入力する必要があります。
次に、 inserterRow()メソッドを呼び出して行をベースに追加する必要があります。
最後に、 moveToCurrentRow()メソッドを呼び出してカーソルを戻す必要があります。
重要!すべての DBMS が拡張ステートメントのこれらのオプションをサポートしているわけではありません。問題が発生した場合は、特定の DBMS の公式ドキュメントを参照してください。
GO TO FULL VERSION