Java
Doma
spring-boot
h2
SpringBoot

SpringBoot×DOMA2 チュートリアル 環境構築から実行まで

はじめに

SpringBootでDOMA2使ってみようと思い環境構築してたら、意外と躓いたので、手順を記述しておきます。

環境

SpringBoot2
DOMA2
H2
Eclipse4.7

設定

プロジェクト作成

  1. Eclipse開いて
  2. パッケージ・エクスプローラーで右クリック
  3. 新規
  4. プロジェクト
  5. Springスターター・プロジェクト
  6. 名前に「sample」と入力 ※任意
  7. グループに「jp.co.sample」と入力 ※任意
  8. パッケージに「jp.co.sample」と入力 ※任意
  9. 「次へ」を押下
  10. 「web」にチェック
  11. 「次へ」を押下
  12. 「完了」を押下 ※ここまで終了したらプロジェクトが動くか確認しておいたほうがいいかもしれません。

POM.xmlに依存関係記述

  1. DOMAの依存関係
        <dependency>
            <groupId>org.seasar.doma.boot</groupId>
            <artifactId>doma-spring-boot-starter</artifactId>
            <version>1.1.0</version>
        </dependency>
  1. JDBCの依存関係
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
  1. H2の依存関係記述、今回はDBにH2を使うためです。
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>

※最終的に以下のようになると思います。(dependenciesの中だけ)

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

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

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
    </dependencies>

application.propertiesにDBの設定記述

/sample/src/main/resources/application.propertiesに以下を記述

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.name=sa
spring.datasource.password=sa

設定の説明は、https://qiita.com/yuk1ty/items/6cc4f69ad25cc3eeb59b で書かれているのを参考にしています。

自動でDBにテーブルとデータを作成するようにする

SpringBootは、クラスパス直下にDDLを作ると自動で実行してくれます。
/sample/src/main/resources/の直下に、以下のように2ファイル作成してください。

・schema.sql

CREATE table IF NOT EXISTS sample(id int primary key, name varchar(30));

・data.sql

INSERT INTO sample(id, name) VALUES(1, 'YAMADA');
INSERT INTO sample(id, name) VALUES(2, 'SATO');
INSERT INTO sample(id, name) VALUES(3, 'TANAKA');
INSERT INTO sample(id, name) VALUES(4, 'SUZUKI');

※spring.datasource.initialize=falseにすることでschema.sqlの実行を行わないようにすることが出来ます。

これで起動したときに自動でDB作ってくれます。

実装

以下のディレクトリ構成になるように作成します。

WS000005.JPG

Entityの実装

package jp.co.sample.domain.model;

import org.seasar.doma.Entity;
import org.seasar.doma.Id;
import org.seasar.doma.Table;

@Entity
@Table(name = "sample")
public class SampleEntity {

    @Id
    private int id;

    private String name;

~ getter, setter 省略 ~

}

Repositoryの実装

package jp.co.sample.domain.repository;

import java.util.List;

import org.seasar.doma.Dao;
import org.seasar.doma.Select;
import org.seasar.doma.boot.ConfigAutowireable;

import jp.co.sample.domain.model.SampleEntity;

@ConfigAutowireable
@Dao
public interface SampleRepository {

    @Select
    List<SampleEntity> selectAll();

}

ConfigAutowireableアノテーションは、DAO実装クラスに@Repository@Autowiredを付与するためのアノテーション
Selectアノテーションは、メソッドが実行するSQLの内容が、SELECT文であることを記述してます。
全てのメソッドにはアノテーションを付与する必要があります。
アノテーションには、SelectやUpdateなどがあります。
以下に参考になるサイトを載せておきますので、こちら参考にしてください。
http://doma.readthedocs.io/ja/stable/query/

SQLの実装 SQLファイルをバインドさせる

SQLファイルは、src/main/resources/META-INF/の下に対象のRepository(今回はSampleRepository)と同じ階層になるように作成します。
つまり、SampleRepositoryは、「jp/co/sample/domain/repository/」の直下にあるので「src/main/resources/META-INF/」の下に「jp/co/sample/domain/repository/SampleRepository」というディレクトリを作ります。SampleRepositoryの直下にメソッド名(今回はselectAll)と同じ名前でsqlファイルを作成することで、メソッドが呼び出されたときに対象のsqlファイルが実行されるようになります。

/sample/src/main/resources/META-INF/jp/co/sample/domain/repository/SampleRepository/selectAll.sql の中身

select id, name from sample order by id;

Serviceの実装

package jp.co.sample.domain.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import jp.co.sample.domain.model.SampleEntity;
import jp.co.sample.domain.repository.SampleRepository;

@Service
public class SampleService {

    @Autowired
    SampleRepository  sampleRepository;

    public List<SampleEntity> getSample () {
        return sampleRepository.selectAll();
    }
}

Controllerの実装

package jp.co.sample.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import jp.co.sample.domain.model.SampleEntity;
import jp.co.sample.domain.service.SampleService;

@RestController
public class SampleController {

    @Autowired
    SampleService sampleService;

    @RequestMapping(value = "/sample", method = RequestMethod.GET)
    public List<SampleEntity> getSample () {
        return sampleService.getSample();
    }

}

これで実装終了です。

そのままビルドするとエラー出るので設定を入れる

まとめてくれている人がいるのでこちらを参考にしてください。
https://qiita.com/nesheep5/items/37bd1913211fcf3aebf1

実行

  1. プロジェクト右クリック
  2. 実行を押下
  3. Spring Boot アプリケーション
  4. 実行確認
  5. ブラウザ開いて
  6. http://localhost:8080/sample にアクセス!

以下のように出力されたら成功ですね。
[{"id":1,"name":"YAMADA"},{"id":2,"name":"SATO"},{"id":3,"name":"TANAKA"},{"id":4,"name":"SUZUKI"}]

最後に

簡単に動かすところまで書いてみました。
間違いありましたら連絡下さい。