Spring Bootでアプリ作成２

前回の続き。
https://qiita.com/YJ2222/items/8c29fc7fc2d886a9b35e

## ファイル作成
・必要なファイルを作成する。以下画像と「各ファイルの説明」を参考に作成する。
　<img width="224" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/95ab8b80-8f12-d4d3-af60-77a83364f385.png">
### ・各ファイルの説明。
- SpringApp1/src/main/java/com.ex1/<font color="blue">**dao**</font>
 - UserDAO.java → DBアクセス用のオブジェクト
- SpringApp1/src/main/java/com.ex1/<font color="blue">**model**</font>
 - User.java → ユーザ情報のインスタンスを生成するオブジェクト
 - UserFindLogic.java → DAOが取得した情報を受け取り、インスタンス化。その後controllerへ渡す。
- SpringApp1/src/main/resources/
 - data.sql → schema.sqlが作ったテーブルにデータをinsertするファイル。
 - schema.sql → プロジェクト起動時にDBへアクセスしテーブルを作成するファイル。
 - <font color="blue">**templates**</font>/userResult.html → postの処理が成功したときにフォワードされるview

## 作ったファイルにコードを書き込む。

```HAML:templates/userResult.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"></meta>
    <title>User</title>
</head>
<body>
    <h1>UserResult</h1>
    <table>
        <tr>
        	<!-- th:textはthymeleafの機能を使用しgetAttributeできる。 -->>
            <td>ID：</td><td th:text="${id}"></td>
        </tr>
        <tr>
            <td>ニックネーム：</td><td th:text="${nickname}"></td>
        </tr>
    </table>
<body>
</html>

```

```java:controller/UserController.java

package com.ex1.Controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.ex1.model.User;
import com.ex1.model.UserFindLogic;

@Controller
public class UserController {
	
	@Autowired // 依存性の注入。
	private UserFindLogic userFindLogic;

	@GetMapping("/")
	    public String getUser() {
	        return "user";
    }
	// user.htmlからのpostの処理。@RequestParamでnameの値を取得。
	@PostMapping("/user/db")
	public String postDbRequest(@RequestParam("text") String str, Model model) {
		
		int id = Integer.parseInt(str); // 文字列変換。
		// UserFindLogicをnewしなくても@Autowiredで依存性を注入しているため、User型としてUserFindLogicを実行することができる。
        User user = userFindLogic.findUser(id); // UserFindLogic.javaのfindUserメソッドを実行。
        // UserFindLogic.javaから戻り値を受け取ったら以下を実行。
        model.addAttribute("id", user.getUserId()); // ユーザ情報をsetAttributeする。
        model.addAttribute("nickname", user.getNickName());
        
        return "userResult"; // userResult.htmlにフォワード。
    }
	
}


```

```java:model/UserFindLogic.java

package com.ex1.model;

import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ex1.dao.UserDAO;

@Service // ビジネスロジックに付与するアノテーション。
public class UserFindLogic {
	
	@Autowired
	private UserDAO userDAO;
	
	public User findUser(int id) { // controllerからの指示によりメソッドを実行。
		
		Map<String, Object> map = userDAO.findUser(id); // UserDAOのfindUserを実行。
		// DAOからuser変数を受け取る。
        int userId = (Integer) map.get("user_id"); // 受け取った変数をmapで分解し.getで情報取得。
        String nickName = (String) map.get("nickname");

		User user = new User(); // userインスタンスを生成（User.java）
		user.setUserId(userId); // setterを実行。
		user.setNickName(nickName);
				
		return user; // controllerにuserインスタンスを戻り値として返す。
	}
}


```

```java:model/User.java

package com.ex1.model;

public class User {
	private int userId;
    private String nickName;    
    
    public void setUserId(int userId) {
    	this.userId = userId;
    }
    
    public void setNickName(String nickName) {
    	this.nickName = nickName;
    }
    
    public int getUserId() {
    	return userId;
    }
    
    public String getNickName() {
    	return nickName;
    }
}

```

```java:dao/UserDAO.java

package com.ex1.dao;

import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository // DAOクラスに付与するアノテーション。
public class UserDAO {
	@Autowired 
    private JdbcTemplate jdbcTemplate; // DB接続できるインスタンス。

    public Map<String, Object> findUser(int id) { // UserFindLogic.javaの指示によりメソッドを実行。

        // SELECT文を生成
        String query = "SELECT "
                + " * "
                + "FROM account "
                + "WHERE user_id=?";

        // jdbcTemplateの機能によってDBに対しSQLを実行。
        Map<String, Object> user = jdbcTemplate.queryForMap(query, id);

        return user; // 上記の処理結果をUserFindLogic.javaに戻り値として返す。
    }
}

```

```java:templates/userResult.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"></meta>
    <title>User</title>
</head>
<body>
    <h1>UserResult</h1>
    <table>
        <tr>
            <td>ID：</td><td th:text="${id}"></td>
        </tr>
        <tr>
            <td>ニックネーム：</td><td th:text="${nickname}"></td>
        </tr>
    </table>
<body>
</html>

```

```java:src/main/resources/application.properties

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driver-class-name=org.h2.Driver
spring.datasouce.username=sa
spring.datasouce.password=
spring.datasource.sql-script-encoding=UTF-8
spring.h2.console.enabled=true
spring.datasource.initialize=true
spring.datasource.schema=classpath:schema.sql
spring.datasource.data=classpath:data.sql

```

```java:src/main/resources/data.sql

INSERT INTO account (user_id, nickname, password) VALUES (1, 'user1', 'user1+');

```

```java:src/main/resources/schema.sql

CREATE TABLE IF NOT EXISTS account (
    user_id INT PRIMARY KEY,
    nickname VARCHAR(50),
    password VARCHAR(50)
);

```

・処理の流れは、コードのコメント欄と以下の画像を参考にすると想像しやすい。
<img width="663" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/2b4203c7-6300-d99a-c2c2-0c94cdc1bad4.png">


以上です。これでローカル環境でDBの接続までできました。