質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

1回答

1910閲覧

「spring解体新書」で期待通りの結果が得られない。

Rivermouth

総合スコア17

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/08/03 08:28

編集2022/01/12 10:55

「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メソッドを記載し、調べてみましたがどうやら正しく渡されていないようでした。

試したこと

テキストの付録の正しいソースコードをそのままコピペしてみたが、ダメでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/08/03 09:41

Execetionをthrowsされてますがいずれも捕捉されてないのでしょうか。
Rivermouth

2020/08/03 10:18

していないと思います。 ちなみにテキストにはコメントアウトで //トランザクション確認のため、わざと例外をthrowする // if (rowNumber > 0) { // throw new DataAccessException("トランザクションテスト") { // }; // } というのも記載されておりました。 しかし、現在勉強しているソースコードには上記のコードは記載されておりません。 上記のコメントアウトは完成版のソースコードに記載されておりました。 何か関係があるのでしょうか?
YT0014

2020/08/03 16:17

更新時の user_id が、正しく渡されているか、各呼出し毎に確認してみてください。 postUserDetailUpdate()なら、System.out.println(form.getUserId());などの記述になるかと。
YT0014

2020/08/03 16:21

テーブル名 m_user のSQL内の大文字/小文字の表記ゆれが気になります。 データベース、OS、設定などによっては、テーブル名の不一致になる可能性があります。 データベース側のテーブル名も含め、全て小文字の m_user に統一することをお勧めします。
Rivermouth

2020/08/03 23:32

System.out.println("userId = " + form.getUserId()); と入力すると userId = としか出力されません。正しく渡されていないと思います。
Rivermouth

2020/08/03 23:35

各呼び出し毎に確認とありますが、どこを確認すればいいのでしょうか? 上記の場合はpostUserDetailUpdate()メソッド内にprintlnメソッドを記載しました。
m.ts10806

2020/08/04 00:26

質問は編集できますので、適宜追記してください。
YT0014

2020/08/04 00:58

ご提示いただいていない form の記述、または、操作の方法に誤りがあり、user_id が不明なのが原因だと思われますので、form に該当するファイル(jspかな?)をご確認頂き、該当レコードの取得後に更新操作を行っているか、操作手順の見直しをされることをお勧めします。
guest

回答1

0

Controller、Service、Repositoryの更新部分の実装内容には特に問題はありませんので、Controllerへ送信をする画面に誤りがあるのではないでしょうか。

投稿2020/08/22 00:37

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問