Spring bootでJPA(Java Persistence API)を使用して、MySQLのCRUD操作を行う

# ■ 環境
device : windows
開発環境 : VSCode
spring boot : 3.2.6
MySQL : 8.0
java : 17

# ■ MySQLのデータを用意する
任意のデータベースで以下を実行する

```sql
-- データベース「shop」を作成
CREATE DATABASE shop;

-- 「shop」データベースを使用
USE shop;

-- 「items」テーブルを作成
-- 商品のID（整数,自動）、名前（最大20文字の文字列）、価格（整数）
CREATE TABLE items (
    id INT PRIMARY KEY AUTO_INCREMENT,  -- 商品の一意の識別子、自動増分
    name VARCHAR(20),                   -- 商品の名前
    price INT                           -- 商品の価格
);

-- 「items」テーブルにデータを挿入
INSERT INTO items VALUES (1, 'みかん', 100);
INSERT INTO items VALUES (2, 'りんご', 150);
INSERT INTO items VALUES (3, 'バナナ', 80);
INSERT INTO items VALUES (4, 'いちご', 200);
INSERT INTO items VALUES (5, 'ぶどう', 300);
INSERT INTO items VALUES (6, 'パイナップル', 250);
INSERT INTO items VALUES (7, 'キウイ', 200);
INSERT INTO items VALUES (8, 'レモン', 90);
INSERT INTO items VALUES (9, 'スイカ', 500);
INSERT INTO items VALUES (10, 'メロン', 500);
INSERT INTO items VALUES (11, 'もも', 350);
INSERT INTO items VALUES (12, 'なし', 180);
INSERT INTO items VALUES (13, 'さくらんぼ', 220);
INSERT INTO items VALUES (14, 'マンゴー', 400);
INSERT INTO items VALUES (15, 'パパイヤ', 500);
INSERT INTO items VALUES (16, 'アボカド', 130);
INSERT INTO items VALUES (17, 'グレープフルーツ', 160);
INSERT INTO items VALUES (18, 'ブルーベリー', 270);
INSERT INTO items VALUES (19, 'ラズベリー', 270);
INSERT INTO items VALUES (20, 'ブラックベリー', 310);

-- 「items」テーブルのデータの確認
SELECT * FROM items;
```

# ■ Spring Bootの設定を行う
### (1) application.propertiesの設定を行う

| 項目                 | 内容                   |
|----------------------|------------------------|
| コンテキストパス     | `<context-path>`       |
| データベースユーザー名 | `<database_username>`  |
| データベースパスワード | `<database_password>`  |


```properties:application.properties
# アプリケーションのコンテキストパスを設定
server.servlet.context-path=/<context-path>
# アプリケーションのポート番号を設定
server.port=7777
# Thymeleaf のキャッシュを無効
spring.thymeleaf.cache=false

# データベースの接続先URLを指定。database_name は接続するデータベース名を指定
spring.datasource.url=jdbc:mysql://localhost:3306/<database_name>
# データベースに接続するためのユーザー名を指定
spring.datasource.username=<database_username>
# データベースに接続するためのパスワードを指定
spring.datasource.password=<database_password>
# データベースのJDBCドライバのクラス名を指定
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

```

### (2) pom.xmlの設定を行う
pom.xmlでJPA、MySQLのドライバの依存関係を設定。

`<dependencies>　</dependencies>`の中に追加する。

```xml:pom.xml
<!-- JPA。データベースアクセスを容易にすることができる -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- MySQLデータベースとの接続を可能にするためのJDBCドライバ -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>
```

# ■ 1. 全件検索を行う
## 実装内容
すべてのテーブルデータを取得する
```sql
-- SQLで実装する場合
SELECT * FROM items;
```

## (1-1) Entity を作成
Entityはデータベース内のテーブルの構造を表し、カラムをフィールドにマッピングすること

・`@Entity`でEntityに指定
・`@Table`でテーブル名を指定
・`@Id`と`@Column`アノテーションでフィールドにマッピング
・GetterとSetterを作成し、カプセル化を行う

