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」テーブルにある画像データを表示するウィンドウプログラム。
- 製品番号を指定すると、それに対応する画像データがウィンドウに表示されるようにする事。