2011年9月4日日曜日

OracleのBLOBにJavaオブジェクトを保存

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() = なまえ