Data Access Object (Dao) はデータベースアクセスのためのインタフェースです。
このページで説明するアノテーションはすべて org.seasar.doma パッケージに属します。
Daoは @Daoが注釈されたインタフェースとして定義します。
インタフェースはトップレベルのインタフェースでなければいけません(他のクラスやインタフェースにネストされていてはいけません)。
インタフェースの実装クラスはaptによりコンパイル時に自動生成されます。
@Daoの config要素には、
org.seasar.doma.jdbc.Configの実装クラスを指定しなければいけません。
Configの実装クラスは、データソース、データベースの方言、ネーミング規約等の設定を行います。
SQLを問い合わせるクエリメソッドには、アノテーションが必須です。 詳細は、クエリを参照してください。
Daoは、インタフェースであるためロジックをもつことができません。
しかし、 @Delegateを注釈することで別のクラスに処理を委譲(デリゲート)できます。
この機能は、JDBCのAPIやビルダのAPIを使ってSQLをプログラムで組み立てたい場合に使用するとよいでしょう。
@Delegate の to要素には、委譲先のクラスを指定します。
委譲先のクラスのpublicなコンストラクタでは、org.seasar.doma.jdbc.Configを受け取るようにします。
委譲先で委譲元のDaoインスタンスにアクセスしたい場合は、publicなコンストラクタの2番目のパラメータで委譲元のDaoの型を受け取るようにします。
委譲先のクラスは次の制約を満たす必要があります。
org.seasar.doma.jdbc.Configを受け取るpublicなコンストラクタを持つ、もしくは、org.seasar.doma.jdbc.Configと委譲元のDaoを受け取るpublicなコンストラクタを持つ
org.seasar.doma.jdbc.builderパッケージでは、プログラムでSQLを組み立てるためのビルダクラスを提供しています。
何らかの理由によりクエリ定義を利用した問い合わせが難しい場合にのみ、これらのビルダクラスを利用することを推奨します。
また、ビルダクラスはデリゲート定義と組み合わせて使用することを推奨します。
検索には、SelectBuilderクラスを使用します。
このクラスのインスタンスは、org.seasar.doma.jdbc.Config型の引数をとるstaticなnewInstanceメソッドで生成できます。
インスタンスには、sqlメソッドでSQL文字列の断片を、paramメソッドでパラメータの型とパラメータを渡せます。
利用例は次のとおりです。
組み立てたSQLの実行結果は、getSingleResult、getResultList、iterateのメソッドで処理できます。
それぞれ、1件を処理したい場合、複数件を処理したい場合、複数件を1件ずつ処理したい場合に使用します。
挿入には、InsertBuilderクラスを使用します。
このクラスのインスタンスは、org.seasar.doma.jdbc.Config型の引数をとるstaticなnewInstanceメソッドで生成できます。
インスタンスには、sqlメソッドでSQL文字列の断片を、paramメソッドでパラメータの型とパラメータを渡せます。
組み立てたSQLはexecuteメソッドで実行できます。
更新には、UpdateBuilderクラスを使用します。
このクラスのインスタンスは、org.seasar.doma.jdbc.Config型の引数をとるstaticなnewInstanceメソッドで生成できます。
インスタンスには、sqlメソッドでSQL文字列の断片を、paramメソッドでパラメータの型とパラメータを渡せます。
組み立てたSQLはexecuteメソッドで実行できます。
削除には、DeleteBuilderクラスを使用します。
このクラスのインスタンスは、org.seasar.doma.jdbc.Config型の引数をとるstaticなnewInstanceメソッドで生成できます。
インスタンスには、sqlメソッドでSQL文字列の断片を、paramメソッドでパラメータの型とパラメータを渡せます。
組み立てたSQLはexecuteメソッドで実行できます。
コンパイルすると、aptにより実装クラスが生成されます。 実装クラスをインスタンス化して使用してください。 ただし、設定クラスをDIコンテナで管理する場合は、Daoのインスタンス化はアプリケーションのコードで行わずDIコンテナで制御してください。
デフォルトでは、実装クラスの名前はインタフェースの名前にImplをサフィックスしたものになります。
パッケージやサフィックスを変更するには、アノテーション処理を参照してください。
デフォルトコンストラクタを使用した場合は、@Daoの config要素に
指定した設定によりjavax.sql.DataSourceが決定されますが、
特定の DataSourceを指定してインスタンス化することも可能です。
また、同様にjava.sql.Connectionを指定してインスタンス化することも可能です。
DataSourceやConnectionをコンストラクタに指定してインスタンス化する方法は、
JDBCを直接利用した既存のアプリケーションで利用するのに適しています。
Daoインタフェースはエンティティクラスと1対1で結びついているわけではありません。 ひとつのDaoインタフェースで複数のエンティティクラスを扱えます。