CodeGym /Java Course /All lectures for JA purposes /ResultSet を使用した高度な作業

ResultSet を使用した高度な作業

All lectures for JA purposes
レベル 1 , レッスン 821
使用可能

結果セットのカスタマイズ

最新の 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 の公式ドキュメントを参照してください。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION