Doma 0.9.7の新機能紹介

今日リリースした、Doma 0.9.7の紹介です。

Eclipseプラグイン - Doma Tools

機能は少なめですが、便利な機能を提供しています。

一番便利なのは、SQLファイルを変更すると対応するDaoクラスが自動ビルドされる機能です。これまでは、SQLファイルを修正したら対応するDaoを明示的にビルドする必要がありました(aptがDaoクラスのビルドからでないと実行されないため)が、もう気にしなくて大丈夫。

Daoのメソッドと対応するSQLファイルの間はWindowsだと「Ctl + Alt + 0」で行ったり来たりできます。で、SQLファイルがなかったらウィザードが開いてSQLファイルを作れます。

注意点ですが、domaのjarはプラグインとは別途セットアップして使ってください。Daoクラスは@Daoが注釈されていないと、プラグインの機能が反応しないので気をつけてください。
将来的には、SQLファイルのウィザードによる自動生成時にその場でSQL(の雛形)も一緒に生成してしまおうと思います。

DIコンテナとの連携

Daoの実装クラスはaptにより自動生成されますが、任意のアノテーションをつけられるようにすることでDIコンテナと連携しやすくなりました。ドキュメントでは、google-guiceを使う場合の例を載せておきました。同様にして、Springを使う場合は@Repositoryや@AutowiredとかSeasarの場合は@Componentとかもつけられます。

Enum対応

@Entity
public class Employee {

   JobType jobType;

   ...

   public enum JobType {
     SALESMAN,
     CLERK
   }
}
@Dao(config = AppConfig.class)
public interface EmployeeDao {
   List<Employee> selectByJobType(JobType jobType);

   List<JobType> selectAllJobType();
}

Enum.name()で返される文字列を利用して検索、更新できます。

@OriginalStatesの導入

変更されたプロパティだけをUPDATE文のSET句に含めるための仕組みです。@OriginalStatesが注釈されたフィールドには、Daoから検索した時点の情報が保存されます。もちろん、この値自体は永続化されません。

@Entity
public class Employee {

   @Id
   Integer id;

   String name;

   Integer age;

   @OriginalStates
   Serializable originalStates;

   ...
}

で、エンティティを普通に取得して普通に更新するだけ。

EmployeeDao dao = new EmployeeDaoImpl();
Employee employee =dao.selectById(1);
emoloyee.setAge(employee.getAge() + 1);
dao.update(employee);

UPDATE文では、AGEカラムだけがSET句に含まれます。注意点としては、自分でエンティティをnewした場合は、すべてのプロパティがSET句に含まれるということです。あと、GWTで使えないもちょっと残念。

でも、S2DaoのModifiedOnlyと違って、

  1. getter/setterなしでも使える
  2. コードをまちがえにくい

という点がポイントです。

@OriginalStatesはかんぜんにオプション機能なので、必要でなければ使わなくても大丈夫です。