4.2. BLOBの読み込み
BLOBを読み込むには次のようにします。ResultSetの「getBinaryStream」メソッドを使用します。
connection.setAutoCommit(false);
Statement statement=connection.createStatement();
String sql="select photo from product_photo where p_num=104";
ResultSet result=statement.executeQuery(sql);
result.first();
InputStream input=result.getBinaryStream(1);
FileOutputStream output=new FileOutputStream("/tmp/photo.jpg");
int c;
while((c=input.read())!=-1){
output.write(c);
}
input.close();
output.close();
connection.commit();
8行目ResultSetのgetBinaryStreamメソッドで、BLOBデータを読み込むための入力ストリームを開きます。読み込む際にも、AutoCommitモードをオフにしなければならない(1行目)事に注意してください。これもPostgreSQLのJDBCドライバの制約です。
Javaでは「java.sql.Blob」インタフェースを用いて、BLOBを扱える仕様となっています。しかしPostgreSQLではsetBinaryStream, getBinaryStreamを利用する方法とBlobを利用する方法とでは違いがあります。前者はbytea型を対象に操作を行うのに対し、後者はoid型を対象に操作を行います。oid型を対象に操作を行いたい場合には、Blobを使用するようにして下さい。ただPostgreSQLのJDBCドライバでは、setBytes, setBinaryStreamなど値を設定するためのBlobのメソッドが未実装という問題があります。ですから、どうしてもoid型を使用したいという場合には、PostgreSQLのJDBCドライバが独自に提供しているクラス「org.postgresql.largeobject.LargeObjectManager」を使用するようにして下さい。これに関する説明は、省略します。
(実習課題2)
以下のプログラムを作成しなさい。
- 「product_photo」テーブルにある画像データを表示するウィンドウプログラム。
- 製品番号を指定すると、それに対応する画像データがウィンドウに表示されるようにする事。

