2007/6/25 月曜日

ibatisでクラスをシリアライズ化してDBに格納

このエントリをはてなブックマークに追加ibatisс鴻激≪ゃ阪DB主のはてなブックマーク被リンク数
Filed under: mysql, ibatis — akky @ 17:00:04

javaのクラスをシリアライズ化してMySQLのDBへ読み書きする方法

やり方

 ・DBにBLOB列を追加
 ・DTOにByte[]なシリアライズ化したオブジェクトを入れるフィールドを追加
 ・DTOにシリアライズ、デシリアライズのメソッドを追加

環境

 MySQL 5.0.41
java 1.5.03
ibatis ibatis-2.3.0677.jar,ibatis-dao-2.jar

テーブルの定義

mysql> desc WORD;
+-------------------+------------------+------+-----+---------+----------------+
| Field             | Type             | Null | Key | Default | Extra          |
+-------------------+------------------+------+-----+---------+----------------+
| WORD_ID           | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| WORD              | varchar(128)     | NO   |     |         |                |
| SERIALIZED_OBJECT | blob             | YES  |     | NULL    |                |
+-------------------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql>

DTO

ByteArray(Output|Input)Streamを使ってシリアライズ化(する|した)オブジェクトを読み書きする関係する部分だけを抜粋

    private byte[] serializedObject;
    /**
     * 指定されたインスタンスをシリアライズ化してINSERTorUPDATEを行なう準備をする
     * @param o シリアライズ化するクラスのインスタンス
     * @throws IOException 基本となる OutputStream が例外をスローした場合
     */
    public void setToSerialize(hogeClass o ) throws IOException{
      ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
      ObjectOutputStream objectOut = new ObjectOutputStream(byteStream);
      objectOut.writeObject(o);
      objectOut.close();
      this.serializedObject = byteStream.toByteArray();
    }
    /**
     * シリアライズ化されたオブジェクトをインスタンスに戻す。
     * @return デシリアライズしたオブジェクト
     * @throws IOException 基本となる OutputStream が例外をスローした場合
     * @throws ClassNotFoundException 基本となる OutputStream が例外をスローした場合
     */
    public hogeClass getDeSerialize() throws IOException, ClassNotFoundException{
      ObjectInputStream objectIn = new ObjectInputStream(new ByteArrayInputStream(this.serializedObject));
      hogeClass result = (hogeClass)objectIn.readObject();
      objectIn.close();
      return result;
    }

アプリ側

import java.io.IOException;
import java.io.Reader;
import java.io.Serializable;
import java.util.Iterator;
import com.ibatis.common.resources.Resources;
import com.ibatis.dao.client.DaoManager;
import com.ibatis.dao.client.DaoManagerBuilder;
public class SerialyzeTest  {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO 自動生成されたメソッド・スタブ
        Reader reader;
    try {
      classHoge t = new classHoge;
      t.addStartPosition(15);
      reader = Resources.getResourceAsReader("dao.xml");
          DaoManager daoManager =  DaoManagerBuilder.buildDaoManager(reader);
          Word out = new Word();
          WordDAO dao = (WordDAO) daoManager.getDao(WordDAO.class);
          dao.deleteByPrimaryKey(1);
          out.setWordId(1);
          out.setWord(t.getWord());
          out.setToSerialize(t);
          // 挿入実行
          dao.insert(out);
          // 挿入したレコードを検索してみる
          Word in = dao.selectByPrimaryKey(1);
          classHoge t2 = in.getDeSerialize();
          t2.methodFuga();
    } catch (Exception e) {
      // TODO 自動生成された catch ブロック
      e.printStackTrace();
    }
  }
}

コメント (0) »

この記事にはまだコメントがついていません。

コメント RSS

コメントをどうぞ