目次へ

4. ラージオブジェクト

4.1. BLOBの書き込み

ラージオブジェクトは通常のデータ型では扱えないような、大きなデータを格納するための型です。画像などのバイナリデータを格納する「BLOB(binary large object)」と、テキストを格納する「CLOB(character large object)」の2種類がSQL99で規定されています。これについては、PostgreSQLを含め既に多くのデータベースでサポートされています。PostgreSQLでは以下のようにして、ラージオブジェクトを使用するテーブルを定義します。

create table product_photo(p_num int references product(p_num) primary key,
                           p_photo bytea);

プログラムでBLOBオブジェクトをデータベースに格納するには次のようにします。「PreparedStatement」の「setBinaryStream」メソッドを使用します。

 connection.setAutoCommit(false);
  
 String sql="insert into product_photo values(?,?)";
 PreparedStatement statement=connection.prepareStatement(sql);
   
 statement.setInt(1,104);
 File file=new File("/tmp/myphoto.jpg");
 FileInputStream input=new FileInputStream(file);
 statement.setBinaryStream(2,input,(int)file.length());
statement.executeUpdate();
connection.commit();

9行目で「setBinaryStream」メソッドを呼び出しています。これまでの「set???」メソッドと異なり、3つ目の引数に格納するバイナリデータのサイズを指定します。最後に「executeUpdate」メソッドを呼び出しデータを格納しますが、注意点として必ずAutoCommitモードをオフにしなければなりません(1行目)。これはPostgreSQLのJDBCドライバの制約です。

実はPostgreSQLには、BLOB, CLOBを取り扱う方法として、oidデータ型も提供されています。oid型はオブジェクトの識別子を管理するデータ型で、実際のデータは他に保存します。bytea型は1ギガまでのデータしか扱えないという制約もあるのですが、ほとんどの場合、それで十分ですのでこちらのデータ型を使用するようにして下さい。

(実習課題1)

以下のプログラムを作成しなさい。

  • 「product_photo」テーブルに画像ファイルを格納するコンソールプログラム。
  • プログラムの引数は、製品番号と画像ファイル名。
  • 格納されたデータが、指定したファイルのデータと同じである事を確認する事。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp