About

ドキュメント

プロジェクト文書

Built by Maven

概要

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

このページで説明するアノテーションはすべて org.seasar.doma パッケージに属します。

Dao定義

Daoは @Daoが注釈されたインタフェースとして定義します。 インタフェースはトップレベルのインタフェースでなければいけません(他のクラスやインタフェースにネストされていてはいけません)。 インタフェースの実装クラスはaptによりコンパイル時に自動生成されます。

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

@Daoconfig要素には、 org.seasar.doma.jdbc.Configの実装クラスを指定しなければいけません。 Configの実装クラスは、データソース、データベースの方言、ネーミング規約等の設定を行います。

クエリメソッド定義

SQLを問い合わせるクエリメソッドには、アノテーションが必須です。

検索

検索を行うには、 @Selectを注釈します。

検索条件のパラメータとして、基本型ドメインクラスエンティティクラスを任意の数だけ宣言できます。 また、IN句で複数のバインド変数に使用できるように、基本型やドメインクラスを要素とするjava.util.List型のパラメータも宣言できます。

ページングや悲観的排他制御を可能とするには、 org.seasar.doma.jdbc.SelectOptions型のパラメータを宣言してください。

大量件数を1件ずつ処理するには、@Selectiterate要素に trueを設定し、 org.seasar.doma.jdbc.IterationCallback型のパラメータを宣言してください。

検索についてはSQLの自動生成機能はありません。 メソッドに対応するSQLファイルが必須です。

挿入

挿入を行うには、 @Insertを注釈します。

sqlFile要素により、SQLの自動生成を使用するかSQLファイルを使用するか選択できます。 デフォルトではSQLの自動生成が実行されます。

更新

更新を行うには、@Updateを注釈します。

sqlFile要素により、SQLの自動生成を使用するかSQLファイルを使用するか選択できます。 デフォルトではSQLの自動生成が実行されます。

削除

削除を行うには、 @Deleteを注釈します。

SQLの自動生成を使用するかSQLファイルを使用するか選択できます。 デフォルトではSQLの自動生成が実行されます。

バッチ挿入

バッチ挿入を行うには、 @BatchInsertを注釈します。

SQLの自動生成を使用するかSQLファイルを使用するか選択できます。 デフォルトではSQLの自動生成が実行されます。

バッチ更新

バッチ更新を行うには、 @BatchUpdateを注釈します。

sqlFile要素により、SQLの自動生成を使用するかSQLファイルを使用するか選択できます。 デフォルトではSQLの自動生成が実行されます。

バッチ削除

バッチ削除を行うには、 @BatchDeleteを注釈します。

sqlFile要素により、SQLの自動生成を使用するかSQLファイルを使用するか選択できます。 デフォルトではSQLの自動生成が実行されます。

ストアドファンクション

ストアドファンクションを呼び出すには、 @Functionを注釈します。

SQLの自動生成機能のみがサポートされています。 SQLファイルにマッピングはできません。

ストアドプロシージャー

ストアドプロシージャーを呼び出すには、 @Procedureを注釈します。

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();
        ...
    }
}

@Delegateto要素には、委譲先のクラスを指定します。 委譲先のクラスは次の制約を満たす必要があります。

  • org.seasar.doma.jdbc.Configを受け取るpublicなコンストラクタを持つ
  • 委譲元のメソッドと同じシグニチャのメソッドを持つ

Daoの利用方法

コンパイルすると、aptにより実装クラスが生成されます。 実装クラスをインスタンス化して使用してください。

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

デフォルトでは、実装クラスの名前はインタフェースの名前にImplをサフィックスしたものになります。 パッケージやサフィックスを変更するには、アノテーション処理を参照してください。

デフォルトコンストラクタを使用した場合は、@Daoconfig要素に 指定した設定により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);
}