DAOインタフェース

Data Access Object (DAO) は、データベースにアクセスするためのインタフェースです。

DAO インタフェースの定義

DAO は @Dao アノテーションが付けられたインタフェースとして定義されます。

DAOインタフェースの実装クラスは、アノテーションプロセッサによってコンパイル時に生成されます。

クエリ定義

クエリ は、アノテーションを使用して定義できます。

Java コードでクエリを自由に構築したい場合は、デフォルトメソッドクエリビルダ を使用します。

デフォルトメソッド

デフォルトメソッドではJavaコードを自由に記述できます。

DAO インスタンスを引数として Config.get を呼び出すと、DAO インスタンスに関連付けられた Config インスタンスを取得できます。

@Dao
public interface EmployeeDao {

    default int count() {
        Config config = Config.get(this);
        SelectBuilder builder = SelectBuilder.newInstance(config);
        builder.sql("select count(*) from employee");
        return builder.getScalarSingleResult(int.class);
    }
}

DAOの実装クラスはインスタンス化して使用できます。ただし、Config が依存性注入コンテナで管理されている場合はDAOのインスタンス化も依存性注入コンテナに任せるのが良いでしょう。

EmployeeDao employeeDao = new EmployeeDaoImpl();
Employee employee = employeeDao.selectById(1);

デフォルトでは、DAOの実装クラス名はインタフェース名に接尾辞 Impl を付けたものになります。パッケージとサフィックスを変更するには、アノテーションプロセッシング を参照してください。

デフォルトのコンストラクタを使用する場合、 DataSource@Daoconfig 要素の設定によって決定されます。ただし、明示的に指定された DataSource でインスタンス化することはできます。

DataSource dataSource = ...;
EmployeeDao employeeDao = new EmployeeDaoImpl(dataSource);
Employee employee = employeeDao.selectById(1);

また、明示的に Connection を指定してインスタンス化することもできます。

Connection connection = ...;
EmployeeDao employeeDao = new EmployeeDaoImpl(connection);
Employee employee = employeeDao.selectById(1);

DAO インタフェースはエンティティクラスと1対1で定義する必要はありません。 1 つの DAO インタフェースで複数のエンティティクラスを扱えます。

@Dao
public interface MyDao {

    @Select
    Employee selectEmployeeById(int id);

    @Select
    Department selectDepartmentByName(String name);

    @Update
    int updateAddress(Address address);
}