【Java・SpringBoot】Spring JDBC でユーザー登録（SpringBootアプリケーション実践編10）

ホーム画面からユーザー一覧画面に遷移し、ユーザーの詳細を表示するアプリケーションを作成して
Spring JDBCの使い方について学びます⭐️
今回は前回作った画面に引き続き、**JDBC Templateを実装**して、**データを登録（insert）**する方法について学んでいきます^^
構成は前回の記事を参考にしてください

⭐️前回の記事
[【Java・SpringBoot】Spring JDBC（SpringBootアプリケーション実践編9）](【Java・SpringBoot】Spring JDBC（SpringBootアプリケーション実践編9）)

#データの登録（insert）
###updateメソッド
* リポジトリー用クラスのinsert用メソッドを作成
* JdbcTemplateクラスを使って登録・更新・削除する

```java
//例
int rowNumber = jdbc.update("INSERT INTO m_user(user_id," + " password," + " user_name," + " role)" + " VALUES(?, ?, ?, ?, ?, ?, ?)", 
                user.getUserId(),
                user.getPassword(),
                user.getUserName(),
                user.getBirthday(),
                user.getAge(),
                user.isMarriage(),
                user.getRole());
```
* 第１引数：**SQL文**を入れます
* 第２引数以降：**PreparedStatement**
    * PreparedStatementには、**SQL文の？の部分に入れる変数を引数にセット**
        * `VALUES(?, ?, ?, ?, ?, ?, ?)`
    * 引数に**セットした順番にSQL文に代入**される
* 戻り値には、**登録したレコード数が返る**

```UserDaoJdbcImpl.java
package com.example.demo.login.domain.repository.jdbc;

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

import com.example.demo.login.domain.model.User;
import com.example.demo.login.domain.repository.UserDao;

@Repository("UserDaoJdbcImpl")
public class UserDaoJdbcImpl implements UserDao {

    @Autowired
    JdbcTemplate jdbc;

    // Userテーブルの件数を取得.
    @Override
    public int count() throws DataAccessException {
        return 0;
    }

    /**
     Userテーブルにデータを1件insert.
    */
    @Override
    public int insertOne(User user) throws DataAccessException {

        int rowNumber = jdbc.update("INSERT INTO m_user(user_id,"
                + " password,"
                + " user_name,"
                + " birthday,"
                + " age,"
                + " marriage,"
                + " role)"
                + " VALUES(?, ?, ?, ?, ?, ?, ?)",
                user.getUserId(),
                user.getPassword(),
                user.getUserName(),
                user.getBirthday(),
                user.getAge(),
                user.isMarriage(),
                user.getRole());
        return rowNumber;
    }

    // Userテーブルのデータを１件取得
    @Override
    public User selectOne(String userId) throws DataAccessException {
        return null;
    }

    // Userテーブルの全データを取得.
    @Override
    public List<User> selectMany() throws DataAccessException {
        return null;
    }

    // Userテーブルを１件更新.
    @Override
    public int updateOne(User user) throws DataAccessException {
        return 0;
    }

    // Userテーブルを１件削除.
    @Override
    public int deleteOne(String userId) throws DataAccessException {
        return 0;
    }

    //SQL取得結果をサーバーにCSVで保存する
    @Override
    public void userCsvOut() throws DataAccessException {
    }
}

```

#サービスクラスにinsert用のメソッド追加
* insertメソッドで**リポジトリークラスのinsertOneメソッドを呼び出す**
* 戻り値が０より大きければ、"insert成功"の判定結果をリターン

```UserService.java
package com.example.demo.login.domain.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.demo.login.domain.model.User;
import com.example.demo.login.domain.repository.UserDao;

@Service
public class UserService {
    @Autowired
    UserDao dao;

    public boolean insert(User user) {
        // insert実行
        int rowNumber = dao.insertOne(user);
        // 判定用変数
        boolean result = false;

        if (rowNumber > 0) {
            // insert成功
            result = true;
        }
        return result;
    }
}
```

