概要
Data Access Object (Dao) はデータベースアクセスのためのインタフェースです。
このページで説明するアノテーションはすべて org.seasar.doma
パッケージに属します。
Dao定義
Daoは @Dao
が注釈されたインタフェースとして定義します。
インタフェースはトップレベルのインタフェースでなければいけません(他のクラスやインタフェースにネストされていてはいけません)。
インタフェースの実装クラスはaptによりコンパイル時に自動生成されます。
@Dao(config = AppConfig.class) public interface EmployeeDao { ... }
@Dao
の config
要素には、
org.seasar.doma.jdbc.Config
の実装クラスを指定しなければいけません。
Config
の実装クラスは、データソース、データベースの方言、ネーミング規約等の設定を行います。
クエリメソッド定義
SQLを問い合わせるクエリメソッドには、アノテーションが必須です。
検索
検索を行うには、 @Select
を注釈します。
検索条件のパラメータとして、基本型、ドメインクラス、エンティティクラスを任意の数だけ宣言できます。
また、IN句で複数のバインド変数に使用できるように、基本型やドメインクラスを要素とするjava.util.List
型のパラメータも宣言できます。
ページングや悲観的排他制御を可能とするには、
org.seasar.doma.jdbc.SelectOptions
型のパラメータを宣言してください。
大量件数を1件ずつ処理するには、@Select
の iterate
要素に true
を設定し、
org.seasar.doma.jdbc.IterationCallback
型のパラメータを宣言してください。
検索についてはSQLの自動生成機能はありません。 メソッドに対応するSQLファイルが必須です。
バッチ更新
バッチ更新を行うには、 @BatchUpdate
を注釈します。
sqlFile
要素により、SQLの自動生成を使用するかSQLファイルを使用するか選択できます。
デフォルトではSQLの自動生成が実行されます。
バッチ削除
バッチ削除を行うには、 @BatchDelete
を注釈します。
sqlFile
要素により、SQLの自動生成を使用するかSQLファイルを使用するか選択できます。
デフォルトではSQLの自動生成が実行されます。
ファクトリ
JDBC4.0の java.sql.Connection
が提供するファクトリメソッドを呼び出すには
@ArrayFactory
、
@BlobFactory
、
@ClobFactory
、
@NClobFactory
、
を注釈します。
デリゲート定義
DAOは、インタフェースであるためロジックをもつことができません。
しかし、 @Delegate
を注釈することで別のクラスに処理を委譲(デリゲート)できます。
JDBCを直接使った処理を行いたい場合に使用するといいでしょう。
@Dao(config = AppConfig.class) public interface EmployeeDao { @Delegate(to = EmployeeDaoDelegate.class) int execute(Employee employee); }
public class EmployeeDaoDelegate { private Config config; public EmployeeDaoDelegate(Config config) { this.config = config; } public int execute(Employee employee) { DataSource dataSource = config.dataSource(); ... } }
@Delegate
の to
要素には、委譲先のクラスを指定します。
委譲先のクラスは次の制約を満たす必要があります。
org.seasar.doma.jdbc.Config
を受け取るpublicなコンストラクタを持つ- 委譲元のメソッドと同じシグニチャのメソッドを持つ
Daoの利用方法
コンパイルすると、aptにより実装クラスが生成されます。 実装クラスをインスタンス化して使用してください。
EmployeeDao employeeDao = new EmployeeDaoImpl(); Employee employee = employeeDao.selectById(1);
デフォルトでは、実装クラスの名前はインタフェースの名前にImpl
をサフィックスしたものになります。
パッケージやサフィックスを変更するには、アノテーション処理を参照してください。
デフォルトコンストラクタを使用した場合は、@Dao
の config
要素に
指定した設定によりDataSource
が決定しますが、
特定の DataSource
を指定してインスタンス化することも可能です。
DataSource dataSource = ...; EmployeeDao employeeDao = new EmployeeDaoImpl(dataSource); Employee employee = employeeDao.selectById(1);
Daoインタフェースはエンティティクラスと1対1で結びついているわけではありません。 ひとつのDaoインタフェースで複数のエンティティクラスを扱えます。
@Dao public interface MyDao { @Select Employee selectEmployee(); @Select Departmen selectDepartment(); @Update Departmen updateAddress(Address address); }