menu
書いてる野郎
orebike@gmail.com
乱暴に言うと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 の場合はマッピングできないフィールドがあると例外が発生して停止する。