#ユーザー登録画面のコントローラークラス
###サービスクラスのinsertメソッドを呼び出す
* サービスクラスのメソッドに渡す**Userクラスをnew**する
    * Userクラスには、**画面から入力された値をセット**
    * サービスクラスの**insertメソッドを呼び出す**
        * `boolean result = userService.insert(user);`
    * コンソールにinsert結果出力


```SignupController.java
package com.example.demo.login.controller;

import java.util.LinkedHashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

import com.example.demo.login.domain.model.GroupOrder;
import com.example.demo.login.domain.model.SignupForm;
import com.example.demo.login.domain.model.User;
import com.example.demo.login.domain.service.UserService;

@Controller
public class SignupController {

    @Autowired
    private UserService userService;

    //ラジオボタン用変数
    private Map<String, String> radioMarriage;
    private Map<String, String> initRadioMarrige() {
        Map<String, String> radio = new LinkedHashMap<>();
        // 既婚、未婚をMapに格納
        radio.put("既婚", "true");
        radio.put("未婚", "false");
        return radio;
    }

    @GetMapping("/signup")
    public String getSignUp(@ModelAttribute SignupForm form, Model model) {
        // ラジオボタンの初期化メソッド呼び出し
        radioMarriage = initRadioMarrige();
        // ラジオボタン用のMapをModelに登録
        model.addAttribute("radioMarriage", radioMarriage);
        // signup.htmlに画面遷移
        return "login/signup";
    }

    @PostMapping("/signup")
    public String postSignUp(@ModelAttribute @Validated(GroupOrder.class) SignupForm form,
            BindingResult bindingResult,
            Model model) {

        // 入力チェックに引っかかった場合、ユーザー登録画面に戻る
        if (bindingResult.hasErrors()) {
            // GETリクエスト用のメソッドを呼び出して、ユーザー登録画面に戻ります
            return getSignUp(form, model);
        }

        // formの中身をコンソールに出して確認します
        System.out.println(form);

        // insert用変数
        User user = new User();
        user.setUserId(form.getUserId()); //ユーザーID
        user.setPassword(form.getPassword()); //パスワード
        user.setUserName(form.getUserName()); //ユーザー名
        user.setBirthday(form.getBirthday()); //誕生日
        user.setAge(form.getAge()); //年齢
        user.setMarriage(form.isMarriage()); //結婚ステータス
        user.setRole("ROLE_GENERAL"); //ロール（一般）

        // ユーザー登録処理
        boolean result = userService.insert(user);

        // ユーザー登録結果の判定
        if (result == true) {
            System.out.println("insert成功");
        } else {
            System.out.println("insert失敗");
        }
        // login.htmlにリダイレクト
        return "redirect:/login";
    }
}
```

#SpringBootで新規登録画面を確認！
* http://localhost:8080/signup
* ユーザー登録画面からフォーム入力し、ユーザーを登録
* 成功すれば、コンソールに`insert成功`と出ました〜〜〜^o^
* 次回は、insert結果を確認できるように、**複数件のselectとカウント**を実装します！

![inisert.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282755/b3de5834-fa9f-bb7f-ab23-b6f0373caa63.png)


```
//コンソール画面
メソッド開始： String com.example.demo.login.controller.SignupController.postSignUp(SignupForm,BindingResult,Model)
SignupForm(userId=nekosan@example.com, password=1, userName=NekoMohu, birthday=Sat Nov 11 00:00:00 JST 1111, age=22, marriage=false)
メソッド開始： int com.example.demo.login.domain.repository.jdbc.UserDaoJdbcImpl.insertOne(User)
メソッド終了： int com.example.demo.login.domain.repository.jdbc.UserDaoJdbcImpl.insertOne(User)
insert成功
メソッド終了： String com.example.demo.login.controller.SignupController.postSignUp(SignupForm,BindingResult,Model)
メソッド開始： String com.example.demo.login.controller.LoginController.getLogin(Model)
メソッド終了： String com.example.demo.login.controller.LoginController.getLogin(Model)
```