モジュール java.sql.rowset
パッケージ javax.sql.rowset

クラスBaseRowSet

java.lang.Object
javax.sql.rowset.BaseRowSet
すべての実装されたインタフェース:
Serializable, Cloneable

public abstract class BaseRowSet extends Object implements Serializable, Cloneable
RowSetオブジェクトとその基本機能を提供するabstractクラスです。 基本機能には、すべてのJavaBeansコンポーネントが実装する必要があるプロパティの設定およびイベント通知の送信が含まれます。

1.0 概要

BaseRowSetクラスはすべてのRowSet実装の中核機能を提供しますが、どの標準実装でもベンダー固有の標準実装を提供するため、このクラスと1つ以上のRowSetインタフェースを使用することができます より明確な言い方をするなら、どの実装でも必ず、RowSetインタフェース(JdbcRowSetCachedRowSetJoinRowSetFilteredRowSetまたはWebRowSet)を1つ以上実装する必要があります。 つまり、BaseRowSetクラスを拡張する実装では必ず、いずれかのRowSetインタフェースも実装する必要があります。

BaseRowSetクラスは次の機能を提供します。

  • プロパティ
    • 現在のプロパティを格納するフィールド
    • プロパティを取得および設定するメソッド
  • イベント通知
  • RowSetオブジェクトのコマンドにパラメータを設定する設定メソッドの完全なセット
  • ストリーム
    • ストリーム・インスタンスを格納するフィールド
    • ストリームの型を示す定数

2.0 プロパティの設定

どの行セットも必ず一連のプロパティを保持しますが、それらのプロパティは通常、ツールを使用して設定されます。 行セットに含まれるプロパティの数や種類は、RowSet実装の処理内容やデータの取得方法によって異なります。 たとえば、ResultSetオブジェクトからデータを取得する行セットでは、データベース接続に必要なプロパティを設定する必要があります。 DriverManager機能を使用して接続を行うRowSetオブジェクトでは、適切なドライバを識別するJDBC URLのプロパティを設定する必要があるほか、ユーザー名とパスワードを提供するプロパティも設定する必要があります。 一方、推奨の方法であるDataSourceオブジェクトを使用して接続を行う行セットでは、JDBC URLのプロパティを設定する必要はありません。 かわりに、データ・ソースの論理名のプロパティ、およびユーザー名とパスワードのプロパティを設定する必要があります。

NOTE: 接続にDataSourceオブジェクトを使用するには、Java Naming and Directory Interface (JNDI) APIを使用するネーミング・サービスにDataSourceオブジェクトが登録されている必要があります。 登録は通常、システム管理者が行います。

3.0 コマンドとコマンド・パラメータの設定

行セットは、リレーショナル・データベースからデータを取得すると、ResultSetオブジェクトを生成するコマンド(クエリー)を実行します。 このクエリーは、RowSetオブジェクトのコマンド・プロパティに設定されるコマンドです。 行セットは、ResultSetオブジェクトからデータを読み込んで、自身にデータを移植します。 クエリーに未設定の値のプレースホルダーが含まれている場合、BaseRowSet設定メソッドを使って、これらの値を設定できます。 どの設定メソッドでも、必要に応じてnull値を設定できます。

次のコードの抜粋は、CachedRowSetオブジェクトcrsにコマンド・プロパティを設定する方法を示しています。 ツールを使ってプロパティを設定する場合、このコードを使用します。


    crs.setCommand("SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS" +
                   "WHERE CREDIT_LIMIT > ? AND REGION = ?");
 

この例ではCREDIT_LIMITREGIONの値がプレースホルダー・パラメータであり、疑問符(?)で示されています。 最初の疑問符はパラメータ番号1、2番目の疑問符はパラメータ番号2のプレースホルダー(以下同様)です。 クエリーを実行するためには、あらかじめプレースホルダー・パラメータを設定しておく必要があります。 BaseRowSetクラスは、プレースホルダー・パラメータの設定に必要な設定メソッドを提供します。この設定メソッドは、PreparedStatementインタフェースがデータ型の値を設定するために提供するメソッドとよく似ています。 RowSetオブジェクトは、パラメータ値を内部で格納します。このオブジェクトのexecuteメソッドは、格納されたパラメータ値を内部で利用して、実行するDBMSにコマンドを送信する前にプレースホルダー・パラメータの値を設定します。

