ibatisでクラスをシリアライズ化してDBに格納
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();
}
}
}