Blob オブジェクトとは、SQL の BLOB (2 進ラージオブジェクト) を Java プログラミング言語にマッピングした表現形式です。SQL の BLOB は、2 進ラージオブジェクトをデータベーステーブルの行内に列の値として格納する組み込みの型です。プログラマは、ResultSet、CallableStatement、および PreparedStatement インタフェース内のメソッドを使用して、SQL92 の組み込み型にアクセスするのと同じように SQL3 型 BLOB へアクセスできます。つまり、JDBC 2.0 API を使用するアプリケーションでは、BLOB 値に対する getBlob および setBlob などのメソッドが、INTEGER 値に対する getInt および setInt、CHAR 値または VARCHAR 値に対する getString および setString と同じように使用されます。
標準的な実装の場合、JDBC ドライバは、背後で SQL の LOCATOR(BLOB) 型を使用して Blob インタフェースを実装します。LOCATOR(BLOB) によってデータベースサーバ上の SQL の BLOB 値が指定され、ロケータ上の操作によって得られる結果は、BLOB 値自体での操作と同じです。つまり、クライアントマシン上で BLOB データを生成しなくても Blob インスタンス上で操作が可能なので、クライアントマシンのパフォーマンスが著しく向上します。LOCATOR(BLOB) は、ドライバによって背後で使用されるため、プログラマは JDBC ドライバを完全に透過的に使用します。
Blob インスタンスの標準的な動作は、このインスタンスが作成されたトランザクションが、確定または元に戻るまで有効です。
Blob インタフェースには、SQL の BLOB 値の長さを取得するメソッドや、クライアント上で BLOB 値を生成するメソッド、および BLOB 値内のバイトのパターンの位置を判断するメソッドが用意されています。
次のコードは、Blob オブジェクトの作成方法を示しています。stmt は、Statement オブジェクトです。
ResultSet rs = stmt.executeQuery("SELECT DATA FROM TABLE1");
rs.first();
Blob data = rs.getBlob("DATA");
変数 blob には、BLOB 値への論理ポインタが含まれます。この BLOB 値は、結果セット rs の最初の行の DATA 列に格納されます。BLOB 値にはデータが含まれませんが、JDBC メソッドに関しては、含まれているかのように操作されます。
プログラマは、Blob オブジェクト上で、そのオブジェクトで指定した SQL BLOB 上で操作しているかのように、JDBC API 内のメソッドを呼び出すことができます。ただし、Blob オブジェクトを Java プログラミング言語内のオブジェクトと同じように操作する場合は、先にクライアント上で具体化する必要があります。Blob インタフェースには、Blob オブジェクトを具体化する 2 つのメソッドがあります。入力ストリームとして BLOB 値を具体化する getBinaryStream と、BLOB 値のすべてまたは一部をバイト配列として具体化する getBytes です。次のコードでは、blob で指定した BLOB 値のすべてのデータを入力ストリームとして具体化します。
java.io.InputStream in = blob.getBinaryStream();
byte b;
while ((in.read()) > -1) {
b = in.read();
System.out.println(b);
}
// prints out all the bytes in the BLOB value that blob designates
次のコードも blob で指定した BLOB 値のすべてのデータを具体化しますが、入力ストリームでなく、バイト配列として具体化します。
long len = blob.length();
byte [] data = blob.getBytes(1, len);
for (int i = 0; i < len; i++) {
byte b = data[i];
System.out.println(b);
}
// prints out all the bytes in the BLOB value that blob designates
data 変数には、blob が指定した BLOB 値内のすべてのバイトのコピーが含まれます。これは、getBytes メソッドに渡された引数が BLOB 値全体を指定するためです。最初の引数は最初のバイトで始まるバイトを返すことを指定し、2 番目の引数は、BLOB 値の長さのバイト数を返すことを指定します。次のコード行では、256 番目のバイトから始まる 1024 バイトが具体化されます。
byte [] data = blob.getBytes(256, 1024); byte b = data[0]; // data contains bytes 256 through 1280 in the BLOB value that blob // designates; b contains the 256th byte
ここで留意する必要のある重要な点は、SQL と Java プログラミング言語の相違により、SQL では BLOB 値の最初のバイトがポジション 1 にあるのに対し、Java プログラミング言語では配列の最初の要素が添え字 0 にあることです。
Blob オブジェクトをデータベースに格納するには、Blob オブジェクトを、PreparedStatement メソッドの setBlob にパラメータとして渡します。たとえば次のコード例では、PreparedStatement オブジェクトの pstmt への最初の入力パラメータとして渡すことで、Blob オブジェクトの stats が格納されます。
Blob stats = rs.getBlob("STATS");
PreparedStatement pstmt = con.prepareStatement(
"UPDATE SIGHTINGS SET MEAS = ?WHERE AREA = 'NE'");
pstmt.setBlob(1, stats);
pstmt.executeUpdate();
stats が指定する BLOB 値は、SIGHTINGS テーブル内で、AREA 列に NE が含まれている行の MEAS 列に格納されます。
package java.sql;
public interface Blob {
long length() throws SQLException;
InputStream getBinaryStream() throws SQLException;
byte[] getBytes(long pos, int length) throws SQLException;
long position(byte [] pattern, long start) throws SQLException;
long position(Blob pattern, long start) throws SQLException;
}
InputStream getBinaryStream() throws SQLException
このBlobオブジェクトによって解釈されていないバイトのストリームとして指定されるBLOB値を具体化します。戻り値:
この
Blobオブジェクトによって指定されるBLOB値のデータが格納されたInputStreamオブジェクトInputStream in = blob.getBinaryStream(); // in has the data in the BLOB value that blob designates
byte[] getBytes(long pos, int length) throws SQLException
このBlobオブジェクトがバイトの配列として指定するBLOB値の一部またはすべてを具体化します。バイト配列には、posの位置から始まる最大lengthの連続したバイトが含まれます。パラメータ:
pos 抽出される最初の byteのBLOB値の番号付けされた位置で、最初のbyteは1の位置length コピーされる連続したバイト数 戻り値:
この
Blobオブジェクトによって示されるBLOB値のposの位置にあるバイトから始めて、最大lengthまでの連続したバイトで構成されるバイト配列byte [] part = blob.getBytes(5, 100); // part contains the fifth through 104th bytes, inclusive, as an // array of bytes
long length() throws SQLException
このBlobオブジェクトによって指定されるBLOB値内にあるバイトの数を返します。この
Blobオブジェクトによって指定されるBLOB値の長さのバイトBlob blob = rs.getBlob(2); long len = blob.length(); // len contains the number of bytes in the BLOB value designated by // blob (the BLOB value in the second column of the current row of the // ResultSet object rs)
long position(byte [] pattern, long start) throws SQLException
このBlobオブジェクトによって指定されるBLOB値内で、byte配列のpatternが始まる位置を決定します。patternの検索はstartの位置から始まります。パラメータ:
pattern 検索対象の byteの配列start BLOB値内で検索を始める位置。最初のbyteの位置は 1
byte配列のpatternが始まるBLOB値内の位置。startの位置で検索を始め、成功した場合はstart以上の値、それ以外の場合は -1 が返されます。byte [] part = blob.getBytes(5, 100); long beginning = blob.position(part, 1024); // if part is contained in the BLOB value that blob designates, from // position 1024 on, beginning will contain the position at which // part begins
long position(Blob pattern, long start) throws SQLException
このBlobオブジェクトによって指定されるBLOB値内でpatternが始まるbyteの位置を決定します。検索は、startの位置から始まります。
pattern 検索対象の BLOB値を指定するBlobオブジェクトstart BLOB値内で検索を始める位置。最初のbyteの位置は 1
Blobオブジェクトのpatternが始まる位置。startの位置で検索を始め、成功した場合はstart以上の値、それ以外の場合は -1 が返されます。Blob blob2 = rs.getBlob(4); long beginning = blob1.position(blob2, 512); // if the BLOB value designated by blob2 is contained in the BLOB // value designated by blob1, starting at position 512 or later, // beginning will contain the position at which the BLOB value // designated by blob2 begins