ホーム画面からユーザー一覧画面に遷移し、ユーザーの詳細を表示するアプリケーションを作成して、Spring JDBCの使い方について学びます⭐️
前回はユーザー詳細画面を作ったので、今回はユーザー更新処理を実装します^^
構成は前回の記事を参考にしてください
⭐️前回の記事
【Java・SpringBoot】Spring JDBC でユーザー詳細画面(SpringBootアプリケーション実践編12)
#リポジトリークラス修正
- JdbcTemplateのupdateメソッドを使用
- SQL文と、PreparedStatementの値を引数に渡していく
int rowNumber = jdbc.update("UPDATE M_USER" ...+ " WHERE user_id = ?", user.getPassword(),...user.getUserId());
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 {
return 0;
}
@Override
public void userCsvOut() throws DataAccessException {
}
}
#サービスクラスを修正
- 0より大きい値が返ってきたらupdate成功と判断
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();
}
public User selectOne(String userId) {
// selectOne実行
return dao.selectOne(userId);
}
/**
* 1件更新用メソッド.
*/
public boolean updateOne(User user) {
// 判定用変数
boolean result = false;
// 1件更新
int rowNumber = dao.updateOne(user);
if (rowNumber > 0) {
// update成功
result = true;
}
return result;
}
}
#コントローラークラスを修正
###ボタン名によるメソッド判定
- 更新処理の@PostMappingアノテーションで更新処理用のメソッドと削除処理用のメソッドを分ける
- ユーザー詳細画面では、更新/削除ボタンのどちらを押しても
/userDetail
にPOSTする - 更新処理か、削除処理かを判別する必要がある
- →params属性を使って、URLとボタンのname属性の両方を見て、処理を判断できる
- ユーザー詳細画面では、更新/削除ボタンのどちらを押しても
- ユーザー詳細画面の更新ボタンのhtmlでいうと
<button class="btn btn-primary btn-lg pull-right" type="submit" name="update">更新</button>
- このname属性の値を、params属性に入れることで、ボタンによってコントローラークラスのメソッドを分けることができる!
@PostMapping(value = "/userDetail", params = "update")
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("/logout")
public String postLogout() {
//ログイン画面にリダイレクト
return "redirect:/login";
}
@GetMapping("/userList/csv")
public String getUserListCsv(Model model) {
return getUserList(model);
}
}
#SpringBootを起動してユーザ一覧画面確認!
- http://localhost:8080/userList
- ユーザー詳細画面から、名前を変更して更新ボタンを押し、ユーザー一覧画面に戻ると表示内容が変わることが確認できます
- これで更新処理を実装できました〜^o^