DAOインタフェース
Data Access Object (DAO) は、データベースにアクセスするためのインタフェースです。
DAO インタフェースの定義
DAO は @Dao
アノテーションが付けられたインタフェースとして定義されます。
DAOインタフェースの実装クラスは、アノテーションプロセッサによってコンパイル時に生成されます。
クエリ定義
クエリ は、アノテーションを使用して定義できます。
デフォルトメソッド
デフォルトメソッドでは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
は @Dao
の config
要素の設定によって決定されます。ただし、明示的に指定された 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);
}