Spring Boot/Doma/Install

Spring Boot/Doma/Install

セットアップのやり方。結構迷ったので memo しておく。

Eclipse や STS でやる前提です。

Gradle の設定

この設定は 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 を動かして、いろいろインストールさせる。

開発駆動用の Doma をインストールする

ORM としての Doma ではなく開発ツール用の Doma をインストールする。

Gradle がダウンロードした jar の実体がホームディレクトリの .gradle あたりにあるのでその配下にある doma の実体となる jar を取ってきて Spring Boot のプロジェクト配下の /lib あたりに設置する。

Doma 用 Eclipseプラグインを入れる

はじめよう! (Eclipse) — Doma 2.0 ドキュメント

ここに指示があるように、開発用のプラグインを入れる。

http://dl.bintray.com/domaframework/eclipse/

ここから入れればよい

SQL ファイルの関連付けを 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/トラブル

Doma - よくある質問

DB への接続設定

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();
    }
java/spring/spring_boot/doma/install.txt · 最終更新: 2019-06-05 18:23 by ore