Doma 2のSpring 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
クラスが生成され、コンパイルされていることがわかります。
アプリケーション作成
DemoApplication
にReservationDao
を使った簡単なアプリケーションを作りましょう。
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.properties
にdoma.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
の実行をスキップできます。デプロイ時はこのプロパティを指定すれば良いです。
あとはDemoApplication
のmain
メソッドを実行すればアプリケーションが起動します。
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);
}
以上。コードはこちらです。