```java:/entity/Item.java
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.SequenceGenerator;
import jakarta.persistence.Table;

@Entity
@Table(name = "items")
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_items_gen")
    @SequenceGenerator(name = "seq_items_gen", sequenceName = "seq_items", allocationSize = 1)
    private Integer id;

    @Column
    private String name;

    @Column
    private Integer price;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getPrice() {
        return price;
    }
    public void setPrice(Integer price) {
        this.price = price;
    }
}
```

## (1-2) Repository を作成
Repositoryは、データベースとアプリケーションの間のデータアクセスを抽象化する役割

・`extends JpaRepository`でリポジトリの基本的な<font color="1e90ff">**インターフェース**</font>を継承
・`<Item, Integer>`の`Item`でEntityクラスを指定
・`<Item, Integer>`の`Integer`で主キーが整数型であることを指定

```java:/entity/ItemRepository.java
import org.springframework.data.jpa.repository.JpaRepository;
import jp.co.sss.test_spring.entity.Item;

public interface ItemRepository extends JpaRepository<Item, Integer> {
}
```

## (1-3) Controller を作成
Controllerは、ユーザーのアクセスからViewの管理を行う

・`@Controller`でコントローラーに指定
・`@Autowired`でリポジトリをインスタンス化
・`@RequestMapping`でユーザーからの指定のパスでリクエスト処理を行う
・`findAll()`で`itemRepository`の全件検索を行う
・`model.addAttribute("Items", ...)`で`Item`という属性名を指定し、Viewに渡すデータをモデルに追加
・`return "database/dbAllItems"`でViewを選択

```java:/controller/databaseController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import jp.co.sss.test_spring.repository.ItemRepository;

@Controller
public class databaseController {
    @Autowired
    ItemRepository itemRepository;

    @RequestMapping("/database/dbAllItems")
    public String allItemsView(Model model) {
        model.addAttribute("Items", itemRepository.findAll());
        return "database/dbAllItems";
    }
}
```

## (1-4) HTML を作成

HTMLは、ユーザーが見るViewを作成する

・`item : ${Items}`で、`Controller`の`model.addAttribute("Items", ...)`で渡したデータを受け取る
・` <tr th:each = "...">`で、反復処理を行う
・`<td th:text="${item...}"></td>`で、`item : ${Items}`で得られた`item`の各要素を表示

```html:/resources/templates/database/dbAllItems.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <tr th:each = "item : ${Items}">
        <td th:text="${item.id}"></td>
        <td th:text="${item.name}"></td>
        <td th:text="${item.price}"></td><br>
    </tr>
</body>
</html>
```

## (1-5) 実行

spring boot実行して、ブラウザで検索
application.propertiesのファイルで指定した`<context-path>`を変更する
```
http://localhost:7777/<context-path>/database/dbAllItems
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/508f934c-fb1b-aca4-cda7-3f33d7a8f55d.png" width="300" height="200">

# ■ 2. 並べ替え
## 実装内容
全件検索を指定の並び替えをする
```sql
-- SQLで実装する場合
SELECT * FROM items 
ORDER BY price DESC;
```

## (2-1) Entity を作成
[(1-1) Entity を作成](#1-1-entity-を作成)をそのまま使用

## (2-2) Repository を作成

リポジトリに命名規則に基づいたクエリメソッドを定義
・`findAllBy...`で、エンティティを検索する
・`OrderBy...`で、ソートの基準を指定
・`Desc` を最後につけることで、降順と指定する（昇順の場合は、`ASC`）

```java:/entity/ItemRepository.java
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

import jp.co.sss.test_spring.entity.Item;

public interface ItemRepository extends JpaRepository<Item, Integer> {
    List<Item> findAllByOrderByPriceDesc();
}
```

## (2-3) Controller を作成
・Repositoryで定義した`findAllByOrderByPriceDesc`を使用して、SQLを変更する

```diff_java:/controller/databaseController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import jp.co.sss.test_spring.repository.ItemRepository;

