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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Spring MVC

Spring MVCとは、Javaを用いてWebアプリケーションを開発できるフレームワーク。アーキテクチャにMVCを採用しており、画面遷移と入出力パラメータの受け渡しの基本的な機能の他、ユーザーの送信したパラメータに対する入力チェックなどさまざまな機能を持ちます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

解決済

Spring MVCで演算をした後にJDBCTemplateのメソッドupdateを使うとうまくいきません

packman
packman

総合スコア11

Spring MVC

Spring MVCとは、Javaを用いてWebアプリケーションを開発できるフレームワーク。アーキテクチャにMVCを採用しており、画面遷移と入出力パラメータの受け渡しの基本的な機能の他、ユーザーの送信したパラメータに対する入力チェックなどさまざまな機能を持ちます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

1回答

0評価

0クリップ

249閲覧

投稿2022/01/06 11:07

編集2022/01/07 01:46

Spring MVCを使い簡易的なバンクシステムで作っています。
'預かりメソッド'と'引き出しメソッド'を作成したのですが、うまくいきません。
例えば、4万円の残高があり、最初に1万円引き出すと残高は3万円になるのですが、その次に2万円引き出すと残高は2万円になります。なぜでしょうか?

UserController

package com.banksystem.controller; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.banksystem.model.User; import com.banksystem.model.UserInput; import com.banksystem.service.BSService; @Controller public class UserController { @Autowired BSService service; @Autowired HttpSession session; /* ****************** **Deposit Method** ****************** */ @RequestMapping(value = "/deposit", method = RequestMethod.GET) public String toDeposit(Model model) { UserInput userInput = new UserInput(); model.addAttribute("userInput", userInput); return "deposit"; } @RequestMapping(value = "/deposit_p", method = RequestMethod.POST) public String deposit(Model model, UserInput userInput) { User user = new User(); int inputNum; Integer amount; inputNum = userInput.getInputNum(); user = (User) session.getAttribute("User"); amount = user.getAmount(); //初回利用時 if(amount == null) { amount = 0; } amount = amount + inputNum; Integer id = user.getId(); int numRow = service.deposit(amount, id); //failed if(numRow > 1) { session.invalidate(); model.addAttribute("message", "エラーが発生しました。もう一度最初からやり直してください。"); return "end"; } model.addAttribute("message", "預け入れが完了しました"); return "topMain"; } /* ******************* **Withdraw Method** ******************* */ @RequestMapping(value = "/withdraw", method = RequestMethod.GET) public String toWithdraw(Model model) { UserInput userInput = new UserInput(); model.addAttribute("userInput", userInput); return "withdraw"; } @RequestMapping(value = "withdraw_p", method = RequestMethod.POST) public String withdraw(Model model, UserInput userInput) { User user = new User(); int inputNum; Integer amount; inputNum = userInput.getInputNum(); user = (User) session.getAttribute("User"); amount = user.getAmount(); //初回利用時 if(amount == null) { amount = 0; } //be negative if(amount <= inputNum) { model.addAttribute("message", "残高が不足しています"); UserInput userInput1 = new UserInput(); model.addAttribute("userInput", userInput1); return "withdraw"; } amount = amount - inputNum; Integer id = user.getId(); int numRow = service.withdraw(amount, id); //failed if(numRow > 1) { session.invalidate(); model.addAttribute("message", "エラーが発生しました。もう一度最初からやり直してください。"); return "end"; } model.addAttribute("message", "お引き出しが完了しました"); return "topMain"; } }

Dao.java

package com.banksystem.dao; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Repository; import com.banksystem.model.Contact; import com.banksystem.model.User; @Repository public interface Dao { //login method public User login(String loginId, String loginPass) throws DataAccessException; //register method public int register(User user) throws DataAccessException; //contact method public int contact(Contact contact) throws DataAccessException; //deposit method public int deposit(int id, int sum) throws DataAccessException; //withdraw method public int withdraw(int id, int sum) throws DataAccessException; }

JdbcDao

package com.banksystem.dao; 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.banksystem.model.Contact; import com.banksystem.model.User; @Repository public class JdbcDao implements Dao{ @Autowired JdbcTemplate jdbc; @Override public User login(String loginId, String loginPass) throws DataAccessException { User user = new User(); try { String sql = "SELECT * FROM users_info WHERE loginId = ? AND loginPass = ?"; Map<String, Object> map = jdbc.queryForMap(sql, loginId, loginPass); user.setId((Integer) map.get("id")); user.setName((String) map.get("name")); user.setPhone((String)map.get("phone")); user.setEmail((String)map.get("email")); user.setLoginId((String)map.get("loginId")); user.setLoginPass((String)map.get("loginPass")); user.setAmount((Integer)map.get("amount")); }catch(Exception e) { e.printStackTrace(); } return user; } @Override public int register(User user) throws DataAccessException { int rowNum = -1; try { String sql = "INSERT INTO users_info(name, phone, email, loginId, loginPass) VALUES(?, ?, ?, ?, ?)"; rowNum = jdbc.update(sql, user.getName(), user.getPhone(), user.getEmail(), user.getLoginId(), user.getLoginPass()); }catch(Exception e) { e.printStackTrace(); } return rowNum; } @Override public int contact(Contact contact) throws DataAccessException { int rowNum = -1; try { String sql = "INSERT INTO contacts(email, message) VALUES(?, ?)"; rowNum = jdbc.update(sql, contact.getEmail(), contact.getMessage()); }catch(Exception e) { e.printStackTrace(); } return rowNum; } @Override public int deposit(int id, int sum) throws DataAccessException{ int rowNum = -1; try { String sql = "UPDATE users_info SET amount=? WHERE id=?"; rowNum = jdbc.update(sql, sum, id); }catch(DataAccessException e) { e.printStackTrace(); } return rowNum; } @Override public int withdraw(int id, int sum) throws DataAccessException { int rowNum = -1; try { String sql = "UPDATE users_info SET amount=? WHERE id=?"; rowNum = jdbc.update(sql, sum, id); }catch(DataAccessException e) { e.printStackTrace(); } return rowNum; } }

BSService

package com.banksystem.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.banksystem.dao.Dao; import com.banksystem.model.Contact; import com.banksystem.model.User; @Service public class BSService { @Autowired Dao dao; //login public User login(String loginId, String loginPass) { User user = dao.login(loginId, loginPass); return user; } //register public int register(User user) { int rowNum = dao.register(user); return rowNum; } //contact public int contact(Contact contact) { int rowNum = dao.contact(contact); return rowNum; } //deposit public int deposit(int id, int sum) { int rowNum = dao.deposit(sum, id); return rowNum; } //withdraw public int withdraw(int id, int sum) { int rowNum = dao.deposit(sum, id); return rowNum; } }

1回目のデバッグ(残高40000、引き出し10000)
イメージ説明

DataBase
id name phone email loginId loginPass amount
"6" "Test" "09012345678" "test@gmail.com" "test" "test" "30000"


2回目のデバッグ(残高30000、引き出し20000)(本来は10000になる)
イメージ説明

DataBase
id name phone email loginId loginPass amount
"6" "Test" "09012345678" "test@gmail.com" "test" "test" "20000"

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

xebme

2022/01/07 00:22

if(amount <= inputNum) { この条件は、引き出せる? 残高不足? どちらですか。
packman

2022/01/07 01:18

残高不足です
xebme

2022/01/07 01:40

質問の文脈が分からなくなりました。 >残高は3万円になるのですが、その次に2万円引き出すと残高は変わらずに2万円になります。なぜでしょうか? 残高は3万円から2万円に変わったと読めるのですが。
packman

2022/01/07 01:45

すみません。表記ミスです。"変わらずに"はいりません。
xebme

2022/01/08 00:56

2回目のデバッグの画像を見ると、user.amount.valueが40000となっています。これが残高として使われている可能性は? 40000 - 20000 = 20000 となります。
packman

2022/01/08 01:00

はい。そうなんです。1回目の結果がコミットされてない様に思えるのですが"自動コミット"をONにしています。何故かJDBCTemplate.updateで数値を変更した場合、数値が正しく反映されません。解決方法がわかりません。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Spring MVC

Spring MVCとは、Javaを用いてWebアプリケーションを開発できるフレームワーク。アーキテクチャにMVCを採用しており、画面遷移と入出力パラメータの受け渡しの基本的な機能の他、ユーザーの送信したパラメータに対する入力チェックなどさまざまな機能を持ちます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます