--- title: Spring Boot + Doma2を使おう tags: ["Doma2", "Java", "Spring", "Spring Boot"] categories: ["Programming", "Java", "org", "seasar", "doma"] date: 2016-01-11T12:55:16Z updated: 2016-02-13T03:12:50Z --- [Doma 2](https://github.com/domaframework/doma)の[Spring Boot連携機能](https://github.com/domaframework/doma-spring-boot)をリリースしたので、使い方を紹介します。 ### 雛形プロジェクト作成 まずは雛形プロジェクトを[SPRING INITIALIZR](https://start.spring.io)から作成します。「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を追加します。 ``` xml org.seasar.doma.boot doma-spring-boot-starter 1.0.1 ``` ### エンティティ作成 まずはエンティティクラスを作ります。Domaの慣習でフィールドの修飾子は`public`にしておきます。 ``` java 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つずつ用意します。 ``` java 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 selectAll(); @Insert @Transactional int insert(Reservation reservation); } ``` `@ConfigAutowireable`はDomaの[@AnnotateWith](http://doma.readthedocs.org/ja/stable/config/#id22)を使って、生成される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プラグイン](https://github.com/siosio/DomaSupport)をインストールする必要があります。Doma 2を使用するためにプラグインは必須ではありませんが、あると便利です。 このプラグインがあれば、メソッドに対して(Macの場合)`Option + Enter`で「SQLファイルを作る。」というメニューを選択することができます。 `.../src/main/resouces`を選べば、対応するSQLファイルが生成されます。 あとはこのSQLファイルにSQLを直接書けば良いです。 ``` sql SELECT id, name FROM reservation ORDER BY name ASC ``` 再度ビルドを行い、コンパイルが成功すれば`target`以下に`ReservationDaoImpl`クラスが生成され、コンパイルされていることがわかります。 ### アプリケーション作成 `DemoApplication`に`ReservationDao`を使った簡単なアプリケーションを作りましょう。 ``` java 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 all() { return reservationDao.selectAll(); } } ``` 次にDomaが生成するSQLの方言を設定します。今回はH2データベースを使用するため、 `application.properties`に`doma.dialect=h2`プロパティを設定してください。 プロパティは`Ctrl + Space`で補完させることができます。 このまま起動するとテーブルが無くてエラーになるため、DDLスクリプトを用意します。Spring Bootではクラスパス直下の`schema.sql`を起動時に実行するので、`src/main/resources/schema.sql`にテーブルを作成するSQLを書けば良いです。 ``` sql CREATE TABLE reservation ( id IDENTITY, NAME VARCHAR(50) ); ``` 補足ですが、`spring.datasource.initialize=false`を設定すれば`schema.sql`の実行をスキップできます。デプロイ時はこのプロパティを指定すれば良いです。 あとは`DemoApplication`の`main`メソッドを実行すればアプリケーションが起動します。 http://localhost:8080 にアクセスすれば、`selectAll.sql`のSQLが実行され結果が返ります。 ここまででSpring Boot + Doma2の連携の話は終わりです。 `application.properties`に設定可能な値は https://github.com/domaframework/doma-spring-boot#properties-file-configuration を参照してください。 簡単に使えるので試して[フィードバック](https://github.com/domaframework/doma-spring-boot/issues)をください! ### (おまけ)メソッド追加 せっかくなので、Doma2の2 way SQLを試せるようにメソッド(`selectByName`)を追加します。(Spring Bootは関係ありません) ``` java @ConfigAutowireable @Dao public interface ReservationDao { @Select List selectAll(); @Select List selectByName(String name); @Insert @Transactional int insert(Reservation reservation); } ``` 対応するSQLを`src/main/resources/META-INF/com/example/ReservationDao/selectByName.sql`に記述します。 ``` sql SELECT id, name FROM reservation WHERE name LIKE /* @prefix(name) */'spring%' ESCAPE '$' ``` 書き方は[こちら](http://doma.readthedocs.org/ja/stable/expression/#id11)を参照。 SQLをそのまま実行できるので便利ですね。 Controllerに次のメソッドを追加して、`ReservationDao#selectByName`を呼び出すようにします。 ``` java @RequestMapping(path = "/", params = "name") List name(@RequestParam String name) { return reservationDao.selectByName(name); } ``` 以上。コードは[こちら](https://github.com/making/doma2-spring-boot-demo)です。