次のコードの抜粋は、先ほどの例で、クエリー内の2つのパラメータを設定する方法を示しています。


    crs.setInt(1, 5000);
    crs.setString(2, "West");
 
この時点でexecuteメソッドを呼び出すとすると、DBMSに送信されるクエリーは次のようになります。

    "SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS" +
                   "WHERE CREDIT_LIMIT > 5000 AND REGION = 'West'"
 
ノート: ArrayClobBlobおよびRefオブジェクトをコマンド・パラメータとして設定すると、これらの値はそれぞれSerialArraySerialClobSerialBlob、およびSerialRefオブジェクトとして保存されます。

4.0 内部のパラメータ処理

ノート: BaseRowSetクラスは、プロパティを設定する設定メソッドと、プレースホルダー・パラメータを設定する設定メソッドを提供します。 このセクションでは、プレースホルダー・パラメータを設定する設定メソッドについて説明します。

BaseRowSet設定メソッドで設定されたプレースホルダー・パラメータは、内部のHashtableオブジェクトにオブジェクトとして格納されます。 プリミティブはObject型として格納されます。 たとえば、byteByteオブジェクト、intIntegerオブジェクトとして格納されます。 executeメソッドが呼び出されると、Hashtableオブジェクト内の値が、コマンド内の適切なプレースホルダー・パラメータに代入されます。

getParamsメソッドを呼び出すと、Hashtableオブジェクトに格納された値がObjectインスタンスの配列として返されます。 この配列内の要素は、単純なObjectインスタンスかObject型の配列になります。 配列内の要素がObjectになるか配列になるかは、使用する設定メソッドによって異なります。

プレースホルダー・パラメータを設定するほとんどのメソッドは、2つのパラメータを取ります。第1のパラメータで設定するプレースホルダー・パラメータを指定し、第2のパラメータで設定する値を指定します。 該当メソッドには、setIntsetStringsetBooleansetLongなどがあります。 これらのメソッドを呼び出したあと、getParamsを呼び出すと、設定された値から成る配列が返されます。 配列内の各値は、設定された値を表すObjectインスタンスになります。 配列内の値の並び順は、設定メソッドに渡されるint (第1のパラメータ)によって決定されます。 配列内の値は、設定メソッドに渡される値(第2のパラメータ)になります。 つまり、配列内の第1の要素が、RowSetオブジェクトのコマンドで第1のプレースホルダー・パラメータに設定されます。 配列内の第2の要素が、第2のプレースホルダー・パラメータに設定される(以下同様)ということになります。

設定する値以外に、ドライバとDBMSの情報を送信する設定メソッドもあります。 このような設定メソッドの使用後にgetParamsメソッドを呼び出すと、追加情報を格納するため、配列内の要素自体が配列になります。 このような設定メソッドの特例として、一方のバージョンがパラメータを2つしか取らないsetNullメソッドがあります(setNull(int parameterIndex, int SqlType))。 ただし、このメソッドも、ドライバとDBMSに渡す情報を格納するため、配列を必要とします。 この配列内の第1の要素は、設定する値nullになります。第2の要素は、sqlTypeに代入されるintであり、nullに設定されるSQL値の型を示します。 この情報は、一部のDBMSでは必須です。したがって、アプリケーションの移植性を確保するためには、この情報が必須になります。 もう一方のバージョンは、nullに設定する値がユーザー定義型であるときに使用するためのものです。 この場合も、3つのパラメータ(setNull(int parameterIndex, int sqlType, String typeName))を使用し、ドライバとDBMSに渡す情報を格納する配列が必要になります。 この配列の最初の2つの要素は、最初のバージョンのsetNullの場合と同じです。 第3の要素typeNameは、ユーザー定義型のSQL名を指定します。 その他の設定メソッドと同じく、設定するプレースホルダー・パラメータの数は、getParamsによって返される配列内の要素の位置で表されます。 たとえば、setNullのパラメータが2の場合、getParamsによって返される配列内の第2の要素は、2 - 3個の要素から成る配列になります。

