Spring+Doma+H2DBでWEBシステムを構築 その2

#はじめに
前回同様[ここ](https://blog.ik.am/entries/371)を参考に作っていく。

#Spring Tool Suite(STS)およびDoma Toolsの導入
開発する上で便利なので導入しておく
##STSの導入
1. `ヘルプ`→`Eclipseマーケットプレイス`にて`STS`を検索し、インストールする
2. インストールが完了後Eclipseを再起動

##Doma Toolsの導入
1. `ヘルプ`→`新規ソフトウェアのインストール`で`作業対象`に[http://dl.bintray.com/domaframework/eclipse/](http://dl.bintray.com/domaframework/eclipse/)を入力
2. `Doma Tools`にチェックを入れ`次へ`
3. インストール完了後、Eclipseを再起動

#簡単なSelectとInsert処理を作成
##Entityの作成
1. entityパッケージを作成
2. entityパッケージの中にTestEntityを作成

```java:TestEntity.java
package com.tharao.createdesigndocuments.entity;

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

@Entity
public class TestEntity {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public Integer id;
	public String name;

}
```

##Daoの作成
1. daoパッケージを作成
2. daoパッケージの中にTestEntityDaoを作成

```java:TestEntityDao.java
package com.tharao.createdesigndocuments.dao;

import java.util.List;

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 com.tharao.createdesigndocuments.entity.TestEntity;

@ConfigAutowireable
@Dao
public interface TestEntityDao {

	@Select
	List<TestEntity> selectAll();
	
	@Insert
	@Transactional
	int insert(TestEntity reservation);

}
```

##Serviceの作成
1. serviceパッケージを作成
2. serviceパッケージの中にTestServiceを作成

```java:TestService.java
package com.tharao.createdesigndocuments.service;

import java.util.List;

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

import com.tharao.createdesigndocuments.dao.TestEntityDao;
import com.tharao.createdesigndocuments.entity.TestEntity;

@Service
@Transactional
public class TestService {

	@Autowired
	TestEntityDao dao;

	public List<TestEntity> getAllEntities() {
		return dao.selectAll();
	}

}
```

##Controllerの作成
1. controllerパッケージを作成
2. controlleパッケージの中にTestControllerを作成

```java:TestService.java
package com.tharao.createdesigndocuments.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 com.tharao.createdesigndocuments.entity.TestEntity;
import com.tharao.createdesigndocuments.service.TestService;

@RestController
public class TestController {

	@Autowired
	TestService service;

	@RequestMapping(value = "test", method = RequestMethod.GET)
	public List<TestEntity> getEntities() {
		return service.getAllEntities();
	}

}
```

##SQLファイルの作成
1. Daoインターフェイスの`selectAll`メソッドで右クリックし`Doma`→`Jump to Slq File`で作成
2. `selectAll.sql`を追加

```sql:selectAll.sql
select
	id
	,name
from
	TestEntity
order by
	id asc
```

##アプリケーションの作成
初期データを入れる

```java:CreateDesignDocumentsApplication.java
package com.tharao.createdesigndocuments;

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

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 com.tharao.createdesigndocuments.dao.TestEntityDao;
import com.tharao.createdesigndocuments.entity.TestEntity;

@SpringBootApplication
public class CreateDesignDocumentsApplication {

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

	@Autowired
	TestEntityDao testEntityDao;

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

}
```

次に`application.properties`にSQLの方言を設定する

```properties:application.properties
doma.dialect=h2
```

##apt(注釈処理)の設定
###Doma公式のセットアップにならい、aptの設定をする。
1. Eclipseのプロジェクトのプロパティを表示し、`Javaコンパイラー`→`注釈処理`を選択する
2. `プロジェクト固有の設定を可能にする`にチェックを入れる
3. `生成されるソース・ディレクトリー`を`.apt_generated`にする
3. `プロセッサー・オプション`に以下を追加

	|キー|値|
	|:--|:--|
	|dao.subpackage|impl|

5. `Javaコンパイラー`→`注釈処理`→`ファクトリー・パス`を選択する
6. `プロジェクト固有の設定を可能にする`にチェックを入れる
7. `注釈プロセッサーを含むプラグイン及びJAR`に`doma`のjarを追加し`OK`を押す

#動かしてみる
[http://localhost:8080/test](http://localhost:8080/test)にアクセスすると、無事データがJSON形式で表示された。
![test.png](https://qiita-image-store.s3.amazonaws.com/0/189711/07d7401b-2aad-2353-4eb6-e2ac35516424.png)


#ハマったところ
SQLファイルを`src/main/resources`の下に作成したが、プロジェクトのJavaのビルド・パスで`src/main/resources`の`除外`の設定に全ファイルが設定されており、DaoImplが作成されなかった。
`src/main/resources`の`除外`をなしに設定したところ、無事にDaoImplが作成されコンパイルが通った。

参考にしたURL
[Spring Boot + Doma2を使おう](https://blog.ik.am/entries/371)