1つのDaoで複数のエンティティを扱ったりジェネリックなDaoを利用したり

S2DaoはDaoとBean(エンティティ)の関係は基本的に1対1ですが、Domaでは1対nもokにしてます。

3つのテーブルしか扱わないとかだと、1つのDaoで十分かも。

@Dao(config = AppConfig.class)
public interface AppDao {

    @insert
    int insert(Employee employee);

    @insert
    int insert(Department department);

    @insert
    int insert(Address address);
    ...
}

ふつうは、1対1にすると思いますが、1対1に縛る理由もなかったのでこうしました。


Daoの作り方でお奨めなのはジェネリックなDaoを使うことです。ジェネリックなDaoは@GenericDaoを注釈してつくります。ジェネリックなDaoはエンティティを表す型パラメータを1つ受け取れます。

@GenericDao
public interface AppGenericDao<E> {

    @Insert
    int store(E e);

    @Update
    int modify(E e);

    @Delete
    int remove(E e);
    ...
}

最初、ジェネリックなDaoはフレームワーク側で提供しようと思いましたが、メソッドの名前を自由に決めたい人もいると思って、この方式にしました。この例では、名前をよくあるinsertやupdateではなくstoreとmodifyにしてみました。


個々のDaoはジェネリックなDaoを継承して作ります。

@Dao(config = AppConfig.class)
public interface EmployeeDao extends AppGenericDao<Employee> {

    @Select
    List<Employee> selectAll();

    ...
}

利用する側はこうなります。

Employee employee = new Employee_();
employee.id().set(1);
...
EmployeeDao dao = new EmployeeDao_();
dao.store(employee);

ジェネリックなDaoを使うと、Daoとエンティティを1対1にしたほうがわかりやすくなりますね。