LoginSignup
3

More than 3 years have passed since last update.

Spring Bootでアプリ作成2

Posted at

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

ファイル作成

・必要なファイルを作成する。以下画像と「各ファイルの説明」を参考に作成する。
 1.png

・各ファイルの説明。

  • SpringApp1/src/main/java/com.ex1/dao
    • UserDAO.java → DBアクセス用のオブジェクト
  • SpringApp1/src/main/java/com.ex1/model
    • User.java → ユーザ情報のインスタンスを生成するオブジェクト
    • UserFindLogic.java → DAOが取得した情報を受け取り、インスタンス化。その後controllerへ渡す。
  • SpringApp1/src/main/resources/
    • data.sql → schema.sqlが作ったテーブルにデータをinsertするファイル。
    • schema.sql → プロジェクト起動時にDBへアクセスしテーブルを作成するファイル。
    • templates/userResult.html → postの処理が成功したときにフォワードされるview

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

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>

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にフォワード。
    }

}


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インスタンスを戻り値として返す。
    }
}


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;
    }
}

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に戻り値として返す。
    }
}

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>

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

src/main/resources/data.sql

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

src/main/resources/schema.sql

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

・処理の流れは、コードのコメント欄と以下の画像を参考にすると想像しやすい。
3.png

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3