Blob

8.1 Blob の概要

Blob オブジェクトとは、SQL の BLOB (2 進ラージオブジェクト) を Java プログラミング言語にマッピングした表現形式です。 SQL の BLOB は、2 進ラージオブジェクトをデータベーステーブルの行内に列の値として格納する組み込みの型です。 プログラマは、ResultSetCallableStatement、および PreparedStatement インタフェース内のメソッドを使用して、SQL92 の組み込み型にアクセスするのと同じように SQL3 型 BLOB へアクセスできます。 つまり、JDBC 2.0 API を使用するアプリケーションでは、BLOB 値に対する getBlob および setBlob などのメソッドが、INTEGER 値に対する getInt および setIntCHAR 値または VARCHAR 値に対する getString および setString と同じように使用されます。

標準的な実装の場合、JDBC ドライバは、裏で SQL の LOCATOR(BLOB) 型を使用して Blob インタフェースを実装します。 LOCATOR(BLOB) によってデータベースサーバ上の SQL の BLOB 値が指定され、ロケータ上の操作によって得られる結果は、BLOB 値自体での操作と同じです。 つまり、クライアントマシン上で BLOB データを生成しなくても Blob インスタンス上で操作が可能なので、クライアントマシンのパフォーマンスが著しく向上します。 LOCATOR(BLOB) は、ドライバによって裏で使用されるため、プログラマは JDBC ドライバを完全に透過的に使用します。

Blob インスタンスの標準的な動作は、このインスタンスが作成されたトランザクションが、確定または元に戻るまで有効です。

Blob インタフェースには、SQL の BLOB 値の長さを取得するメソッドや、クライアント上で BLOB 値を生成するメソッド、および BLOB 値内のバイトのパターンの位置を判断するメソッドが用意されています。

8.1.1 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 メソッドに関しては、含まれているように操作されます。

8.1.2 Blob データの具体化

プログラマは、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 にあることです。

8.1.3 Blob オブジェクトの格納

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 列に格納されます。

8.2 Blob インタフェースの定義

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;
}

8.3 Blob のメソッド

InputStream getBinaryStream() throws SQLException
この Blob オブジェクトによって解釈されていないバイトのストリームとして指定される BLOB 値を具体化します。

戻り値:

この Blob オブジェクトによって指定される BLOB 値のデータが格納された InputStream オブジェクト

例:

InputStream in = blob.getBinaryStream();
// in has the data in the BLOB value that blob designates

getBytes

byte[] getBytes(long pos, int length) throws SQLException

この Blob オブジェクトがバイトの配列として指定する BLOB 値の一部またはすべてを具体化します。 バイト配列には、pos の位置から始まる最大 length の連続したバイトが含まれます。

パラメータ:

pos 抽出される最初の byteBLOB 値の番号付けされた位置で、最初の byte1 の位置
length コピーされる連続したバイト数

戻り値:

この Blob オブジェクトによって示される BLOB 値の pos の位置にあるバイトから始めて、最大 length までの連続したバイトで構成されるバイト配列

例:

byte [] part = blob.getBytes(5, 100);
// part contains the fifth through 104th bytes, inclusive, as an
// array of bytes

length

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)

position

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

position

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


Copyright © 2000, 2001 Sun Microsystems, Inc. All rights reserved.