@making's memo

All Categories All Tags


Spring Boot + Doma2を使おう

Edit History

本記事は最終更新日から1年以上経過しており、内容が古い可能性があります。注意して読んでください。

Doma 2Spring Boot連携機能をリリースしたので、使い方を紹介します。

雛形プロジェクト作成

まずは雛形プロジェクトをSPRING INITIALIZRから作成します。「Search for dependencies」に"Web"と"JDBC"とH2"を入力して選択してください。


その後、「Generate Project」をクリックするとdemo.zipがダウンロードされます。zipを展開して、MavenプロジェクトをIDEにインポートしてください。
この記事ではIntelliJ IDEAを使います。IDEAの場合、pom.xmlを開くだけでOKです。

pom.xmlにSpring BootでDomaを使うために次のdependencyを追加します。

<dependency>
    <groupId>org.seasar.doma.boot</groupId>
    <artifactId>doma-spring-boot-starter</artifactId>
    <version>1.0.1</version>
</dependency>

エンティティ作成

まずはエンティティクラスを作ります。Domaの慣習でフィールドの修飾子はpublicにしておきます。

package com.example;

import org.seasar.doma.Entity;
import org.seasar.doma.GeneratedValue;
import org.seasar.doma.GenerationType;
import org.seasar.doma.Id;

@Entity
public class Reservation {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer id;
    public String name;
}

DAOインタフェース作成

次にDAOインタフェースを作ります。検索系と更新系のメソッドを1つずつ用意します。

package com.example;

import org.seasar.doma.Dao;
import org.seasar.doma.Insert;
import org.seasar.doma.Select;
import org.seasar.doma.boot.ConfigAutowireable;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@ConfigAutowireable
@Dao
public interface ReservationDao {
    @Select
    List<Reservation> selectAll();

    @Insert
    @Transactional
    int insert(Reservation reservation);
}

@ConfigAutowireableはDomaの@AnnotateWithを使って、生成されるDAO実装クラスに@Repository@Autowiredを付与するためのアノテーションです。

DAO実行クラス生成

DAOインタフェースを作ったあと、IDEでビルドを行えばDAO実装クラスが自動生成されます。しかし、検索系メソッドにはコンパイル時に対応するSQLファイルを用意する必要があるため、コンパイルエラーになります。通常はsrc/main/resources/META-INF/(FQCN)/(クラス名)/(メソッド名).sqlにメソッドに対応するSQLを記述します。今回の場合はsrc/main/resources/META-INF/com/example/ReservationDao/selectAll.sqlです。

ちなみに、↑の図では必要であるにも関わらず対応するSQLファイルがないメソッドは赤色で表示されています。このように表示させるにはIntelliJ IDEのDoma Supportプラグインをインストールする必要があります。Doma 2を使用するためにプラグインは必須ではありませんが、あると便利です。

このプラグインがあれば、メソッドに対して(Macの場合)Option + Enterで「SQLファイルを作る。」というメニューを選択することができます。

.../src/main/resoucesを選べば、対応するSQLファイルが生成されます。

あとはこのSQLファイルにSQLを直接書けば良いです。

SELECT
  id,
  name
FROM reservation
ORDER BY name ASC

再度ビルドを行い、コンパイルが成功すればtarget以下にReservationDaoImplクラスが生成され、コンパイルされていることがわかります。

アプリケーション作成

DemoApplicationReservationDaoを使った簡単なアプリケーションを作りましょう。

package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;

@SpringBootApplication
@RestController
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Autowired
    ReservationDao reservationDao;

    // 起動時にReservationDao#insertで初期データを投入する
    @Bean
    CommandLineRunner runner() {
        return args -> Arrays.asList("spring", "spring boot", "spring cloud", "doma").forEach(s -> {
            Reservation r = new Reservation();
            r.name = s;
            reservationDao.insert(r);
        });
    }

    @RequestMapping(path = "/")
    List<Reservation> all() {
        return reservationDao.selectAll();
    }
}

次にDomaが生成するSQLの方言を設定します。今回はH2データベースを使用するため、
application.propertiesdoma.dialect=h2プロパティを設定してください。

プロパティはCtrl + Spaceで補完させることができます。

このまま起動するとテーブルが無くてエラーになるため、DDLスクリプトを用意します。Spring Bootではクラスパス直下のschema.sqlを起動時に実行するので、src/main/resources/schema.sqlにテーブルを作成するSQLを書けば良いです。

CREATE TABLE reservation (
  id   IDENTITY,
  NAME VARCHAR(50)
);

補足ですが、spring.datasource.initialize=falseを設定すればschema.sqlの実行をスキップできます。デプロイ時はこのプロパティを指定すれば良いです。

あとはDemoApplicationmainメソッドを実行すればアプリケーションが起動します。

http://localhost:8080 にアクセスすれば、selectAll.sqlのSQLが実行され結果が返ります。

ここまででSpring Boot + Doma2の連携の話は終わりです。

application.propertiesに設定可能な値は
https://github.com/domaframework/doma-spring-boot#properties-file-configuration
を参照してください。

簡単に使えるので試してフィードバックをください!

(おまけ)メソッド追加

せっかくなので、Doma2の2 way SQLを試せるようにメソッド(selectByName)を追加します。(Spring Bootは関係ありません)

@ConfigAutowireable
@Dao
public interface ReservationDao {
    @Select
    List<Reservation> selectAll();

    @Select
    List<Reservation> selectByName(String name);

    @Insert
    @Transactional
    int insert(Reservation reservation);
}

対応するSQLをsrc/main/resources/META-INF/com/example/ReservationDao/selectByName.sqlに記述します。

SELECT
  id,
  name
FROM reservation
WHERE name LIKE /* @prefix(name) */'spring%' ESCAPE '$'

書き方はこちらを参照。

SQLをそのまま実行できるので便利ですね。

Controllerに次のメソッドを追加して、ReservationDao#selectByNameを呼び出すようにします。

    @RequestMapping(path = "/", params = "name")
    List<Reservation> name(@RequestParam String name) {
        return reservationDao.selectByName(name);
    }

以上。コードはこちらです。

このエントリーをはてなブックマークに追加