最近、Railsの勉強会に参加したりして、ActiveRecordって便利だなぁーなんて思っていたんですが、そういえばJavaにも似たようなライブラリがあったっけ。ということでActiveObjectsをちょっと調べてみました。
どんなものかというと、オブジェクトを操作するかのようにRDBを使ってくれるうれしいライブラリです。SQLは記述しません。まずはサンプルとして、主キー指定した検索。
EntityManager manager = new EntityManager(
"jdbc:hsqldb:hsql://localhost/", "sa", "");
Emp aEmp = manager.get(Emp.class, 7499);
処理はこれだけ。Empというクラスは実はインターフェースです。これは用意しておかなければならない。
public interface Emp extends Entity{
@PrimaryKey
public int getEmpno();
public void setEmpno(int n);
public String getEname();
public void setEname(String s);
}
このインターフェースの実装クラスはどこにあるのかというと、ActiveObjectsが自動的にプロキシを生成してくれるので自分で作る必要はないです(自作することも可能)。SQLも書く必要はなくインターフェース名がテーブル名、アクセッサメソッド名が列名のように使用されてSQLが生成される。あとはアノテーションで付加情報を与える。
全件検索
for (Emp emp : manager.find(Emp.class)){ //findはEmp[]を返す
System.out.println(emp.getEmpno() + ":" + emp.getEname());
}
Genericsが使えるので、Emp[]が返却されるのが便利。
更新
Emp aEmp = manager.get(Emp.class, 7499);
aEmp.setEname(aEmp.getEname() + "_HOGE");
aEmp.save();
オブジェクトを取得して中身を変更後、saveメソッドでUpdateメソッドが発行される。
おもしろいなぁ。
ActiveObjectsは(大部分の他のORMと同じように)代理キーを使うことを前提としている。でも私の業務でのことを考えると、DBの主キーはほとんどの場合自然キーで、代理キーを主キーに使っているケースはあまりない。代理キーを使うべきなのは分かっているんだけど、既存システムでDBが出来上がっているとどうにもならないから致し方ない。そんな理由で私の業務的にはちょっと採用しにくい。そういうケースではやはりiBATISのほうがしっくりくるなぁ。
参考サイト