1.任务描述
编写一个银行新用户现金业务办理程序,使其模拟新用户到银行办理现金存取业务时的场景。
要求此场景中,要模拟出银行对用户到来的欢迎动作、对用户离开的提醒动作,以及用户的开户、存款和取款动作,在完成开户、存款和取款操作后,要提示用户的账户余额。例如,一个新用户来到招商银行,首先银行要表示欢迎,然后银行工作人员会为用户办理开户手续;开户后,用户先进行存款操作,之后又进行了取款操作,取款操作时需要用户输入正确的密码和取款金额需小于当前账户金额,如果条件不满足,系统产生异常。当业务办理完,用户离开银行,银行提醒用户携带好随身财物。至此银行新用户现金业务办理结束。
2. 任务目标
(1)学会分析“银行新用户现金业务办理”程序任务实现的逻辑思路。
(2)能够独立完成“银行新用户现金业务办理”的建模。
(3)能够独立完成“银行新用户现金业务办理”程序的源代码编写、编译及运行。
3. 实现思路
(1)通过任务描述可知,此需求需要定义一个银行类BankSystem。当用户去银行办理业务时,相当于办理了此银行的账户,所以这个类中要有此银行以及此银行的账户信息,比如:银行的名称、用户的名称、密码、账户余额和交易金额等数据
(2)新用户到达银行之后,银行会表示欢迎。
(3)银行表示欢迎之后,会为用户办理开户手续,开户时需扣除10元卡费。
(4)开户后,可以为用户办理存款和取款业务,这两种业务都会改变账户的余额。但是当用户密码输入错误,或取款金额大于余额时,产生异常,取款业务不能办理,并提示用户,编写Exception类。
(5)用户离开时,银行会提醒用户携带好随身财物。
(6)编写交易类Users,在此类中模拟新用户去银行办理现金业务的场景。
(7)user和bank 实施交互的菜单Menu类
4.图例分析
5.实现效果
当未开户时 ,进行其他操作 ,提示请先开户
开户时,开户金额不足,补充资金
存钱取钱操作, 先输入账号密码 输入错误提示, 并显示剩余输入次数
成功提示 金额
取钱时金额超过 提示用户 余额不足
最后退出 欢迎下次光临
解题思路:我首先在我的mybase数据库下创建了一张表用来记录用户的账号,密码,姓名还有金额.
drop table if exists t_bank;
create table t_bank(
id int primary key auto_increment,
usercount varchar(32),
passwd varchar(32),
money int(32),
username varchar(4)
);
然后我创建了5个类,
Menu类实现菜单的控制.
package cn.ls.BankSystem;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Scanner;
public class Menu {
public static void main(String[] args) throws AllException, StopException, SQLException {
int flag = 0; // 记录用户是否开户
Scanner sc = new Scanner(System.in);
Users menu = new Users();
while (true) {
System.out.println("**************************");
System.out.println("\t银行管理系统");
System.out.println("\t********");
System.out.println(" 1.开户\t2.存钱");
System.out.println(" 3.取钱\t4.退出");
System.out.print("请输入选项:");
String choose;
try {
choose = sc.next();
if (choose.equals("1")) {
menu.creat();
flag = 1;
} else if (choose.equals("2")) {
if (flag == 1) {
menu.save();
} else {
throw new AllException("账户不存在, 请选择“1”开户!\n");
}
} else if (choose.equals("3")) {
if (flag == 1) {
menu.draw();
} else {
throw new AllException("账户不存在, 请选择“1”开户!\n");
}
} else if (choose.equals("4")) {
System.out.println("欢迎下次光临!");
break;
} else {
throw new AllException("您输入的序号不存在,请重新输入!\n");
}
} catch (AllException e) {
System.out.println(e.getMessage());
}
}
}
}
Allexception 类实现对异常的处理, 比如密码错误, 金额不足, 次数不足等.
package cn.ls.BankSystem;
public class AllException extends Exception {
public AllException(String msg) {
super(msg); // 获取父类的方法 获得文本信息
}
}
class StopException extends Exception {
public StopException(String msg) {
super(msg);
}
}
Users 类实现用户和银行的交互.
package cn.ls.BankSystem;
import java.sql.SQLException;
import java.util.Scanner;
public class Users {
Scanner sc = new Scanner(System.in);
String username = "张三";
String usercount = "123456";
String passwd = "123456";
int money = 5;
BankSystem user1 = new BankSystem(username); // 创建银行的对象
// 开户
public void creat() throws AllException, StopException {
int numcount = 3;
boolean flag = user1.creatCount(usercount, passwd, money);
numcount--;
// judge(flag, numcount);
while (true) {
try {
if (flag == true) {
break;
} else if (flag == false) {
throw new AllException("开户金额不足,请继续支付:");
}
if (numcount <= 0) {
throw new StopException("账号或密码错误次数超过三次,已锁定账号!");
}
} catch (AllException e) {
System.out.println(e.getMessage());
money = sc.nextInt();
flag = user1.creatCount(usercount, passwd, money);
numcount--;
} catch (StopException e) {
System.out.println(e.getMessage());
break;
}
}
}
// 存钱
public void save() throws AllException, StopException, SQLException {
System.out.println("存钱前,请输入账号密码和金额~~");
System.out.print("账号:");
usercount = sc.next();
System.out.print("密码:");
passwd = sc.next();
System.out.print("金额:");
money = sc.nextInt();
int numcount = 3;
boolean flag = user1.SaveMoney(usercount, passwd, money);
numcount--;
while (true) {
try {
// System.out.println(numcount+"!!");
if (flag == true) {
break;
} else if (flag == false) {
if (numcount <= 0) {
throw new StopException("账号或密码错误次数超过三次,已锁定账号!");
}
throw new AllException("账号或密码错误,剩余输入次数" + numcount + "次,请重新输入");
}
} catch (AllException e) {
System.out.println(e.getMessage());
numcount--;
System.out.print("账号:");
usercount = sc.next();
System.out.print("密码:");
passwd = sc.next();
System.out.print("金额:");
money = sc.nextInt();
flag = user1.SaveMoney(usercount, passwd, money);
} catch (StopException e) {
System.out.println(e.getMessage());
break;
}
}
}
// 取钱
public void draw() throws AllException, StopException, SQLException {
// BankSystem user1 = new BankSystem(name);
System.out.println("取钱前,请输入账号密码和金额##");
System.out.print("账号:");
usercount = sc.next();
System.out.print("密码:");
passwd = sc.next();
System.out.print("金额:");
money = sc.nextInt();
int numcount = 3;
boolean flag = user1.DrawMoney(usercount, passwd, money);
numcount--;
while (true) {
try {
if (flag == true) {
break;
} else if (flag == false) {
if (numcount <= 0) {
throw new StopException("账号或密码错误次数超过三次,已锁定账号!");
}
throw new AllException("账号或密码错误,剩余输入次数" + numcount + "次,请重新输入");
}
} catch (AllException e) {
System.out.println(e.getMessage());
numcount--;
System.out.print("账号:");
usercount = sc.next();
System.out.print("密码:");
passwd = sc.next();
System.out.print("金额:");
money = sc.nextInt();
flag = user1.DrawMoney(usercount, passwd, money);
} catch (StopException e) {
System.out.println(e.getMessage());
break;
}
}
}
}
BankSystem 类实现银行功能 ,实现用户发送的信息的验证工作, 验证每次的信息是否正确并合理.
package cn.ls.BankSystem;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class BankSystem {
String Name;
int money = 0;
String usercount;
String passwd;
// 欢迎客户
public BankSystem(String name) {
Name = name;
System.out.println("---------欢迎 来到, " + name + "---------");
}
// 开户业务
public boolean creatCount(String usercount1, String passwd1, int money1) {
usercount = usercount1;
passwd = passwd1;
money += money1;
if (money >= 10) {
money -= 10;
System.out.println(Name + "开户成功, 账户余额为:" + money);
return true;
} else {
System.out.println("开户金额的10元, 您支付的钱币的为" + money + "元, 还差" + (10 - money) + "元。");
return false;
}
}
// 存钱业务
public boolean SaveMoney(String usercount1, String passwd1, int money1) throws SQLException {
Connection con = JDBCUtils.getConnection();
String sql = "select username from t_bank where usercount = ? and passwd = ?";
// 对sql语句进行预编译
PreparedStatement ps = con.prepareStatement(sql);
// 赋值
ps.setString(1, usercount1);
ps.setString(2, passwd1);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
money += money1;
System.out.println(Name + "您好, 您的账号已存入" + money1 + ", 当前余额为:" + money + "元。");
return true;
} else {
return false;
}
}
// 取钱业务
public boolean DrawMoney(String usercount1, String passwd1, int money1) throws SQLException {
Connection con = JDBCUtils.getConnection();
String sql = "select username from t_bank where usercount = ? and passwd = ?";
// 对sql语句进行预编译
PreparedStatement ps = con.prepareStatement(sql);
// 赋值
ps.setString(1, usercount1);
ps.setString(2, passwd1);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
if (money1 <= money) {
money -= money1;
System.out.println(Name + "您好, 您的账号已取出" + money1 + ", 当前余额为:" + money + "元。");
return true;
} else {
System.out.println("余额不足,当前余额为" + money + "元,请重新输入取出金额:");
while (money1 > money) {
Scanner input = new Scanner(System.in);
money1 = input.nextInt();
}
money -= money1;
System.out.println(Name + "您好, 您的账号已取出" + money1 + ", 当前余额为:" + money + "元。");
return true;
}
}
return false;
}
}
JDBCUtils类作为工具类去获取数据库连接.
package cn.itcast.jabcutil;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtils {
private JDBCUtils() {
}
private static Connection con;
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mybase?serverTimezone=UTC";
String username = "root", password = "ls12345";
con = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
throw new RuntimeException(e + "数据库连接失败");
}
}
public static Connection getConnection() {
return con;
}
public static void close(Connection con, Statement stat, ResultSet re) {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
}
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
}
}
if (re != null) {
try {
re.close();
} catch (SQLException e) {
}
}
}
public static void close(Connection con, Statement stat) {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
}
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
}
}
}
}
用到了PreparedStatement对sql语句进行预编译防止注入攻击,查阅资料,关系型运算符优先级高到低为:NOT >AND >OR
如果where 后面有OR条件的话,则OR自动会把左右的查询条件分开。我主要是用数据库的查询去判断用户的账号和密码是否正确,若正确就会有记录,则会执行存钱和取钱操作,根据需求,开户不需要账号和密码,所以无需登录,最后退出即可