「Spring解体新書」というテキストを参考に勉強をしているのですが、テキスト通りにソースコードを入力しても期待した結果が返ってこないので、こちらに質問させていただきます。
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 public class UserDaoJdbcImpl implements UserDao{ @Autowired JdbcTemplate jdbc; //Userテーブルの件数を取得 @Override public int count() throws DataAccessException{ //Objectの取得 //全件取得してカウント int count = jdbc.queryForObject("SELECT COUNT(*) FROM m_user", Integer.class); return count; } //Userテーブルにデータを一件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{ //一件取得 Map<String, Object> map = jdbc.queryForMap("SELECT * FROM m_user" + " WHERE user_id = ?" , userId); //結果返却用の変数 User user = new User(); //取得したデータを結果返却用の変数にセットしていく user.setUserId((String) map.get("get_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{ //複数件のselect //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 = new User(); //Userインスタンスに取得したデータをセットする user.setUserId((String) map.get("user_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テーブルを一件更新 @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テーブルを一件削除 public int deleteOne(String userId) throws DataAccessException{ return 0; } //Userテーブルの全データをCSVに出力 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 com.example.demo.login.domain.model.User; import com.example.demo.login.domain.repository.UserDao; @Service public class UserService { @Autowired UserDao dao; //insert用メソッド public boolean insert(User user) { int rowNumber = dao.insertOne(user); boolean result = false; if(rowNumber > 0) { result = true; } return result; } public int count() { return dao.count(); } public List<User> selectMany(){ return dao.selectMany(); } public User selectOne(String userId) { 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; } }
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"; } //ユーザー一覧画面のGET用メソッド @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); } }
やりたいこと
ユーザー詳細ページでユーザーの情報の変更・更新。
問題点
ユーザーの更新をすると、更新失敗と表示されてしまい、更新できない。
userIdが正しく渡されているかどうかを調べるために、postUserDetailUpdate()メソッド内にprintlnメソッドを記載し、調べてみましたがどうやら正しく渡されていないようでした。
試したこと
テキストの付録の正しいソースコードをそのままコピペしてみたが、ダメでした。