@Controller
public class databaseController {
    @Autowired
    ItemRepository itemRepository;

    //@RequestMapping("/database/dbAllItems")

    @RequestMapping("/database/dbAllItems/priceDesc")
    public String allItemsPriceDescView(Model model) {
        model.addAttribute("Items", itemRepository.findAllByOrderByPriceDesc());
        return "database/dbAllItems";
    }
}
```

## (2-4) HTML を作成
[(1-4) HTMLを作成](#1-4-htmlを作成)をそのまま使用

## (2-5) 実行
spring boot実行して、ブラウザで検索
application.propertiesのファイルで指定した`<context-path>`を変更する
```
http://localhost:7777/<context-path>/database/dbAllItems/priceDesc
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/4d7dd163-2f63-2b50-b88b-5e37e9a966e8.png" width="300" height="200">

# ■ 3. 条件検索 主キー
## 実装内容
主キーに対応するデータを取得する
```sql
-- SQLで実装する場合
SELECT * FROM Items 
WHERE id = 1;
```

## (3-1) Entity を作成
[(1-1) Entity を作成](#1-1-entity-を作成)をそのまま使用

## (3-2) Repository を作成
[(2-2) Repository を作成](#2-2-repository-を作成)をそのまま使用

## (3-3) Bean を作成

Beanは、エンティティのデータを一時的に保存してビューにデータを渡すための機能

```java:/bean/ItemBean.java
public class ItemBean {
    private Integer id;
    private String name;
    private Integer price;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getPrice() {
        return price;
    }
    public void setPrice(Integer price) {
        this.price = price;
    }
}
```

## (3-4) Controller を作成

・`@PathVariable`で、URLパスの一部をメソッドの引数にバインドする役割
・`id`に対応するエンティティをリポジトリから取得
・`BeanUtils.copyProperties(item, itemBean);`で、`item`の同じ名前のプロパティ値を`itemsBean`にコピー
・`itemBean`にコピーされたデータを`model.addAttribute`で`Items`に渡す

```java:/controller/databaseController.java
package jp.co.sss.test_spring.controller;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import jp.co.sss.test_spring.bean.ItemBean;
import jp.co.sss.test_spring.entity.Item;
import jp.co.sss.test_spring.repository.ItemRepository;

@Controller
public class databaseController {
    @Autowired
    ItemRepository itemRepository;

    //@RequestMapping("/database/dbAllItems")
    //@RequestMapping("/database/dbAllItems/priceDesc")

    @RequestMapping("/database/dbSelectName")
    public String selectName(Model model) {
        model.addAttribute("Items", itemRepository.findAll());
        return "database/dbSelectName";
    }

    @RequestMapping("/database/dbItemsDetail/{id}")
    public String itemsDetail(@PathVariable Integer id, Model model) {
        Item item = itemRepository.getReferenceById(id);
        ItemBean itemBean = new ItemBean();
        BeanUtils.copyProperties(item, itemBean);

        model.addAttribute("Items", itemBean);
        return "database/dbItemsDetail";
    }
}
```

## (3-5) HTML を作成

・`/database/dbItemsDetail/{id}`で、URLのテンプレートを作成
・`{id}`部分は`id=${item.id}`によって現在の`item.id`プロパティの値に置き換える

```html:/templates/database/dbSelectName.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <tr th:each="item:${Items}">
        <td th:text="${item.id}"></td>
        <td><a th:href="@{/database/dbItemsDetail/{id}(id=${item.id})}" th:text="${item.name}"></a></td><br>
    </tr>
</body>
</html>
```

・`itemBean`にコピーされた`Items`のデータをそれぞれの要素で表示する

```html:/templates/database/dbitemsDetail.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <tr>
        <span>id : </span>
        <td th:text="${Items.id}"></td><br>
        <span>name : </span>
        <td th:text="${Items.name}"></td><br>
        <span>price : </span>
        <td th:text="${Items.price}"></td><br>
    </tr>
</body>
</html>
```

## (3-6) 実行
spring boot実行して、ブラウザで検索
application.propertiesのファイルで指定した`<context-path>`を変更する
```
http://localhost:7777/<context-path>/database/dbSelectName
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/ea3ae1bd-98b9-695f-bc5d-72651e094527.png" width="300" height="200">

# ■ 4. 条件検索 カラム
## 実装内容
カラムに対応するデータを取得する
```sql
-- SQLで実装する場合
SELECT * FROM Items 
WHERE price = 500;
```

## (4-1) Entity を作成
[(1-1) Entity を作成](#1-1-entity-を作成)をそのまま使用

## (4-2) Repository を作成
```java:/entity/ItemRepository.java
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

import jp.co.sss.test_spring.entity.Item;

public interface ItemRepository extends JpaRepository<Item, Integer> {
    //List<Item> findAllByOrderByPriceDesc();

    List<Item> findByPrice(Integer price);
}
```

## (4-3) Controller を作成

リポジトリで用意した`findByPrice`を呼び出し、引数で条件検索に使用するデータを渡す

```java:/controller/databaseController.java
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import jp.co.sss.test_spring.bean.ItemBean;
import jp.co.sss.test_spring.entity.Item;
import jp.co.sss.test_spring.repository.ItemRepository;

@Controller
public class databaseController {
    @Autowired
    ItemRepository itemRepository;

    //@RequestMapping("/database/dbAllItems")
    //@RequestMapping("/database/dbAllItems/priceDesc")
    //@RequestMapping("/database/dbSelectName")
    //@RequestMapping("/database/dbItemsDetail/{id}")

    @RequestMapping("/database/findByPrice/{price}")
    public String findByPrice(@PathVariable Integer price, Model model) {
        model.addAttribute("Items", itemRepository.findByPrice(price));
        return "database/dbAllItems";
    }
}
```

## (4-4) HTML を作成
[(1-4) HTMLを作成](#1-4-htmlを作成)をそのまま使用

## (4-5) 実行
spring boot実行して、ブラウザで検索
application.propertiesのファイルで指定した`<context-path>`を変更する
```
http://localhost:7777/<context-path>/database/findByPrice/500
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/d987b3e8-0ef6-49b9-fa7e-4803fcf17676.png" width="300" height="200">

# ■ 5. 条件検索 複数のカラム
## 実装内容
複数のカラムに対応するデータを取得する
```sql
-- SQLで実装する場合
SELECT * FROM Items 
WHERE name = 'スイカ' AND price = 500;
```

## (5-1) Entity を作成
[(1-1) Entity を作成](#1-1-entity-を作成)をそのまま使用

## (5-2) Repository を作成

複数検索をする場合に、複数の引数を用意する

```java:/entity/ItemRepository.java
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

import jp.co.sss.test_spring.entity.Item;

public interface ItemRepository extends JpaRepository<Item, Integer> {
    //List<Item> findAllByOrderByPriceDesc();
    //List<Item> findByPrice(Integer price);

    List<Item> findByNameAndPrice(String name, Integer price);
}
```

## (5-3) Controller を作成

リポジトリで用意した`findByNameAndPrice`を呼び出し、引数で条件検索に使用するデータを渡す

```java:/controller/databaseController.java
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import jp.co.sss.test_spring.bean.ItemBean;
import jp.co.sss.test_spring.entity.Item;
import jp.co.sss.test_spring.repository.ItemRepository;

@Controller
public class databaseController {
    @Autowired
    ItemRepository itemRepository;

    //@RequestMapping("/database/dbAllItems")
    //@RequestMapping("/database/dbAllItems/priceDesc")
    //@RequestMapping("/database/dbSelectName")
    //@RequestMapping("/database/dbItemsDetail/{id}")
    //@RequestMapping("/database/findByPrice/{price}")

    @RequestMapping("/database/findByPrice/{name}/{price}")
    public String findByNameAndPrice(@PathVariable String name, @PathVariable Integer price, Model model) {
        model.addAttribute("Items", itemRepository.findByNameAndPrice(name, price));
        return "database/dbAllItems";
    }

}
```

## (5-4) HTML を作成
[(1-4) HTMLを作成](#1-4-htmlを作成)をそのまま使用

## (5-5) 実行
spring boot実行して、ブラウザで検索
application.propertiesのファイルで指定した`<context-path>`を変更する
```
http://localhost:7777/<context-path>/database/findByPrice/スイカ/500
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/b0077746-f9c3-c20c-f548-8b2d26a6fa03.png" width="300" height="200">

# ■ 6. 曖昧検索
## 実装内容
曖昧なデータで検索を行う
```sql
-- SQLで実装する場合
SELECT * FROM Items 
WHERE name = '%ベリー%';
```

## (6-1) Entity を作成
[(1-1) Entity を作成](#1-1-entity-を作成)をそのまま使用

## (6-2) Repository を作成

・`Containing`を最後につけることで曖昧検索を行う

```java:/entity/ItemRepository.java
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

import jp.co.sss.test_spring.entity.Item;

public interface ItemRepository extends JpaRepository<Item, Integer> {
    //List<Item> findAllByOrderByPriceDesc();
    //List<Item> findByPrice(Integer price);
    //List<Item> findByNameAndPrice(String name, Integer price);

    List<Item> findByNameContaining(String name);
}
```

## (6-3) Controller を作成

リポジトリで用意した`findByNameContaining`を呼び出し、引数で曖昧検索に使用する文字を渡す

```java:/controller/databaseController.java
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import jp.co.sss.test_spring.bean.ItemBean;
import jp.co.sss.test_spring.entity.Item;
import jp.co.sss.test_spring.repository.ItemRepository;

@Controller
public class databaseController {
    @Autowired
    ItemRepository itemRepository;

    //@RequestMapping("/database/dbAllItems")
    //@RequestMapping("/database/dbAllItems/priceDesc")
    //@RequestMapping("/database/dbSelectName")
    //@RequestMapping("/database/dbItemsDetail/{id}")
    //@RequestMapping("/database/findByPrice/{price}")
    //@RequestMapping("/database/findByPrice/{name}/{price}")

    @RequestMapping("/database/findByNameLike/{name}")
    public String findByNameLike(@PathVariable String name, Model model) {
        model.addAttribute("Items", itemRepository.findByNameContaining(name));
        return "database/dbAllItems";
    }
}
```

## (6-4) HTML を作成
[(1-4) HTMLを作成](#1-4-htmlを作成)をそのまま使用

## (6-5) 実行
spring boot実行して、ブラウザで検索
application.propertiesのファイルで指定した`<context-path>`を変更する
```
http://localhost:7777/<context-path>/database/findByNameLike/ベリー
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/d5793175-26c3-cb63-6197-ac95bf652912.png" width="300" height="200">

# ■ 7. 登録
## 実装内容
データベースにデータを登録する
```sql
-- SQLで実装する場合
INSERT INTO items VALUES (id, name, price);
```

## (7-1) Entity を作成
[(1-1) Entity を作成](#1-1-entity-を作成)をそのまま使用

## (7-2) Repository を作成
[(2-2) Repository を作成](#2-2-repository-を作成)をそのまま使用

## (7-3) Bean を作成
[(3-3) Bean を作成](#3-3-bean-を作成)をそのまま使用


## (7-4) Form を作成
```java:form/ItemForm.java
public class ItemForm {
    private Integer id;
    private String name;
    private Integer price;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getPrice() {
        return price;
    }
    public void setPrice(Integer price) {
        this.price = price;
    }
}
```

## (7-5) Controller を作成
```java:/controller/databaseController.java
package jp.co.sss.test_spring.controller;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import jp.co.sss.test_spring.bean.ItemBean;
import jp.co.sss.test_spring.entity.Item;
import jp.co.sss.test_spring.form.ItemForm;
import jp.co.sss.test_spring.repository.ItemRepository;

@Controller
public class databaseController {
    @Autowired
    ItemRepository itemRepository;

    //@RequestMapping("/database/dbAllItems")
    //@RequestMapping("/database/dbAllItems/priceDesc")
    //@RequestMapping("/database/dbSelectName")
    //@RequestMapping("/database/dbItemsDetail/{id}")
    //@RequestMapping("/database/findByPrice/{price}")
    //@RequestMapping("/database/findByPrice/{name}/{price}")
    //@RequestMapping("/database/findByNameLike/{name}")

    @RequestMapping("/database/create/input")
    public String createInput() {
        return "database/dbCreateInput";
    }

    @RequestMapping(path = "/database/create/complete", method = RequestMethod.POST)
    public String createComplete(ItemForm form, Model model) {
        Item item =new Item();
        BeanUtils.copyProperties(form, item, "id");
        item = itemRepository.save(item);
        ItemBean itemBean = new ItemBean();
        BeanUtils.copyProperties(item, itemBean);
        model.addAttribute("Items", itemBean);
        return "database/dbItemsDetail";
    }
}
```

## (7-6) HTML を作成
```html:templates/database/dbCreateInput.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form method="post" th:action="@{/database/create/complete}">
        <span>商品名</span><input type="text" name="name" />
        <span>価格</span><input type="number" name="price" />
        <input type="submit" value="submit" />
    </form>
</body>
</html>
```

## (7-7) 実行
spring boot実行して、ブラウザで検索
application.propertiesのファイルで指定した`<context-path>`を変更する
```
http://localhost:7777/<context-path>/database/create/input
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/7b29706c-4fec-bae7-0f6f-e1bd6e69d018.png" width="300" height="200">

# ■ 8. 更新
## 実装内容
データベースのデータを更新する
```sql
-- SQLで実装する場合
UPDATE items SET name = new_name, price = new_price 
WHERE id = select_id;
```

## (8-1) Entity を作成
[(1-1) Entity を作成](#1-1-entity-を作成)をそのまま使用

## (8-2) Repository を作成
[(2-2) Repository を作成](#2-2-repository-を作成)をそのまま使用

## (8-3) Bean を作成
[(3-3) Bean を作成](#3-3-bean-を作成)をそのまま使用

## (8-4) Controller を作成
```java:/controller/databaseController.java
package jp.co.sss.test_spring.controller;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import jp.co.sss.test_spring.bean.ItemBean;
import jp.co.sss.test_spring.entity.Item;
import jp.co.sss.test_spring.form.ItemForm;
import jp.co.sss.test_spring.repository.ItemRepository;

@Controller
public class databaseController {
    @Autowired
    ItemRepository itemRepository;

    //@RequestMapping("/database/dbAllItems")
    //@RequestMapping("/database/dbAllItems/priceDesc")
    //@RequestMapping("/database/dbSelectName")
    //@RequestMapping("/database/dbItemsDetail/{id}")
    //@RequestMapping("/database/findByPrice/{price}")
    //@RequestMapping("/database/findByPrice/{name}/{price}")
    //@RequestMapping("/database/findByNameLike/{name}")
    //@RequestMapping("/database/create/input")
    //@RequestMapping(path = "/database/create/complete", method = RequestMethod.POST)
    
    @RequestMapping("/database/update/input/{id}")
    public String updateInput(@PathVariable Integer id, Model model) {
        Item item = itemRepository.getReferenceById(id);
        ItemBean itemBean = new ItemBean();
        BeanUtils.copyProperties(item, itemBean);
        model.addAttribute("Items", itemBean);
        return "database/dbUpdateInput";
    }

    @RequestMapping(path = "/database/update/complete/{id}", method = RequestMethod.POST)
    public String updateComplete(@PathVariable Integer id, ItemForm form, Model model) {
        Item item = itemRepository.getReferenceById(id);
        BeanUtils.copyProperties(form, item, "id");
        item = itemRepository.save(item);
        ItemBean itemBean = new ItemBean();
        BeanUtils.copyProperties(item, itemBean);
        model.addAttribute("Items", itemBean);
        return "database/dbItemsDetail";
    }
}
```

## (8-5) HTML を作成
```html:templates/database/dbUpdateInput.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form method = "post" th:action="@{/database/update/complete/}+${Items.id}">
        <span>name</span><input type="text" name="name" th:value="${Items.name}" />
        <span>price</span><input type="number" name="price" th:value="${Items.price}" />
        <input type="submit" value="submit" />
    </form>
</body>
</html>
```

## (8-6) 実行
spring boot実行して、ブラウザで検索
application.propertiesのファイルで指定した`<context-path>`を変更する
```
http://localhost:7777/<context-path>/database/update/input/1
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/2e5bcc7c-8e42-6be6-8ee7-41a5fb5b1321.png" width="300" height="200">

# ■ 9. 削除
## 実装内容
データベースのデータを削除する
```sql
-- SQLで実装する場合
DELETE FROM items 
WHERE id = 7;
```

## (9-1) Entity を作成
[(1-1) Entity を作成](#1-1-entity-を作成)をそのまま使用

## (9-2) Repository を作成
[(2-2) Repository を作成](#2-2-repository-を作成)をそのまま使用

## (9-3) Bean を作成
[(3-3) Bean を作成](#3-3-bean-を作成)をそのまま使用


## (9-4) Controller を作成
```java:/controller/databaseController.java
package jp.co.sss.test_spring.controller;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import jp.co.sss.test_spring.bean.ItemBean;
import jp.co.sss.test_spring.entity.Item;
import jp.co.sss.test_spring.form.ItemForm;
import jp.co.sss.test_spring.repository.ItemRepository;

@Controller
public class databaseController {
    @Autowired
    ItemRepository itemRepository;

    //@RequestMapping("/database/dbAllItems")
    //@RequestMapping("/database/dbAllItems/priceDesc")
    //@RequestMapping("/database/dbSelectName")
    //@RequestMapping("/database/dbItemsDetail/{id}")
    //@RequestMapping("/database/findByPrice/{price}")
    //@RequestMapping("/database/findByPrice/{name}/{price}")
    //@RequestMapping("/database/findByNameLike/{name}")
    //@RequestMapping("/database/create/input")
    //@RequestMapping(path = "/database/create/complete", method = RequestMethod.POST)
    //RequestMapping("/database/update/input/{id}")
    //@RequestMapping(path = "/database/update/complete/{id}", method = RequestMethod.POST)

    @RequestMapping("/database/delete/input")
    public String deleteInput(Model model) {
        model.addAttribute("Items", itemRepository.findAll());
        return "database/dbDeleteInput";
    }

    @RequestMapping(path = "/database/delete/complete", method = RequestMethod.POST)
    public String deleteComplete(ItemForm form) {
        itemRepository.deleteById(form.getId());
        return "redirect:/database/dbAllItems";
    }
}
```

## (9-5) HTML を作成
```html:/templates/database/dbDeleteInput.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form method="post" th:action="@{/database/delete/complete}">
        <span>id</span><input type="text" name="id" />
        <input type="submit" value="submit">
    </form><br><br>
    <tr th:each="item: ${Items}">
        <td th:text="${item.id}"></td>
        <td th:text="${item.name}"></td>
        <td th:text="${item.price}"></td><br>
    </tr>
</body>
</html>
```

## (9-6) 実行
spring boot実行して、ブラウザで検索
application.propertiesのファイルで指定した`<context-path>`を変更する
```
http://localhost:7777/<context-path>/database/delete/input
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/accb5234-a241-4150-2523-4ca24d598a2f.png" width="300" height="200">