setObjectsetDateをはじめとする一部のメソッドは、2つ以上のパラメータと、ドライバまたはDBMSに情報を提供する追加のパラメータを取る場合があります。 たとえば、setDateメソッド、setTimeメソッド、setTimestampメソッドは、3番目のパラメータとしてCalendarオブジェクトを取ることができます。 DBMSにタイムゾーン情報が格納されていない場合、ドライバはCalendarオブジェクトを使用して、設定するDateオブジェクト、TimeオブジェクトまたはTimestampオブジェクトを作成します。 追加情報を提供するその他のメソッドと同様に、getParamsから返される配列内の要素は、単純なObjectインスタンスではなく、配列になります。

setAsciiStreamsetBinaryStreamsetCharacterStreamsetUnicodeStreamの各メソッド(非推奨。アプリケーションは、これらのかわりにgetCharacterStreamを使用するべきである)は、3つのパラメータを取ります。したがって、この場合も、getParamsから返される配列内の要素は配列になります。 これらの設定メソッドは、配列内に、パラメータによって提供される情報だけでなく、設定するストリームの型を示すBaseRowSet定数が含まれているという点で、その他の設定メソッドと異なっています。

ノート: getParamsメソッドは、このクラスを拡張するRowSet実装によって内部で呼び出されます。通常、アプリケーション・プログラマによって直接呼び出されることはありません。

5.0 イベント通知

BaseRowSetクラスは、行セットにイベント通知メカニズムを提供します。 このクラスには、listenersフィールド、リスナーの追加と削除を行うメソッド、リスナーに変更を通知するメソッドが含まれます。

リスナーは、RowSetListenerインタフェースを実装するオブジェクトです。 RowSetオブジェクトのリスナー・リストに追加されたリスナーは、そのRowSetオブジェクトで発生したイベントの通知を受けます。 イベントの発生通知を受けたときのオブジェクトの動作は、各リスナーのRowSetListenerメソッドの実装によって定義されます。

RowSetオブジェクトで発生する可能性があるイベントは、次の3種類です。

  1. カーソルの移動
  2. 個々の行の変更(更新、削除、または挿入)
  3. RowSetオブジェクト全体の内容の変更

通知に使用されるBaseRowSetメソッドは、発生したイベントの型を示します。 たとえば、notifyRowChangedメソッドは、行が更新、削除、または挿入されたことを示します。 各通知メソッドは、イベントの発生元のRowSetオブジェクトを特定するためにリスナーに渡される、RowSetEventオブジェクトを作成します。 リスナーがこの情報を利用して何を行うか(何も行わない場合もある)は、リスナーの実装によって異なります。

6.0 デフォルトの動作

デフォルトのBaseRowSetオブジェクトの初期化のときの開始値は、一定ではありません。 BaseRowSetクラスを拡張するデフォルトのRowSetインスタンスには、次の特徴があります。
  • スクロール可能なカーソルを使用し、その他のユーザーによる変更を表示しない。
  • 更新可能。
  • 削除された行は表示しない。
  • ドライバがRowSetオブジェクトのコマンド実行に費やす時間に制限はない。
  • 含むことのできる行数に制限はない。
  • 列内のバイト数に制限はない。 ノート: ただし、次の型の値を格納する列には、バイト数の制限が課される: BINARYVARBINARYLONGVARBINARYCHARVARCHAR、およびLONGVARCHAR
  • 未確定のデータは表示しない(「ダーティ」読取りになる)。
  • エスケープ処理が有効。
  • 接続の型マップはnullに設定されている。
  • RowSetオブジェクトのコマンド内のプレースホルダー・パラメータに設定された値を格納するため、空のVectorオブジェクトが用意されている。

適切な値が異なる場合、アプリケーションは、その値を明示的に設定する必要があります。 たとえば、次のコードは、CachedRowSetオブジェクトcrsに最大行数500を設定します。

    crs.setMaxRows(500);
 
このBaseRowSetクラスの拡張に実装されたメソッドは、定義済みのアサーションに対する違反があった場合、SQLExceptionオブジェクトをスローする必要があります そのため、このメソッドは、クラスの拡張によってBaseRowSetメソッドがオーバーライドされ、再実装されたあと、接続の問題または配下のデータ・ソースの問題が検出された場合も、SQLExceptionオブジェクトをスローする可能性があります

導入されたバージョン:
1.5
関連項目: