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