OracleデータベースのBLOB型のカラムにJavaオブジェクトを保存する方法。
サンプルコード
データベース定義
SQL> desc blob_test
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL CHAR(5)
OBJECT_DATA BLOB
データベースへの保存方法
// DBへ保存するオブジェクトを生成
// DBへ保存するオブジェクトは直列化可能でなければならない。
// (Serializableをimplementsする必要がある)
HogeInfo info = new HogeInfo();
info.setId("ID");
info.setName("なまえ");
// 上記で生成したオブジェクトを直列化し、OutputStreamへ書き出す。
// この例だと、ByteArrayOutputStreamに出力をしている。
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream stream = new ObjectOutputStream(out);
stream.writeObject(info);
PreparedStatement preparedStatement = con.prepareStatement(
"insert into blob_test (id, OBJECT_DATA) values (?, ?)");
try {
preparedStatement.setString(1, "00001");
// ByteArrayOutputStreamに出力したオブジェクトの情報を、byte配列で取得し
// BLOBカラムにバインドする。
preparedStatement.setBytes(2, out.toByteArray());
preparedStatement.executeUpdate();
} finally {
preparedStatement.close();
}
データベースからの取得方法
PreparedStatement preparedStatement = connection.prepareStatement(
"select object_data from blob_test where id = '00001'");
byte[] bytes;
try {
ResultSet resultSet = preparedStatement.executeQuery();
resultSet.next();
// BLOBカラムの値をbyte配列で取得
bytes = resultSet.getBytes(1);
} finally {
preparedStatement.close();
}
// 取得したオブジェクトをObjectInputStreamを使ってデシリアライズする。
ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(bytes));
HogeInfo hogeInfo = (HogeInfo) objectInputStream.readObject();
// デシリアライズしたオブジェクトの属性を出力
System.out.println("hogeInfo.getId() = " + hogeInfo.getId());
System.out.println("hogeInfo.getName() = " + hogeInfo.getName());
実行結果
保存したオブジェクトの属性が、復元できていることが分かる。
hogeInfo.getId() = ID
hogeInfo.getName() = なまえ