0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

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

#データの登録(insert)
###updateメソッド

  • リポジトリー用クラスのinsert用メソッドを作成
  • JdbcTemplateクラスを使って登録・更新・削除する
//例
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());
  • 第1引数:SQL文を入れます
  • 第2引数以降: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テーブルのデータを1件取得
    @Override
    public User selectOne(String userId) throws DataAccessException {
        return null;
    }

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

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

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

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

#サービスクラスにinsert用のメソッド追加

  • insertメソッドでリポジトリークラスのinsertOneメソッドを呼び出す
  • 戻り値が0より大きければ、"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

//コンソール画面
メソッド開始: 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)
0
1
0

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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?