menu
書いてる野郎
orebike@gmail.com
セットアップのやり方。結構迷ったので memo しておく。
Eclipse や STS でやる前提です。
この設定は Doma のマニュアルに従っている。
https://doma.readthedocs.io/ja/stable/build/
これを Spring Boot 向けにしている
Gradle の設定 build.gradle に3つの設定と2つの依存性を書き込む この3つの設定はコンパイルに関わることで、DOMA は外部の SQL を読んだり、DAO インターフェースに関する実装を自動生成する関係でこの設定を入れる必要がある。
3つ目の compilerArgs は無くても Eclipse 上は実行できてしまうので忘れてしまうのだが、 Eclipse 抜きでいざ本番の単独ビルドしても問題ない。しかし起動しようとした場合にコケるので必要。
processResources.destinationDir = compileJava.destinationDir compileJava.dependsOn processResources compileJava.options.compilerArgs = ['-s', '.apt_generated'] dependencies { // 中略 implementation group: 'org.seasar.doma.boot', name: 'doma-spring-boot-starter', version: '1.1.1' implementation('mysql:mysql-connector-java') }
Doma そのものではなく、Spring Boot 用の自動設定用の starter があるのでこれを利用する。 今回は MySQL を使うのでそのコネクタも入れる。
とりあえずこれで Gradle を動かして、いろいろインストールさせる。
ORM としての Doma ではなく開発ツール用の Doma をインストールする。
Gradle がダウンロードした jar の実体がホームディレクトリの .gradle あたりにあるのでその配下にある doma の実体となる jar を取ってきて Spring Boot のプロジェクト配下の /lib あたりに設置する。
はじめよう! (Eclipse) — Doma 2.0 ドキュメント
ここに指示があるように、開発用のプラグインを入れる。
http://dl.bintray.com/domaframework/eclipse/
ここから入れればよい
Eclipse の内部で SQL を開いて編集しないと Eclipse 側が感知できなくて、いろいろなチェックがはたらかない。
Doma ではアノテーションを実行時ではなく開発時にも利用するので、そのための Eclipse の挙動変更をする。 こういうアノテーションの機構を apt と呼ぶらしい。
Spring Boot のプロジェクトの Properties から Java Compiler からプロジェクト独自設定を ON にする。 そしてその配下の Enable Annotation processing を ON にする。
さらにその配下の Factory Path に Jar の追加で先程設置した /lib 以下の doma を指定する
次に Java Build Path の項目で Source タブの中に Allow Output Folder for Source Folder というチェックが入っているので、こいつを外す。
もしくは .apt_generated の output を src/main で設定されているものと同じにする。 Gradle にこのへんを操作させるとこの設定が元に戻ってしまうので、面倒だが発生したら手で戻す。
この辺の設定はローカルの Eclipse の問題であって、Gradle で頑張れは解決できたりもするらしいがあえてやらない。
この自動生成で駆動される Java は Eclipse や STS を駆動しているモノと同じものになるので、 そのへんが環境の Java とズレていると問題が起こったりする。 自分は 1.8 同士で揃えたら問題なく動いた。Spring Boot/Doma/トラブル
src/main/resources/application.yml にこのように書いておく。
spring: datasource: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/hogehoge username: root password: hogehoge doma: dialect: MYSQL naming: SNAKE_LOWER_CASE
driverClassName
は以前は com.mysql.jdbc.Driver
のように書いていたようだが、今は com.mysql.cj.jdbc.Driver
このように書くみたいだ。
適当に MySQL 上にスキーマを作る。テーブルを作る。データを突っ込む。
CREATE TABLE `hogehoge`.`customer` ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(45) NULL, `age` INT NULL, PRIMARY KEY (`id`)); INSERT INTO `hogehoge`.`customer` (`name`, `age`) VALUES ('yamada', '10'); INSERT INTO `hogehoge`.`customer` (`name`, `age`) VALUES ('tanaka', '20'); INSERT INTO `hogehoge`.`customer` (`name`, `age`) VALUES ('saitou', '30');
こいつに対応する Entity クラスを作る。ポイントは使っているアノテーションが Doma のモノであるということである。
import org.seasar.doma.Entity; import org.seasar.doma.GeneratedValue; import org.seasar.doma.GenerationType; import org.seasar.doma.Id; @Entity public class Customer { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; private String name; private Integer age; protected Customer() {} public Customer(String name, Integer age) { this.name = name; this.age = age; } @Override public String toString() { return String.format( "Customer[id=%d, name='%s', age='%d']", this.id, this.name, this.age); } }
こいつを利用する Dao を作る。
@ConfigAutowireable @Dao public interface CustomerDao{ @Select List<Customer> selectAll(); }
インターフェースなのだが、実装部分は Doma が勝手にやってくれるという仕組みのようだ。
ConfigAutowireable アノテーションをつけることによって、こいつの実装部分が DI コントロール化に入るようだ。
このままだと本当に中身が無いので、その実装部として同名の SQL ファイルを作る。 その作る場所は規約で決まっていて
src/main/resources/META-INF/hoge/piyo/fuga/CustomerDao/selectAll.sql
となる。
src/main/resources/META-INF/対象のDAOと同じパッケージ構成/DAOクラス名/メソッド名.sql
ということである。
SQL の中身を実装する
SELECT id, name, age FROM customer ORDER BY id;
コントローラーに DI する。
普通の Spring Boot のインスタンスと同様でコンストラクタインジェクション記述する
@RestController public class HelloHoge { private final HogeService hogeService; private final CustomerDao customerDao; public HelloPacy(HogeService hogeService, CustomerDao customerDao) { this.hogeService = hogeService; this.customerDao = customerDao; } }
後は単純に使えばよい。
@RequestMapping("/") public String index() { List<Customer> cList = this.customerDao.selectAll(); return "Hello Hoge" + hogeService.hello() + cList.toString(); }