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を問い合わせるクエリメソッドには、アノテーションが必須です。 詳細は、クエリを参照してください。

デリゲート定義

Daoは、インタフェースであるためロジックをもつことができません。 しかし、 @Delegateを注釈することで別のクラスに処理を委譲(デリゲート)できます。 JDBCを直接使った処理を行いたい場合に使用するといいでしょう。

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

    @Delegate(to = EmployeeDaoDelegate.class)
    int execute(Employee employee);
}

@Delegateto要素には、委譲先のクラスを指定します。 委譲先のクラスのpublicなコンストラクタでは、org.seasar.doma.jdbc.Configを受け取るようにします。

public class EmployeeDaoDelegate {

    private Config config;
    
    public EmployeeDaoDelegate(Config config) {
        this.config = config;
    }

    public int execute(Employee employee) {
        DataSource dataSource = config.dataSource();
        ...
    }
}

委譲先で委譲元のDaoインスタンスにアクセスしたい場合は、publicなコンストラクタの2番目のパラメータで委譲元のDaoの型を受け取るようにします。

public class EmployeeDaoDelegate {

    private Config config;
    
    private EmployeeDao employeeDao;
    
    public EmployeeDaoDelegate(Config config, EmployeeDao employeeDao) {
        this.config = config;
        this.employeeDao = employeeDao;
    }

    public int execute(Employee employee) {
        ...
    }
}

委譲先のクラスは次の制約を満たす必要があります。

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

Daoの利用方法

コンパイルすると、aptにより実装クラスが生成されます。 実装クラスをインスタンス化して使用してください。 ただし、設定クラスをDIコンテナで管理する場合は、Daoのインスタンス化はアプリケーションのコードで行わずDIコンテナで制御してください。

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

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

デフォルトコンストラクタを使用した場合は、@Daoconfig要素に 指定した設定によりjavax.sql.DataSourceが決定されますが、 特定の DataSourceを指定してインスタンス化することも可能です。

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

また、同様にjava.sql.Connectionを指定してインスタンス化することも可能です。

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

DataSourceConnectionをコンストラクタに指定してインスタンス化する方法は、 JDBCを直接利用した既存のアプリケーションで利用するのに適しています。

Daoインタフェースはエンティティクラスと1対1で結びついているわけではありません。 ひとつのDaoインタフェースで複数のエンティティクラスを扱えます。

@Dao(config = AppConfig.class)
public interface MyDao {
    @Select
    Employee selectEmployeeById(int id);
    @Select
    Department selectDepartmentByName(String name);
    @Update
    int updateAddress(Address address);
}