ホーム画面からユーザー一覧画面に遷移し、ユーザーの詳細を表示するアプリケーションを作成して、Spring JDBCの使い方について学びます⭐️
前回はユーザー更新処理を実装したので、今回はユーザー削除処理を実装します^^
構成は前回の記事を参考にしてください
⭐️前回の記事
【Java・SpringBoot】Spring JDBC でユーザー更新処理(SpringBootアプリケーション実践編13)
#リポジトリークラスを修正
- JdbcTemplateのupdateメソッドを使用
UserDaoJdbcImpl.java
//中略(全コードは下記参考)
// Userテーブルを1件削除.
@Override
public int deleteOne(String userId) throws DataAccessException {
//1件削除
int rowNumber = jdbc.update("DELETE FROM m_user WHERE user_id = ?", userId);
return rowNumber;
}
//中略
#サービスクラスを修正
UserService.java
//中略(全コードは下記参考)
/**
* 1件削除用メソッド.
*/
public boolean deleteOne(String userId) {
// 1件削除
int rowNumber = dao.deleteOne(userId);
// 判定用変数
boolean result = false;
if (rowNumber > 0) {
// delete成功
result = true;
}
return result;
}
//中略
#コントローラークラスに削除ボタンが押されたときのメソッドを追加
- 削除ボタン用のメソッドは@PostMappingのparams属性を使って指定
HomeController.java
//中略(全コードは下記参考)
/**
* ユーザー削除用処理.
*/
@PostMapping(value = "/userDetail", params = "delete")
public String postUserDetailDelete(@ModelAttribute SignupForm form,
Model model) {
System.out.println("削除ボタンの処理");
//削除実行
boolean result = userService.deleteOne(form.getUserId());
if (result == true) {
model.addAttribute("result", "削除成功");
} else {
model.addAttribute("result", "削除失敗");
}
//中略
#SpringBootを起動してユーザ一覧画面確認!
- http://localhost:8080/signup
- ユーザーを新規登録してから、ユーザー詳細画面でユーザーを削除(selectで取得件数が0件になるとエラーになる)
- ユーザー一覧に戻ると対象のユーザが消えています〜〜
- ここまでで、Jdbc Templateを使った基本のCRUD操作について学びました^o^
#リポジトリークラス全体コード
UserDaoJdbcImpl.java
package com.example.demo.login.domain.repository.jdbc;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
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 {
//全件取得してカウント
int count = jdbc.queryForObject("SELECT COUNT(*) FROM m_user", Integer.class);
return count;
}
// Userテーブルにデータを1件insert.
@Override
public int insertOne(User user) throws DataAccessException {
//1件登録
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 {
// 1件取得
Map<String, Object> map = jdbc.queryForMap("SELECT * FROM m_user"
+ " WHERE user_id = ?", userId);
// 結果返却用の変数
User user = new User();
// 取得したデータを結果返却用の変数にセットしていく
user.setUserId((String) map.get("user_id")); //ユーザーID
user.setPassword((String) map.get("password")); //パスワード
user.setUserName((String) map.get("user_name")); //ユーザー名
user.setBirthday((Date) map.get("birthday")); //誕生日
user.setAge((Integer) map.get("age")); //年齢
user.setMarriage((Boolean) map.get("marriage")); //結婚ステータス
user.setRole((String) map.get("role")); //ロール
return user;
}
// Userテーブルの全データを取得.
@Override
public List<User> selectMany() throws DataAccessException {
// M_USERテーブルのデータを全件取得
List<Map<String, Object>> getList = jdbc.queryForList("SELECT * FROM m_user");
// 結果返却用の変数
List<User> userList = new ArrayList<>();
// 取得したデータを結果返却用のListに格納していく
for (Map<String, Object> map : getList) {
//Userインスタンスの生成
User user = new User();
// Userインスタンスに取得したデータをセットする
user.setUserId((String) map.get("user_id")); //ユーザーID
user.setPassword((String) map.get("password")); //パスワード
user.setUserName((String) map.get("user_name")); //ユーザー名
user.setBirthday((Date) map.get("birthday")); //誕生日
user.setAge((Integer) map.get("age")); //年齢
user.setMarriage((Boolean) map.get("marriage")); //結婚ステータス
user.setRole((String) map.get("role")); //ロール
//結果返却用のListに追加
userList.add(user);
}
return userList;
}
// Userテーブルを1件更新.
@Override
public int updateOne(User user) throws DataAccessException {
//1件更新
int rowNumber = jdbc.update("UPDATE M_USER"
+ " SET"
+ " password = ?,"
+ " user_name = ?,"
+ " birthday = ?,"
+ " age = ?,"
+ " marriage = ?"
+ " WHERE user_id = ?",
user.getPassword(),
user.getUserName(),
user.getBirthday(),
user.getAge(),
user.isMarriage(),
user.getUserId());
return rowNumber;
}
// Userテーブルを1件削除.
@Override
public int deleteOne(String userId) throws DataAccessException {
//1件削除
int rowNumber = jdbc.update("DELETE FROM m_user WHERE user_id = ?", userId);
return rowNumber;
}
//SQL取得結果をサーバーにCSVで保存する
@Override
public void userCsvOut() throws DataAccessException {
}
}
#サービスクラス全体コード
UserService.java
package com.example.demo.login.domain.service;
import java.util.List;
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;
}
public int count() {
return dao.count();
}
public List<User> selectMany() {
// 全件取得
return dao.selectMany();
}
/**
* 1件取得用メソッド.
*/
public User selectOne(String userId) {
// selectOne実行
return dao.selectOne(userId);
}
public boolean updateOne(User user) {
// 判定用変数
boolean result = false;
// 1件更新
int rowNumber = dao.updateOne(user);
if (rowNumber > 0) {
// update成功
result = true;
}
return result;
}
/**
* 1件削除用メソッド.
*/
public boolean deleteOne(String userId) {
// 1件削除
int rowNumber = dao.deleteOne(userId);
// 判定用変数
boolean result = false;
if (rowNumber > 0) {
// delete成功
result = true;
}
return result;
}
}
#ホームコントローラークラス全体コード
HomeController.java
package com.example.demo.login.controller;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
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.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
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 HomeController {
@Autowired
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("/home")
public String getHome(Model model) {
//コンテンツ部分にユーザー詳細を表示するための文字列を登録
model.addAttribute("contents", "login/home :: home_contents");
return "login/homeLayout";
}
@GetMapping("/userList")
public String getUserList(Model model) {
//コンテンツ部分にユーザー一覧を表示するための文字列を登録
model.addAttribute("contents", "login/userList :: userList_contents");
//ユーザー一覧の生成
List<User> userList = userService.selectMany();
//Modelにユーザーリストを登録
model.addAttribute("userList", userList);
//データ件数を取得
int count = userService.count();
model.addAttribute("userListCount", count);
return "login/homeLayout";
}
@GetMapping("/userDetail/{id:.+}")
public String getUserDetail(@ModelAttribute SignupForm form,
Model model,
@PathVariable("id") String userId) {
// ユーザーID確認(デバッグ)
System.out.println("userId = " + userId);
// コンテンツ部分にユーザー詳細を表示するための文字列を登録
model.addAttribute("contents", "login/userDetail :: userDetail_contents");
// 結婚ステータス用ラジオボタンの初期化
radioMarriage = initRadioMarrige();
// ラジオボタン用のMapをModelに登録
model.addAttribute("radioMarriage", radioMarriage);
// ユーザーIDのチェック
if (userId != null && userId.length() > 0) {
// ユーザー情報を取得
User user = userService.selectOne(userId);
// Userクラスをフォームクラスに変換
form.setUserId(user.getUserId()); //ユーザーID
form.setUserName(user.getUserName()); //ユーザー名
form.setBirthday(user.getBirthday()); //誕生日
form.setAge(user.getAge()); //年齢
form.setMarriage(user.isMarriage()); //結婚ステータス
// Modelに登録
model.addAttribute("signupForm", form);
}
return "login/homeLayout";
}
@PostMapping(value = "/userDetail", params = "update")
public String postUserDetailUpdate(@ModelAttribute SignupForm form,
Model model) {
System.out.println("更新ボタンの処理");
//Userインスタンスの生成
User user = new User();
//フォームクラスをUserクラスに変換
user.setUserId(form.getUserId());
user.setPassword(form.getPassword());
user.setUserName(form.getUserName());
user.setBirthday(form.getBirthday());
user.setAge(form.getAge());
user.setMarriage(form.isMarriage());
//更新実行
boolean result = userService.updateOne(user);
if (result == true) {
model.addAttribute("result", "更新成功");
} else {
model.addAttribute("result", "更新失敗");
}
//ユーザー一覧画面を表示
return getUserList(model);
}
/**
* ユーザー削除用処理.
*/
@PostMapping(value = "/userDetail", params = "delete")
public String postUserDetailDelete(@ModelAttribute SignupForm form,
Model model) {
System.out.println("削除ボタンの処理");
//削除実行
boolean result = userService.deleteOne(form.getUserId());
if (result == true) {
model.addAttribute("result", "削除成功");
} else {
model.addAttribute("result", "削除失敗");
}
//ユーザー一覧画面を表示
return getUserList(model);
}
@PostMapping("/logout")
public String postLogout() {
return "redirect:/login";
}
@GetMapping("/userList/csv")
public String getUserListCsv(Model model) {
return getUserList(model);
}
}