Spring Boot + JPA + MySQLでREST APIを実装する

表題に向けて実装します。今回はこれまで作成したThymeleafを呼ぶコントローラは残したまま、新しいREST APIコントローラを追加します。また、DBへの接続にjdbcを利用していましたが、ORマッパのSpring Data JPAを利用するように変更します。

## 共通部分の修正
追加・修正ファイル
![1.png](https://qiita-image-store.s3.amazonaws.com/0/110457/e95aa7a6-57ef-5c86-6a49-865ff02f3065.png)



**usersテーブルの定義**

```java:com.example.User.java
package com.example;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "users")
public class User {
	@Id
	@Column(name = "id")
	private int id;
	@Column(name = "name")
	private String name;

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
```


**DBに接続するサービスクラス定義**

```java:com.example.Repository.UsersRepository.java
package com.example.Repository;

import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.User;

public interface UsersRepository extends JpaRepository<User, Integer> {
	public List<User> findById(int id);
}
```


**DB接続の設定**
driver-class-nameが古かったので修正

```src/main/resources/application.properties
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/DB名
spring.datasource.username=ユーザ名
spring.datasource.password=パスワード
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
```

**依存の設定**
ORマッパを利用するため追加

```xml:pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
```

## APIの仕様
**DB**
以下のようにusersテーブルを作成して、テーブルに対してRESTでデータを操作します。

```sql
CREATE TABLE user (
  id int AUTO_INCREMENT,
  name varchar(254),
  INDEX(id)
);
```

**API一覧**

| NO | METHOD url | 動作 |
|---|---|---|
| 1 | GET /users | テーブル全件参照 |
| 2 | GET /users/id | id指定した1件参照 |
| 3 | POST /users | レコード登録 |
| 4 | PUT /users/id | 1レコード更新 |
| 5 | DELETE /users/id | 1レコード削除 |

## 1 GET /users

```java:com.example.UsersController.java
@Autowired
private UsersRepository repository;

@RequestMapping(path = "/users", method = RequestMethod.GET)
@Transactional
public List<User> get() {
	return repository.findAll();
}
```

```json
requestBody

responseBody
[
    {"id":1,"name":"kusakarikai1"},
    {"id":2,"name":"kusakarikai2"}
]
```

## 2 GET /users/id

```java:com.example.UsersController.java
@Autowired
private UsersRepository repository;

@RequestMapping(path = "/users/{id}", method = RequestMethod.GET)
public List<User> show(Model model, @PathVariable("id") int id) {
	return repository.findById(id);
}
```

```json
requestBody

responseBody
[
    {"id":1, "name":"kusakarikai1"}
]
```

## 3 POST /users

```java:com.example.UsersController.java
@Autowired
private UsersRepository repository;

@RequestMapping(path = "/users", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public User create(Model model, @RequestBody User user) {
	return repository.save(user);
}
```

```json
requestBody
{"name":"kusa_create"}

responseBody
[
    {"id":1, "name":"kusa_create"}
]
```

## 4 PUT /users/id

```java:com.example.UsersController.java
@Autowired
private UsersRepository repository;

@RequestMapping(path = "/users/{id}", method = RequestMethod.PUT)
public User update(Model model, @PathVariable("id") int id, @RequestBody User user) {
	user.setId(id);
	return repository.save(user);
}
```

```json
requestBody
{"name":"kusa_update"}

responseBody
[
    {"id":1, "name":"kusa_update"}
]
```


## 5 DELETE /users/id

```java:com.example.UsersController.java
@Autowired
private UsersRepository repository;

@RequestMapping(path = "/users/{id}", method = RequestMethod.DELETE)
public void destory(Model model, @PathVariable("id") int id) {
	repository.delete(id);
}
```

```json
requestBody

responceBody

```

ソースは以下です。
https://github.com/kaikusakari/spring_crud