Spring Boot/Doma/DAO

Spring Boot/Doma/DAO

乱暴に言うとSQLを投げて Entity にマッピングされたインスタンスを返すメソッド群を持つあれである。

作り方

このように作る。

@ConfigAutowireable
@Dao
public interface CustomerDao{
    @Select
    List<Customer> findByName(String name);
 
}

見ての通り DAO は本体そのものではなくインターフェースである。 当然実装が無いわけだが、この実装部分は Doma が自動で作ってくれるという仕掛けのようだ。

このインターフェースのシグネチャが定義を表していて、実装は SQL で全部書けという話である。 戻り値の型でマッピング対象の Entity を特定し、その名前を基準にマッピングする。 引数の名前を SQL の中にコメントで書き込むことでSQLへのパラメータも実現する。

この自動実装の実体は .apt_generated というディレクトリ配下に自動生成される

このメソッドに実装部分の情報を加える必要があるので、このパッケージ階層と対応したこのような位置に 対応するメソッドと同じ名前の SQL ファイルを作り、そこにSQLを書く

src/main/resources/META-INF/hoge/piyo/fuga/CustomerDao/findByName.sql
SELECT
    id,
    name,
    age
FROM
    customer
WHERE
    name = /* name */'hoge'
ORDER BY
    id;

となります。

使い方

アノテーションで ConfigAutowireable しておくと、自動で作られる実装部分が、Spring の管理下に入るので、あとは同様に

このようにインジェクションしてあげればよい

@RestController
public class HelloHoge {
    private final CustomerDao customerDao;
 
    public HelloHoge(CustomerDao customerDao) {
        this.customerDao = customerDao;
    }
 
}

そうすれば内部では好きに使えるようになる。

    @RequestMapping("/")
    public String index() {
        List<Customer> cList = this.customerDao.selectAll();
        return cList.toString();
    }

未指定のフィールドがあってもよいようにする

本来は SQL 側で指定したフィールドが受けの Entity に全部存在する必要があるが、 無いやつは無いで受けずにそのまま先に進めるという設定がある。

ensureResultMapping を false にする。

@Select(ensureResultMapping = false)

こいつはデフォルトで true になっている。 true の場合はマッピングできないフィールドがあると例外が発生して停止する。

java/spring/spring_boot/doma/dao.txt · 最終更新: 2018-12-04 00:30 by ore