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"
まだ回答がついていません
会員登録して回答してみよう