ATM应用实现
前端界面——控制器——Service层——Dao层——数据库
主程序:
package bank.atm; import bank.atm.controller.bank.ATMController; import bank.atm.domain.ATM; import bank.atm.domain.Bank; import bank.atm.ui.ATMUISupport; import bank.atm.util.tools.BasicTools; import java.util.Scanner; public class SystemEnter { public static ATM atmSys;//ATM实例 /** * ATM 系统入口的main方法 */ public SystemEnter() { } public static void main(String[] args) { if (atmSys == null) { instanceATM(); } ATMUISupport.drawingWelcomeUI();//输出欢迎界面 } private static void instanceATM() { Scanner input = BasicTools.getScanner(); System.out.println("请输入测试应用的ATM编号"); String atmId = input.next(); Bank bank = null; try { ATMController atmCtrl = new ATMController(); atmSys = atmCtrl.loadATMById(atmId); bank = atmCtrl.loadBankById(atmSys.getBankId()); atmSys.setBank(bank); } catch (Exception var4) { var4.printStackTrace(); } } }
UI界面:
package bank.atm.ui; import bank.atm.SystemEnter; import bank.atm.controller.account.AccountInfoController; import bank.atm.domain.AccountInfo; import bank.atm.util.tools.BasicTools; import java.math.BigDecimal; import java.util.Map; import java.util.Scanner; public class ATMUISupport { public ATMUISupport() { } /** * 输入ATM机号码以后的欢迎界面 */ public static void drawingWelcomeUI() { System.out.println("**********************************************"); System.out.println("**********************************************"); System.out.println("*********** 欢迎使用 [" + SystemEnter.atmSys.getBank().getName() + "] ATM系统************"); System.out.println("*********** 此系统已经与报警中心联网 ***************"); System.out.println("*********** 如果你遇到危险时请按下报警按钮***********"); System.out.println("*********** 警察叔叔会第一时间来帮助你的哦***********"); System.out.println("****************<<无卡 无存折>>*****************"); System.out.println("**********************************************"); if (SystemEnter.atmSys.getAccount() == null) { drawingInsertCardUI(); } } /** * 输出插入银行卡界面 */ public static void drawingInsertCardUI() { System.out.println("//////////////////////////////////////////////"); System.out.println("////// 请插入银行卡 /////////////////////////////"); System.out.println("//////////////////////////////////////////////"); String cardNum = BasicTools.getScanner().next(); AccountInfoController accountCtrl = new AccountInfoController(); AccountInfo account = accountCtrl.validateAccountInfo(cardNum); if (account == null) {//卡无效 System.out.println("您的银行卡是无效的"); drawingPullOutUI();//退卡 } else if (account.getFrozen() == 1) {//银行卡被锁定 System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); System.err.println("!!!!!!!!!!! 此卡处于锁定状态,请退卡 !!!!!!!!!!!!"); System.err.println("!!!! 如需解锁,请本人持有效证件到本行柜台办理 !!!!!!"); System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); drawingPullOutUI(); } else {//银行卡有效 SystemEnter.atmSys.setAccount(account);//设置为ATM中正在操作的卡 drawingEnterPasswordUI();//调用提示用户输入密码的方法 } } /** * 输出提示用户输入密码界面 */ public static void drawingEnterPasswordUI() { boolean flag = false; while(true) {//循环处理用户密码输入及选择退卡 System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); System.out.println(">>>>>>>>> 继续请输入1 退卡请输入0 >>>>>>>>>>"); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); Scanner input = BasicTools.getScanner();//new一个Scanner String action = input.next();//使用字符串接收用户输入 if (!action.trim().equals("1")) {//用户选择退出 flag = true;//设置flag为true,方便后面调用退出界面的方法 break;//退出循环,这个循环下面的内容都不再执行 } System.out.println("************ 请输入6位数字密码 **************"); String password = input.next();//使用字符串接收用户输入 if (BasicTools.validDig(password) && password.length() == 6) {//调用验证密码是否都是数字的方法,并且密码的长度要求等于6 /* 执行数据库密码验证 */ AccountInfoController controller = new AccountInfoController();//声明一个controller对象 /* 执行验证密码的方法,传入的参数是获取当前atmSys(银行卡对象)的账号和密码 */ int res = controller.validatePassword(SystemEnter.atmSys.getAccount().getAccount(), Integer.parseInt(password)); if (res == 1) {//验证密码通过 break;//结束本次循环 } /** * 修改密码输入错误次数 */ SystemEnter.atmSys.modifyPasswordInputErrorNum(); System.out.println("##########################################"); System.out.println("########## 系统提示 密码不正确 ###########"); System.out.println("##########################################"); if (SystemEnter.atmSys.getAccount().getPasswordEnterErrorNumber() == 2) { System.err.println("##########################################"); System.err.println("######### 您已经2次输入密码错误 ############"); System.err.println("######### 如果3次输入错误将锁定此卡 ##########"); System.err.println("##########################################"); } else if (SystemEnter.atmSys.getAccount().getPasswordEnterErrorNumber() == 3) { System.err.println("##########################################"); System.err.println("######### 您已经3次输入密码不错误 ###########"); System.err.println("######### 此卡已被冻结 如果是您本人 ###########"); System.err.println("######## 请持有效证件到本行柜台办理 ###########"); System.err.println("##########################################"); /* 执行锁定用户的方法 */ controller.lockAccount(SystemEnter.atmSys.getAccount().getAccount()); flag = true; break;//退出循环 } } else { System.out.println("*********** 系统提示:密码必需是6位数字 *****************"); } } if (!flag) { drawingBizUI();//输入密码正确时flag是false,这里!flase等于true,条件满足,转到登录成功后页面:主菜单 } else {//退卡 drawingPullOutUI();//用户选择退出时或者密码累积输错3次时flag是true,返回到退出界面 } } /** * 打印主菜单的方法 */ private static void drawingBizUI() { System.out.println("\n\n"); System.out.println("□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□"); /* 判断取款机里的钱是否大于最小的单次取款金额(100元),如果钱不够,就不显示取款菜单了,只能进行存款和转账操作 */ if (SystemEnter.atmSys.getTotal().doubleValue() >= SystemEnter.atmSys.getSingleWithdrawMin().doubleValue()) { System.out.println("□□□□□ 取款请输入 1 □□□□□□□□□□□□□□□□□□□□□□□□□"); } System.out.println("□□□□□ 存款请输入 2 □□□□□□□□□□□□□□□□□□□□□□□□□"); System.out.println("□□□□□ 转账请输入 3 □□□□□□□□□□□□□□□□□□□□□□□□□"); System.out.println("□□□□□ 查询请输入 4 □□□□□□□□□□□□□□□□□□□□□□□□□"); System.out.println("□□□□□ 修改密码请输入 5 □□□□□□□□□□□□□□□□□□□□□□"); System.out.println("□□□□□ 退卡请输入 6 □□□□□□□□□□□□□□□□□□□□□□□□□"); System.out.println("□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□"); System.out.println("--------- 请按以上提示输入回车继续 ---------"); /* 获取用户的输入,调用confirmOperation方法,判断用户的输入并调用相应的方法 */ String action = BasicTools.getScanner().next(); confirmOperation(action);//调用确认用户选择项方法 } /** * 主菜单判断用户输入数字,调用对应方法 * @param action */ private static void confirmOperation(String action) { switch(action.hashCode()) { case 49: if (action.equals("1")) { drawingWithdrawMoneyUI(); return; } break; case 50: if (action.equals("2")) { drawingDepositUI(); return; } break; case 51: if (action.equals("3")) { drawingTransferAccountsUI(); return; } break; case 52: if (action.equals("4")) { drawingBusinessQueryUI(); return; } break; case 53: if (action.equals("5")) { drawingModifyPasswordUI(); return; } break; case 54: if (action.equals("6")) { drawingPullOutUI(); return; } } drawingPullOutUI(); } /** * 退卡的方法 */ public static void drawingPullOutUI() { System.out.println("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※"); System.out.println("※※※※※※※※※※ 请取出您的银行卡 ※※※※※※※※※※"); System.out.println("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※"); SystemEnter.atmSys.setAccount((AccountInfo)null);//设置银行卡为null drawingWelcomeUI();//返回欢迎页面 } /** * 取款菜单 */ private static void drawingWithdrawMoneyUI() { boolean bool = true; System.out.println("取款"); while(bool) { System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); System.out.println("$$$$$$$$$$$$$$$ 请输入取款金额 $$$$$$$$$$$$$$$$"); System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); String money = BasicTools.getScanner().next();//用字符串接收用户输入 //验证是否是数字 if (!BasicTools.validDig(money)) {//调用BasicTools类里验证是否为数字的方法 System.err.println("########## 系统提示 必需是数字 ###########"); System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####"); if ("1".equals(BasicTools.getScanner().next())) { continue;//结束这个循环 } //验证是否是整百数字 } else if (Integer.parseInt(money) % 100 != 0) {//转换成数值类型,除以100取余,如果余数不等于0意味着不是整百数数字 System.err.println("########## 系统提示 取款金额必需是整佰数 ###########"); System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####"); if ("1".equals(BasicTools.getScanner().next())) { continue; } //验证取款金额大于ATM剩余金额 } else if (Double.parseDouble(money) > SystemEnter.atmSys.getTotal().doubleValue()) {//比较用户取款金额和ATM余额 System.err.println("########## 系统提示 ATM 余额不足 ###########"); System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####"); if ("1".equals(BasicTools.getScanner().next())) { continue; } //验证取款金额大于等于卡余额 } else if (Double.parseDouble(money) > SystemEnter.atmSys.getAccount().getBalance().doubleValue() - 1.0D) {//取款金额是否大于卡余额减一 System.err.println("########## 系统提示 您的账户余额不足 ###########"); System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####"); if ("1".equals(BasicTools.getScanner().next())) { continue; } //验证取款金额大于ATM单次最高取款金额 } else { if (Double.parseDouble(money) > SystemEnter.atmSys.getSingleWithdrawMax().doubleValue()) {//取款金额是否大于ATM单次最高取款金额 System.err.println("########## 系统提示 单次取款金额不能大于ATM单次取款上限" + SystemEnter.atmSys.getSingleWithdrawMax().longValue() + " ###########"); System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####"); if ("1".equals(BasicTools.getScanner().next())) { continue; } break; } //取款后修改ATM系统实例余额与ATM中银行卡余额 AccountInfoController ctrl = new AccountInfoController(); //调用控制器中withdrawMoney的方法,获取到当前的ATM机对象,并将金额作为参数传递过去 Map<String, Double> map = ctrl.withdrawMoney(SystemEnter.atmSys.getAccount(), new BigDecimal(money)); if (((Double)map.get("res")).intValue() == 3) { System.out.println("☆☆☆☆☆☆☆☆ 恭喜您,本次业务交易成功! ☆☆☆☆☆☆☆☆"); System.out.println("☆☆☆☆☆☆☆ 本次取款 " + money + "元☆☆☆☆☆☆☆☆"); SystemEnter.atmSys.modifyATMBalance(new BigDecimal(money), -1); SystemEnter.atmSys.modifyAccountBalance(new BigDecimal(money), (Double)map.get("poundage"), -1); System.out.println("☆☆☆☆☆☆☆ 手续费 " + map.get("poundage").doubleValue() + "元☆☆☆☆☆☆☆☆"); System.out.println("ATM 当前余额 " + SystemEnter.atmSys.getTotal().doubleValue()); System.out.println("银行卡 当前余额 " + SystemEnter.atmSys.getAccount().getBalance().doubleValue()); } else if (((Double)map.get("res")).intValue() == -1) { System.out.println("☆☆☆☆☆☆☆☆ 本次操作是跨行取款,收取手续费后余额不足 ☆☆☆☆☆☆☆☆"); } else if (((Double)map.get("res")).intValue() == -2) { System.out.println("☆☆☆☆☆☆☆☆ 每日累计取款总额已超出ATM最高限制 ☆☆☆☆☆☆☆☆"); } else if (((Double)map.get("res")).intValue() == -3) { System.out.println("☆☆☆☆☆☆☆☆ 每日累计取款次数已超出ATM最高限制 ☆☆☆☆☆☆☆☆"); } else if (((Double)map.get("res")).intValue() == -4) { System.out.println("☆☆☆☆☆☆☆☆ 每日累计取款总额超出银行卡最高限制 ☆☆☆☆☆☆☆☆"); } } break; } drawingBizUI();//返回主菜单 } /** * 存款菜单 */ private static void drawingDepositUI() { System.out.println("存款"); boolean bool = true; while(bool) { System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); System.out.println("$$$$$$$$$$$$$$$ 请输入存款金额 $$$$$$$$$$$$$$$$"); System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); String money2 = BasicTools.getScanner().next();//用字符串接收用户输入 //验证是否是数字 if (!BasicTools.validDig(money2)) {//调用BasicTools类里验证是否为数字的方法 System.err.println("########## 系统提示 必需是数字 ###########"); System.err.println("##### 继续存款请输入1 返回主菜单请输入2 #####"); if ("1".equals(BasicTools.getScanner().next())) { continue;//结束这个循环 } //验证是否是整百数字 } else if (Integer.parseInt(money2) % 100 != 0) {//转换成数值类型,除以100取余,如果余数不等于0意味着不是整百数数字 System.err.println("########## 系统提示 存款金额必需是整佰数 ###########"); System.err.println("##### 继续存款请输入1 返回主菜单请输入2 #####"); if ("1".equals(BasicTools.getScanner().next())) { continue; } //验证存款金额小于ATM单次最低存款金额 } else if (Double.parseDouble(money2) < SystemEnter.atmSys.getSingleDepositMin().doubleValue()){//存款金额是否小于ATM单次最低存款金额 System.err.println("########## 系统提示 单次存款金额不能小于ATM单次存款下限" + SystemEnter.atmSys.getSingleDepositMin().longValue() + " ###########"); System.err.println("##### 继续存款请输入1 返回主菜单请输入2 #####"); if ("1".equals(BasicTools.getScanner().next())) { continue; } break; //验证存款金额大于ATM单次最高存款金额 } else{ if (Double.parseDouble(money2) > SystemEnter.atmSys.getSingleDepositMax().doubleValue()) {//存款金额是否大于ATM单次最高存款金额 System.err.println("########## 系统提示 单次存款金额不能大于ATM单次存款上限" + SystemEnter.atmSys.getSingleDepositMax().longValue() + " ###########"); System.err.println("##### 继续存款请输入1 返回主菜单请输入2 #####"); if ("1".equals(BasicTools.getScanner().next())) { continue; } break; } //存款后修改ATM系统实例余额与ATM中银行卡余额 AccountInfoController ctrl = new AccountInfoController(); //调用控制器中withdrawMoney的方法,获取到当前的ATM机对象,并将金额作为参数传递过去 Map<String, Double> map = ctrl.depositMoney(SystemEnter.atmSys.getAccount(), new BigDecimal(money2)); if (((Double)map.get("res")).intValue() == 3) { System.out.println("☆☆☆☆☆☆☆☆ 恭喜您,本次业务交易成功! ☆☆☆☆☆☆☆☆"); System.out.println("☆☆☆☆☆☆☆ 本次存款 " + money2 + "元☆☆☆☆☆☆☆☆"); SystemEnter.atmSys.modifyATMBalance(new BigDecimal(money2), 1); SystemEnter.atmSys.modifyAccountBalance(new BigDecimal(money2), (Double)map.get("poundage"), 1); System.out.println("☆☆☆☆☆☆☆ 手续费 " + map.get("poundage").doubleValue() + "元☆☆☆☆☆☆☆☆"); System.out.println("ATM 当前余额 " + SystemEnter.atmSys.getTotal().doubleValue()); System.out.println("银行卡 当前余额 " + SystemEnter.atmSys.getAccount().getBalance().doubleValue()); } else { System.out.println("☆☆☆☆☆☆☆☆ 未知错误 ☆☆☆☆☆☆☆☆"); } } break; } drawingBizUI();//返回主菜单 } /** * 转账菜单 */ private static void drawingTransferAccountsUI() { /** * 请用户输入转账银行卡号界面 */ System.out.println("//////////////////////////////////////////////"); System.out.println("////// 请输入要转入的银行卡卡号 /////////////////////////////"); System.out.println("//////////////////////////////////////////////"); String cardNum2 = BasicTools.getScanner().next(); AccountInfoController accountCtrl = new AccountInfoController(); AccountInfo account2 = accountCtrl.validateAccountInfo(cardNum2); if (account2 == null) {//卡无效 System.out.println("您的银行卡是无效的"); System.err.println("##### 重新输入卡号请输入1 返回主菜单请输入2 #####"); String flag = BasicTools.getScanner().next();//用字符串接收用户输入 if (flag=="1"){ drawingTransferAccountsUI();//重新输入银行卡 }else if(flag == "2"){ drawingBizUI();//返回主菜单 }else{ System.out.println("无法识别您的输入!"); drawingBizUI();//返回主菜单 } } else if (account2.getFrozen() == 1) {//银行卡被锁定 System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); System.err.println("!!!!!!!!!!! 此卡处于锁定状态,无法转账 !!!!!!!!!!!!"); System.err.println("!!!! 如需解锁,请本人持有效证件到本行柜台办理 !!!!!!"); System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); drawingBizUI();//返回主菜单 } else {//银行卡有效 SystemEnter.atmSys.setAccount2(account2);//设置为ATM中要转入的银行卡 System.out.println("要转入的卡号为:"+SystemEnter.atmSys.getAccount2().getAccount()); } /** * 转账的操作 */ boolean bool = true; System.out.println("转账"); while(bool) { System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); System.out.println("$$$$$$$$$$$$$$$ 请输入转账金额 $$$$$$$$$$$$$$$$"); System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); String money = BasicTools.getScanner().next();//用字符串接收用户输入 //验证是否是数字 if (!BasicTools.validDig(money)) {//调用BasicTools类里验证是否为数字的方法 System.err.println("########## 系统提示 必需是数字 ###########"); System.err.println("##### 继续转账请输入1 返回主菜单请输入2 #####"); if ("1".equals(BasicTools.getScanner().next())) { continue;//结束这个循环 } //验证转账金额大于等于卡余额 } else if (Double.parseDouble(money) > SystemEnter.atmSys.getAccount().getBalance().doubleValue() - 1.0D) {//转账金额是否大于卡余额减一 System.err.println("########## 系统提示 您的账户余额不足 ###########"); System.err.println("##### 继续转账请输入1 返回主菜单请输入2 #####"); if ("1".equals(BasicTools.getScanner().next())) { continue; } } else { if (Double.parseDouble(money) > SystemEnter.atmSys.getSingleTurnOutMax().doubleValue()) {//转账金额是否大于ATM单次最高转账金额 System.err.println("########## 系统提示 单次转账金额不能大于ATM单次转账上限" + SystemEnter.atmSys.getSingleTurnOutMax().longValue() + " ###########"); System.err.println("##### 继续转账请输入1 返回主菜单请输入2 #####"); if ("1".equals(BasicTools.getScanner().next())) { continue; } break; } //转账后修改ATM中银行卡余额 AccountInfoController ctrl = new AccountInfoController(); //调用控制器中withdrawMoney的方法,获取到当前的ATM机对象,并将金额作为参数传递过去 Map<String, Double> map = ctrl.transferMoney(SystemEnter.atmSys.getAccount(), new BigDecimal(money),SystemEnter.atmSys.getAccount2()); if (((Double)map.get("res")).intValue() == 4) { System.out.println("☆☆☆☆☆☆☆☆ 恭喜您,本次业务交易成功! ☆☆☆☆☆☆☆☆"); System.out.println("☆☆☆☆☆☆☆ 本次转账 " + money + "元☆☆☆☆☆☆☆☆"); /* 减少转出银行卡的余额 */ SystemEnter.atmSys.modifyAccountBalance(new BigDecimal(money), (Double)map.get("poundage"), -1); /* 增加转入银行卡的余额 */ SystemEnter.atmSys.modifyAccount2Balance(new BigDecimal(money), 1); System.out.println("☆☆☆☆☆☆☆ 手续费 " + map.get("poundage").doubleValue() + "元☆☆☆☆☆☆☆☆"); System.out.println("ATM 当前余额 " + SystemEnter.atmSys.getTotal().doubleValue()); System.out.println("银行卡 当前余额 " + SystemEnter.atmSys.getAccount().getBalance().doubleValue()); } else if (((Double)map.get("res")).intValue() == -1) { System.out.println("☆☆☆☆☆☆☆☆ 本次操作是跨行转账,收取手续费后余额不足 ☆☆☆☆☆☆☆☆"); } else if (((Double)map.get("res")).intValue() == -2) { System.out.println("☆☆☆☆☆☆☆☆ 每日累计转账总额已超出ATM最高限制 ☆☆☆☆☆☆☆☆"); } else if (((Double)map.get("res")).intValue() == -4) { System.out.println("☆☆☆☆☆☆☆☆ 每日累计转账总额超出银行卡最高限制 ☆☆☆☆☆☆☆☆"); } } break; } drawingBizUI();//返回主菜单 } private static void drawingBusinessQueryUI() { System.out.println("查询"); } private static void drawingModifyPasswordUI() { System.out.println("修改密码"); } }
控制器:
package bank.atm.controller.account; import bank.atm.domain.AccountInfo; import bank.atm.service.account.AccountInfoServiceImp; import java.math.BigDecimal; import java.util.Map; /** * 银行卡操作控制层组件 * @author Administrator * */ public class AccountInfoController { /** * desc : 验证账号是否有效 * @param cardNumber 卡号 * @return AccountInfo 实例 */ public AccountInfo validateAccountInfo(String cardNumber){ AccountInfo account = null; account = new AccountInfoServiceImp().validateAccountInfo(cardNumber); return account; } /** * desc : 验证账号密码 * @param cardNumber 卡号 * @param password 密码 * @return int */ public int validatePassword(String cardNumber, int password) { return new AccountInfoServiceImp().validatePassword(cardNumber,password); } /** * 锁定银行卡的方法 * @param cardNubmer * @return * @throws Exception */ public int lockAccount(String cardNubmer) { return new AccountInfoServiceImp().lockAccount(cardNubmer); } /** * 取款 * @param account * @param money * @return Map<String,BigDecimal> */ public Map<String,Double> withdrawMoney(AccountInfo account, BigDecimal money){ return new AccountInfoServiceImp().withdrawMoney(account,money); } /** * 存款 * @param account * @param money * @return Map<String,BigDecimal> */ public Map<String, Double> depositMoney(AccountInfo account, BigDecimal money){ return new AccountInfoServiceImp().depositMoney(account, money); } /** * 转账 * @param account * @param money * @param account2 * @return */ public Map<String,Double> transferMoney(AccountInfo account, BigDecimal money,AccountInfo account2){ return new AccountInfoServiceImp().transferMoney(account,money,account2); } }
基础工具:
package bank.atm.util.tools; import bank.atm.domain.Bank; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.net.URLDecoder; import java.util.Scanner; public class BasicTools { private static Scanner scanner; public BasicTools() { } public static String getClassPath() { String classPath = null; String filePath = BasicTools.class.getClassLoader().getResource("").toString(); try { if (filePath != null && !filePath.trim().equals("")) { filePath = URLDecoder.decode(filePath, "UTF-8"); classPath = filePath.substring(filePath.indexOf("/") + 1); } } catch (UnsupportedEncodingException var3) { var3.printStackTrace(); } return classPath; } /** * 定义一个获取Scanner的方法供其它类调用 * @return */ public static Scanner getScanner() { if (scanner == null) { scanner = new Scanner(System.in); } return scanner; } /** * 验证密码是否都是数字的方法,返回值是布尔类型 * @param res * @return */ public static boolean validDig(String res) { char[] chs = res.toCharArray(); for(int i = 0; i < chs.length; i++) { if (!Character.isDigit(chs[i])) {//验证字符串是否都由数字组成 return false; } } return true; } /** * 跨行取款手续费计算方法 * @param bank * @param amount * @return */ public static double crossBankWithdrawal(Bank bank, BigDecimal amount) { double poundage = 0.0D; //如果:取款数额*手续费百分数/100 < 最低手续费;则按最低标准收取手续费 if (amount.multiply(new BigDecimal(bank.getCrossOutPercent())) .divide(new BigDecimal(100)).doubleValue() < bank.getCrossOutMin().doubleValue()) { poundage = bank.getCrossOutMin().doubleValue(); //如果:取款数额*手续费百分数/100 > 最高手续费;则按最高标准收取手续费 } else if (amount.multiply(new BigDecimal(bank.getCrossOutPercent())) .divide(new BigDecimal(100)).doubleValue() > bank.getCrossOutMax().doubleValue()) { poundage = bank.getCrossOutMax().doubleValue(); //按正常比率收取 } else { poundage = amount.multiply(new BigDecimal(bank.getCrossOutPercent())) .divide(new BigDecimal(100)).doubleValue(); } return poundage;//返回手续费的值 } /** * 跨行存款手续费计算方法 * @param bank * @param amount * @return */ public static double crossBankDeposit(Bank bank, BigDecimal amount) { double poundage = 0.0D; //如果:存款数额*手续费百分数/100 < 最低手续费;则按最低标准收取手续费 if (amount.multiply(new BigDecimal(bank.getCrossInPercent())) .divide(new BigDecimal(100)).doubleValue() < bank.getCrossInMin().doubleValue()) { poundage = bank.getCrossInMin().doubleValue(); //如果:存款数额*手续费百分数/100 > 最高手续费;则按最高标准收取手续费 } else if (amount.multiply(new BigDecimal(bank.getCrossInPercent())) .divide(new BigDecimal(100)).doubleValue() > bank.getCrossInMax().doubleValue()) { poundage = bank.getCrossInMax().doubleValue(); //按正常比率收取 } else { poundage = amount.multiply(new BigDecimal(bank.getCrossInPercent())) .divide(new BigDecimal(100)).doubleValue(); } return poundage;//返回手续费的值 } /** * 跨行转账手续费计算方法 * @param bank * @param amount * @return */ public static double crossBankTransfer(Bank bank, BigDecimal amount) { double poundage = 0.0D; //如果:转账数额*手续费百分数/100 < 最低手续费;则按最低标准收取手续费 if (amount.multiply(new BigDecimal(bank.getCrossTaPercent())) .divide(new BigDecimal(100)).doubleValue() < bank.getCrossTaMin().doubleValue()) { poundage = bank.getCrossTaMin().doubleValue(); //如果:转账数额*手续费百分数/100 > 最高手续费;则按最高标准收取手续费 } else if (amount.multiply(new BigDecimal(bank.getCrossTaPercent())) .divide(new BigDecimal(100)).doubleValue() > bank.getCrossTaMax().doubleValue()) { poundage = bank.getCrossTaMax().doubleValue(); //按正常比率收取 } else { poundage = amount.multiply(new BigDecimal(bank.getCrossTaPercent())) .divide(new BigDecimal(100)).doubleValue(); } return poundage;//返回手续费的值 } }
Service层:
package bank.atm.service.account; import bank.atm.SystemEnter; import bank.atm.dao.account.AccountInfoDaoImp; import bank.atm.domain.AccountInfo; import bank.atm.util.tools.BasicTools; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; /** * 服务层通用接口的实现类 */ public class AccountInfoServiceImp implements AccountInfoService{ /* 空构造器 */ public AccountInfoServiceImp() { } /** * 验证卡号是否有效,调用了AccountInfoDaoImp里的validateAccountInfo方法 * @param cardNumber 卡号 * @return AccountInfo 实例 */ public AccountInfo validateAccountInfo(String cardNumber) { return (new AccountInfoDaoImp()).validateAccountInfo(cardNumber); } /** * 验证账号密码,调用了AccountInfoDaoImp里的validatePassword方法 * @param cardNumber 卡号 * @param password 密码 * @return int */ public int validatePassword(String cardNumber, int password) { return (new AccountInfoDaoImp()).validatePassword(cardNumber, password); } /** * 锁定银行卡 * @param cardNubmer 卡号 * @return */ public int lockAccount(String cardNubmer) { try { return (new AccountInfoDaoImp()).lockAccount(cardNubmer); } catch (Exception var3) { var3.printStackTrace(); return 0; } } /** * 取款 * @param account 账户 * @param money 交易金额 * @return 返回对象mapRes,返回值是对象里的res -1账户余额不足,-2累计取款总额超出ATM最高限制, * -3累计取款次数已超出ATM最高限制 -4累计取款总和超出银行卡每日取款累计和上限 */ public Map<String, Double> withdrawMoney(AccountInfo account, BigDecimal money) { Map<String, Double> mapRes = new HashMap(); int res = 0; //返回值 double poundage = 0.0D; //服务费 /* 如果银行卡所属银行ID不等于ATM系统所属银行ID,收取跨行取款服务费 */ if (!account.getBankId().equals(SystemEnter.atmSys.getBankId())) {//如果银行卡对象所属的银行ID不等于当前ATM对象的所属银行ID /* 调用BasicTools中计算手续费的方法,手续费和银行和取款数额相关,所以传的参数是银行对象和取款金额 */ poundage = BasicTools.crossBankWithdrawal(SystemEnter.atmSys.getBank(), money); //验证加上手续费以后账户余额是否还够取款.账户余额(Balance)减去(subtract)取款金额(money)是否小于1 if (account.getBalance().subtract(money.add(new BigDecimal(poundage))).doubleValue() < 1.0D) { mapRes.put("res", new Double(-1.0D));//账户余额不足 return mapRes; } } //查询验证账户每日累计取款次数及累计取款总和 Map<String, BigDecimal> map = (new AccountInfoDaoImp()).countEverydayDrawingSum(account.getAccount()); double sum = ((BigDecimal)map.get("everydayDrawingSum")).doubleValue();//累计取款总和 System.out.println("本次取款之前已取款总额" + sum); int num = ((BigDecimal)map.get("everydayDrawingNum")).intValue();//累计取款次数 System.out.println("本次取款之前已取款总次数" + num); if ((new BigDecimal(sum)).add(money).doubleValue() > SystemEnter.atmSys.getEverydayWithdrawMax().doubleValue()) { mapRes.put("res", new Double(-2.0D));//累计取款总额超出ATM最高限制 return mapRes; } else if (num == SystemEnter.atmSys.getWithdrawFrequencyMax().intValue()) { mapRes.put("res", new Double(-3.0D));//累计取款次数已超出ATM最高限制 return mapRes; } else if (sum + money.doubleValue() > account.getTodayOutMax().doubleValue()) { mapRes.put("res", new Double(-4.0D));//累计取款总和超出银行卡每日取款累计和上限 return mapRes; } else { try { //取款的方法传的是3个参数,银行卡账号,取款金额,服务费 int res1 = (new AccountInfoDaoImp()).withdrawMoney(account.getAccount(), money, poundage); mapRes.put("res", new Double((double)res1)); mapRes.put("poundage", new Double(poundage)); } catch (Exception var12) { var12.printStackTrace(); } return mapRes; } } /** * 存款 * @param account * @param money * @return 返回对象mapRes,返回值是对象里的res * @throws Exception */ public Map<String, Double> depositMoney(AccountInfo account, BigDecimal money){ Map<String, Double> mapRes = new HashMap(); int res = 0; //返回值 double poundage = 0.0D; //服务费 /* 如果银行卡所属银行ID不等于ATM系统所属银行ID,收取跨行取款服务费 */ if (!account.getBankId().equals(SystemEnter.atmSys.getBankId())) {//如果银行卡对象所属的银行ID不等于当前ATM对象的所属银行ID /* 调用BasicTools中计算手续费的方法,手续费和银行和存款数额相关,所以传的参数是银行对象和存款金额 */ poundage = BasicTools.crossBankDeposit(SystemEnter.atmSys.getBank(), money); } try { //存款的方法传的是3个参数,银行卡账号,存款金额,服务费 int res1 = (new AccountInfoDaoImp()).depositMoney(account.getAccount(), money, poundage); mapRes.put("res", new Double((double)res1)); mapRes.put("poundage", new Double(poundage)); } catch (Exception var12) { var12.printStackTrace(); } return mapRes; } /** * 转账 * @param account 转出账户 * @param money 转出金额 * @param account2 转入账户 * @return */ public Map<String, Double> transferMoney(AccountInfo account, BigDecimal money,AccountInfo account2) { Map<String, Double> mapRes = new HashMap(); int res = 0; //返回值 double poundage = 0.0D; //服务费 /* 如果银行卡所属银行ID不等于ATM系统所属银行ID,收取跨行转账服务费 */ if (!account.getBankId().equals(SystemEnter.atmSys.getBankId())) {//如果银行卡对象所属的银行ID不等于当前ATM对象的所属银行ID /* 调用BasicTools中计算手续费的方法,手续费和银行和转账数额相关,所以传的参数是银行对象和转账金额 */ poundage = BasicTools.crossBankTransfer(SystemEnter.atmSys.getBank(), money); //验证加上手续费以后账户余额是否还够转账,账户余额(Balance)减去(subtract)转账金额(money)是否小于1 if (account.getBalance().subtract(money.add(new BigDecimal(poundage))).doubleValue() < 1.0D) { mapRes.put("res", new Double(-1.0D));//账户余额不足 return mapRes; } } //查询验证账户每日累计转账总和及银行卡每日累计转账和上限 Map<String, BigDecimal> map = (new AccountInfoDaoImp()).countEverydayTransferSum(account.getAccount()); double sum = ((BigDecimal)map.get("countEverydayTransferSum")).doubleValue();//累计转账总和 System.out.println("本次转账之前已转账总额" + sum); if ((new BigDecimal(sum)).add(money).doubleValue() > SystemEnter.atmSys.getEverydayTurnOutMax().doubleValue()) { mapRes.put("res", new Double(-2.0D));//累计转账总额超出ATM最高限制 return mapRes; } else if (sum + money.doubleValue() > account.getTodayTaMax().doubleValue()) { mapRes.put("res", new Double(-4.0D));//累计取款总和超出银行卡每日转账累计和上限 return mapRes; } else { try { //取款的方法传的是4个参数,转出银行卡账号,转账金额,服务费,转入银行卡账号 int res1 = (new AccountInfoDaoImp()).transferMoney(account.getAccount(), money, poundage,account2.getAccount()); mapRes.put("res", new Double((double)res1)); mapRes.put("poundage", new Double(poundage)); } catch (Exception var12) { var12.printStackTrace(); } return mapRes; } } }
Dao层:
package bank.atm.dao.account; import bank.atm.SystemEnter; import bank.atm.domain.AccountInfo; import bank.atm.util.db.DataSourceManager; import java.math.BigDecimal; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class AccountInfoDaoImp implements AccountInfoDao { public AccountInfoDaoImp() { } /** * 验证卡号是否有效 * @param cardNumber 卡号 * @return AccountInfo 实例 */ public AccountInfo validateAccountInfo(String cardNumber) { String sql = "SELECT ID,ACCOUNT,ACCOUNT_TYPE,BALANCE,TODAY_OUT_MAX," + "TODAY_TA_MAX,BANKID,FROZEN,LOCATION,CREATETIME " + "FROM ACCOUNT_INFO WHERE ACCOUNT = ?";//查询AccountInfo银行卡账户信息表,如果有返回信息说明账号存在 AccountInfo account = null;//创建一个AccountInfo对象 Connection conn = null; //创建一个数据库连接 PreparedStatement ps = null;//创建一个PreparedStatement接口对象 ResultSet set = null;//创建一个ResultSet结果集对象 try { conn = DataSourceManager.getConnection();//获取数据库连接 ps = conn.prepareStatement(sql);//实例化PreparedStatement接口对象 ps.setString(1, cardNumber);//用卡号补全查询参数的占位符 set = ps.executeQuery();//执行查询,并把查询结果封装到ResultSet结果集对象里 while(set.next()) {//如果set有内容 account = new AccountInfo();//每次循环都实例化一个AccountInfo对象并把查询结果封装进去 account.setAccount(cardNumber); account.setAccountType(set.getInt("ACCOUNT_TYPE")); account.setBalance(set.getBigDecimal("BALANCE")); account.setBankId(set.getString("BANKID")); account.setCreateTime(set.getDate("CREATETIME")); account.setFrozen(set.getInt("FROZEN")); account.setId(set.getString("ID")); account.setLocation(set.getString("LOCATION")); account.setTodayOutMax(set.getBigDecimal("TODAY_OUT_MAX")); account.setTodayTaMax(set.getBigDecimal("TODAY_TA_MAX")); } } catch (Exception var11) { var11.printStackTrace(); } finally { DataSourceManager.close(set); DataSourceManager.close(ps); DataSourceManager.close(conn); } return account;//返回账户信息 } /** * 验证密码的方法 * @param cardNumber * @param password * @return */ public int validatePassword(String cardNumber, int password) { int res = 0; String sql = "SELECT COUNT(ID) RESULTS FROM ACCOUNT_INFO " + "WHERE ACCOUNT = ? AND PASSWORD = ?"; Connection conn = null; PreparedStatement ps = null; ResultSet set = null; try { conn = DataSourceManager.getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, cardNumber); ps.setInt(2, password); for(set = ps.executeQuery(); set.next(); res = set.getInt("RESULTS")) { } } catch (Exception var12) { var12.printStackTrace(); } finally { DataSourceManager.close(set); DataSourceManager.close(ps); DataSourceManager.close(conn); } return res; } /** * 锁定银行卡 * @param cardNumber 卡号 * @return * @throws Exception */ public int lockAccount(String cardNumber) throws Exception { int res = 0; String sql = "UPDATE ACCOUNT_INFO SET FROZEN = 1 WHERE ACCOUNT = ?";//设置冻结状态为1,银行卡冻结 Connection conn = null; PreparedStatement ps = null; try { conn = DataSourceManager.getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, cardNumber); res = ps.executeUpdate(); } catch (Exception var10) { var10.printStackTrace(); } finally { DataSourceManager.close(ps); DataSourceManager.close(conn); } return res; } /** * 取款 * @param account 账户 * @param amount 交易金额 * @param serviceCharge 手续费 * @return int * @throws Exception */ public int withdrawMoney(String account, BigDecimal amount, double serviceCharge) throws Exception { int res = 0; /* 更新账户余额SQL * 第一个问号是取款金额,第二个问号是服务费,第三个问号是账户卡号*/ String sql0 = "UPDATE ACCOUNT_INFO SET BALANCE = BALANCE-?-? WHERE ACCOUNT = ?"; /* 添加交易记录SQL */ String sql2 = "INSERT INTO BUSINESS (ID,ACCOUNTID,BUSID,AMOUNT," + "POUNDAGE,BUSINESS_TIME,DESCRIPTION) " + "VALUES(?,?,?,?,?,SYSDATE,?)"; /* 更新ATM余额SQL */ String sql3 = "UPDATE ATM SET TOTAL = TOTAL - ? WHERE ID = ?"; Connection conn = null; PreparedStatement ps = null; PreparedStatement ps2 = null; PreparedStatement ps3 = null; try { conn = DataSourceManager.getConnection(); conn.setAutoCommit(false);//关闭自动提交 ps = conn.prepareStatement(sql0); ps.setBigDecimal(1, amount); ps.setDouble(2, serviceCharge); ps.setString(3, account); res += ps.executeUpdate(); ps2 = conn.prepareStatement(sql2); ps2.setString(1, UUID.randomUUID().toString()); ps2.setString(2, account); ps2.setString(3, "OUTCODE200"); ps2.setBigDecimal(4, amount); ps2.setDouble(5, serviceCharge); ps2.setString(6, "ATM 取款"); res += ps2.executeUpdate(); ps3 = conn.prepareStatement(sql3); ps3.setBigDecimal(1, amount); ps3.setString(2, SystemEnter.atmSys.getId()); res += ps3.executeUpdate(); conn.commit();//提交事务 } catch (Exception var20) { try { System.out.println("撤销事务"); conn.rollback();//撤销事务操作 } catch (SQLException var19) { var19.printStackTrace(); } var20.printStackTrace(); } finally { DataSourceManager.close(ps); DataSourceManager.close(ps2); DataSourceManager.close(conn); } return res; } /** * 统计每日累计已取款金额总和与每日累计已取款次数 * @param cardNumber 卡号 * @return Map<String, BigDecimal> */ public Map<String, BigDecimal> countEverydayDrawingSum(String cardNumber) { Map<String, BigDecimal> map = new HashMap(); /* 统计系统时间今天内的累计已取款金额和累计已取款次数 */ /* everydayDrawingSum和everydayDrawingNum是每日累计已取款金额总和与每日累计已取款次数的别名 * OUTCODE200表示本次业务是取款 */ String sql = "SELECT SUM(AMOUNT) everydayDrawingSum,COUNT(AMOUNT) everydayDrawingNum " + "FROM BUSINESS WHERE ACCOUNTID = ? AND BUSID ='OUTCODE200' " + "AND BUSINESS_TIME BETWEEN " + "TO_DATE(TO_CHAR(SYSDATE,'yyyy-mm-dd')||'00:00:00','yyyy-mm-dd hh24:mi:ss') " + "AND TO_DATE(TO_CHAR(SYSDATE,'yyyy-mm-dd')||'23:59:59','yyyy-mm-dd hh24:mi:ss')"; Connection conn = null; PreparedStatement ps = null; ResultSet set = null; try { conn = DataSourceManager.getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, cardNumber); set = ps.executeQuery(); while(set.next()) { BigDecimal bd = set.getBigDecimal("everydayDrawingSum"); map.put("everydayDrawingSum", bd == null ? new BigDecimal(0) : bd); map.put("everydayDrawingNum", set.getBigDecimal("everydayDrawingNum")); } } catch (Exception var11) { var11.printStackTrace(); } finally { DataSourceManager.close(set); DataSourceManager.close(ps); DataSourceManager.close(conn); } return map; } /** * 存款 * @param account 账户 * @param amount 交易金额 * @param serviceCharge 手续费 * @return int * @throws Exception */ public int depositMoney(String account, BigDecimal amount, double serviceCharge) throws Exception { int res = 0; /* 更新账户余额SQL * 第一个问号是取款金额,第二个问号是服务费,第三个问号是账户卡号*/ String sql0 = "UPDATE ACCOUNT_INFO SET BALANCE = BALANCE+?-? WHERE ACCOUNT = ?"; /* 添加交易记录SQL */ String sql2 = "INSERT INTO BUSINESS (ID,ACCOUNTID,BUSID,AMOUNT," + "POUNDAGE,BUSINESS_TIME,DESCRIPTION) " + "VALUES(?,?,?,?,?,SYSDATE,?)"; /* 更新ATM余额SQL */ String sql3 = "UPDATE ATM SET TOTAL = TOTAL + ? WHERE ID = ?"; Connection conn = null; PreparedStatement ps = null; PreparedStatement ps2 = null; PreparedStatement ps3 = null; try { conn = DataSourceManager.getConnection(); conn.setAutoCommit(false);//关闭自动提交 ps = conn.prepareStatement(sql0); ps.setBigDecimal(1, amount); ps.setDouble(2, serviceCharge); ps.setString(3, account); res += ps.executeUpdate(); ps2 = conn.prepareStatement(sql2); ps2.setString(1, UUID.randomUUID().toString()); ps2.setString(2, account); ps2.setString(3, "TID10011"); ps2.setBigDecimal(4, amount); ps2.setDouble(5, serviceCharge); ps2.setString(6, "ATM 存款"); res += ps2.executeUpdate(); ps3 = conn.prepareStatement(sql3); ps3.setBigDecimal(1, amount); ps3.setString(2, SystemEnter.atmSys.getId()); res += ps3.executeUpdate(); conn.commit();//提交事务 } catch (Exception var20) { try { System.out.println("撤销事务"); conn.rollback();//撤销事务操作 } catch (SQLException var19) { var19.printStackTrace(); } var20.printStackTrace(); } finally { DataSourceManager.close(ps); DataSourceManager.close(ps2); DataSourceManager.close(conn); } return res; } /** * 统计每日累计已转账金额总和 * @param cardNumber 卡号 * @return Map<String, BigDecimal> */ public Map<String, BigDecimal> countEverydayTransferSum(String cardNumber) { Map<String, BigDecimal> map = new HashMap(); /* 统计系统时间今天内的累计已转出金额 */ /* everydayTransferSum和everydayTransferNum是每日累计已转账金额总和的别名 * TID10012表示本次业务是转出 */ String sql = "SELECT SUM(AMOUNT) countEverydayTransferSum " + "FROM BUSINESS WHERE ACCOUNTID = ? AND BUSID ='TID10012' " + "AND BUSINESS_TIME BETWEEN " + "TO_DATE(TO_CHAR(SYSDATE,'yyyy-mm-dd')||'00:00:00','yyyy-mm-dd hh24:mi:ss') " + "AND TO_DATE(TO_CHAR(SYSDATE,'yyyy-mm-dd')||'23:59:59','yyyy-mm-dd hh24:mi:ss')"; Connection conn = null; PreparedStatement ps = null; ResultSet set = null; try { conn = DataSourceManager.getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, cardNumber); set = ps.executeQuery(); while(set.next()) { BigDecimal bd = set.getBigDecimal("countEverydayTransferSum"); map.put("countEverydayTransferSum", bd == null ? new BigDecimal(0) : bd); } } catch (Exception var11) { var11.printStackTrace(); } finally { DataSourceManager.close(set); DataSourceManager.close(ps); DataSourceManager.close(conn); } return map; } /** * 转账 * @param account 账户 * @param amount 交易金额 * @param serviceCharge 手续费 * @return int * @throws Exception */ public int transferMoney(String account, BigDecimal amount, double serviceCharge,String account2){ int res = 0; /* 更新账户余额SQL * 第一个问号是转出金额,第二个问号是服务费,第三个问号是转出账户卡号*/ String sql0 = "UPDATE ACCOUNT_INFO SET BALANCE = BALANCE-?-? WHERE ACCOUNT = ?"; /* 添加交易记录SQL */ String sql2 = "INSERT INTO BUSINESS (ID,ACCOUNTID,BUSID,AMOUNT," + "POUNDAGE,BUSINESS_TIME,DESCRIPTION) " + "VALUES(?,?,?,?,?,SYSDATE,?)"; /* 更新ATM余额SQL * 第一个问号是转入金额,第二个问号是转入账户卡号 */ String sql3 = "UPDATE ACCOUNT_INFO SET BALANCE = BALANCE+? WHERE ACCOUNT = ?"; /* 添加交易记录SQL */ String sql4 = "INSERT INTO BUSINESS (ID,ACCOUNTID,BUSID,AMOUNT," + "POUNDAGE,BUSINESS_TIME,DESCRIPTION) " + "VALUES(?,?,?,?,?,SYSDATE,?)"; Connection conn = null; PreparedStatement ps = null; PreparedStatement ps2 = null; PreparedStatement ps3 = null; PreparedStatement ps4 = null; try { conn = DataSourceManager.getConnection(); conn.setAutoCommit(false);//关闭自动提交 ps = conn.prepareStatement(sql0); ps.setBigDecimal(1, amount); ps.setDouble(2, serviceCharge); ps.setString(3, account); res += ps.executeUpdate(); ps2 = conn.prepareStatement(sql2); ps2.setString(1, UUID.randomUUID().toString()); ps2.setString(2, account); ps2.setString(3, "TID10012"); ps2.setBigDecimal(4, amount); ps2.setDouble(5, serviceCharge); ps2.setString(6, "银行卡 转出"); res += ps2.executeUpdate(); ps3 = conn.prepareStatement(sql3); ps3.setBigDecimal(1, amount); ps3.setString(2, account2); res += ps3.executeUpdate(); ps4 = conn.prepareStatement(sql4); ps4.setString(1, UUID.randomUUID().toString()); ps4.setString(2, account2); ps4.setString(3, "TID10013"); ps4.setBigDecimal(4, amount); ps4.setDouble(5, serviceCharge); ps4.setString(6, "银行卡 转入"); res += ps4.executeUpdate(); conn.commit();//提交事务 } catch (Exception var20) { try { System.out.println("撤销事务"); conn.rollback();//撤销事务操作 } catch (SQLException var19) { var19.printStackTrace(); } var20.printStackTrace(); } finally { DataSourceManager.close(ps); DataSourceManager.close(ps2); DataSourceManager.close(conn); } return res; } }