连接数据库——模拟ATM机查、存、取、开户功能
1、界面:包含开户、查询、存款、取款、功能
1 package com.bank.test; 2 /** 3 * 4 * @author Administrator 5 *界面类 6 */ 7 public class Jiemian { 8 public static void jiemian() { 9 System.out.println("银行自助终端系统"); 10 System.out.println("****************************"); 11 System.out.println("0.------开户"); 12 System.out.println("1.------查询"); 13 System.out.println("2.------存款"); 14 System.out.println("3.------取款"); 15 System.out.println("4.------退出"); 16 System.out.println("****************************"); 17 System.out.println("请选择你要执行的功能:"); 18 } 19 }
2、ATM子类——实现开户功能,将新开户信息写入数据库
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Random; import java.util.Scanner; import com.bank.unionpay.ATM; import com.bank.unionpay.Bank; /** * * @author Administrator *ATM机的子类 */ public class ATMzi extends ATM{ private final Bank ABC=Bank.ABC; //银行类型(枚举类型=ABC) @Override public void Kaihu() { //开户功能 Bankchuxu bk=new Bankchuxu(); System.out.println("请输入您的姓名:"); while(true){ //输入姓名 try{ //异常处理 Scanner sc=new Scanner(System.in); bk.setName(sc.nextLine()); break; }catch(Exception e){ System.out.println("输入有误!"); System.out.println("请重新输入:"); continue; } } while(true){ //输入身份证号 try{ System.out.println("请输入您的身份证号:"); Scanner sc=new Scanner(System.in); String a=sc.nextLine(); String regex="\\d{15}|\\d{17}[\\dxX]"; //正则表达式控制身份证号 if(a.matches(regex)){ bk.setIDcard(a); break; }else{ System.out.println("身份证号格式输入有误!"); continue; } }catch(Exception e){ System.out.println("输入有误!"); System.out.println("请重新输入:"); continue; } } while(true){ //输入密码 try{ System.out.println("请输入6位纯数字密码:"); Scanner sc=new Scanner(System.in); String a=sc.nextLine(); String regex="\\d{6}"; //正则表达式控制密码 if(a.matches(regex)){ bk.setPassword(a); break; } else{ System.out.println("输入密码格式有误!"); continue; } }catch(Exception e){ System.out.println("输入有误!"); System.out.println("请重新输入:"); continue; } } while(true){ Random a=new Random(); Long c=a.nextLong(); //生成储蓄卡号 String regex="\\d{19}"; if(c>0&&c.toString().matches(regex)){ bk.setCard(c); //将生成的储蓄卡号赋给储蓄卡卡号属性 try { // 访问数据库 //1、加载驱动:加载数据库提供的驱动类 Class.forName("oracle.jdbc.driver.OracleDriver"); //2、获取数据库连接,通过java的驱动管理器 //url-数据库地址,不同的数据库写法不一样;user-用户名;password-密码 Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:orcl ", "test01", "131281huazioo"); //操作数据库——增删改查 //3、获得操作数据库的声明 Statement st=conn.createStatement(); //4、DML增加数据,执行更新操作 int i=st.executeUpdate("insert into BANKCARD values('" +bk.getCard()+"','" +bk.getName()+"','" +bk.getPassword()+"','" +bk.getYue()+"','" +bk.getIDcard()+"')"); //关闭声明,释放资源 st.close(); //关闭连接 conn.close(); } catch (Exception e) { e.printStackTrace(); } System.out.println("您的账号为:"+bk.getCard()); break; }else{ continue; } } } }
3、储蓄卡类——实现查询、存款、取款功能
1 import java.io.BufferedReader; 2 import java.io.FileOutputStream; 3 import java.io.FileReader; 4 import java.sql.Connection; 5 import java.sql.DriverManager; 6 import java.sql.ResultSet; 7 import java.sql.Statement; 8 import java.util.Scanner; 9 10 import com.bank.test.Jiemian; 11 import com.bank.unionpay.Bank; 12 import com.bank.unionpay.Yinlian; 13 14 /** 15 * 16 * @author Administrator 17 *储蓄卡类 18 */ 19 public class Bankchuxu implements Yinlian{ 20 protected final Bank ABC=Bank.ABC; //银行类型(枚举类型=ABC) 21 private String name; //姓名 22 private String IDcard; //身份证号 23 protected long card; //银行卡号 24 private String password; //密码 25 protected int yue; //余额 26 //储蓄卡号get、set方法 27 public long getCard() { 28 return card; 29 } 30 public void setCard(long card) { 31 this.card = card; 32 } 33 //姓名get、set方法 34 public String getName() { 35 return name; 36 } 37 public void setName(String name) { 38 this.name = name; 39 } 40 //身份证号get、set方法 41 public String getIDcard() { 42 return IDcard; 43 } 44 public void setIDcard(String iDcard) { 45 IDcard = iDcard; 46 } 47 //密码get、set方法 48 public String getPassword() { 49 return password; 50 } 51 public void setPassword(String password) { 52 this.password = password; 53 } 54 //余额get、set方法 55 public int getYue() { 56 return yue; 57 } 58 public void setYue(int yue) { 59 this.yue = yue; 60 }
查询功能:通过输入的卡号,从数据库中查询数据,存在将数据打印出来
1 public void Chaxun(Yinlian yinl) { //查询功能 2 3 System.out.println("请输入您要查的账号:"); //输入账号 4 while(true){ 5 try{ 6 Scanner sc=new Scanner(System.in); 7 long a=sc.nextLong(); 8 // 访问数据库 9 //1、加载驱动:加载数据库提供的驱动类 10 Class.forName("oracle.jdbc.driver.OracleDriver"); 11 12 //2、获取数据库连接,通过java的驱动管理器 13 //url-数据库地址,不同的数据库写法不一样;user-用户名;password-密码 14 Connection conn = DriverManager.getConnection( 15 "jdbc:oracle:thin:@localhost:1521:orcl ", 16 "test01", "131281huazioo"); 17 18 //操作数据库——增删改查 19 //3、获得操作数据库的声明 20 Statement st=conn.createStatement(); 21 //5、查询数据 22 //ResultSet 数据结果集 23 ResultSet rs = st.executeQuery("select * from BANKCARD where card='" 24 +a+"'"); 25 //遍历结果集 26 //next()判断是否存在下一条记录,移动指针到下一条记录 27 if(rs.next()) 28 { 29 String pw=rs.getString("password"); 30 System.out.println("请输入您的密码:"); //输入密码 31 int i=0; 32 while(true){ 33 Scanner s=new Scanner(System.in); 34 String pws=s.nextLine(); 35 if(pws.equals(pw)){ //验证密码 36 System.out.println("你查询的账号信息为:"); 37 System.out.println("******************************"); 38 System.out.println("姓名 身份证号 卡号 金额"); 39 System.out.println(rs.getString("name")+" "+rs.getString("idcard")+" "+rs.getString("card")+" "+rs.getString("yue")); 40 break; 41 }else{ 42 i++; 43 if(i==3){ //控制输入次数最多3次 44 System.out.println("密码输错超过3次,无法继续输入!"); 45 break; 46 }else{ 47 System.out.println("密码输入错误!请重新输入:"); 48 continue; 49 } 50 } 51 } 52 //关闭数据结果集,释放资源 53 rs.close(); 54 //关闭声明,释放资源 55 st.close(); 56 //关闭连接 57 conn.close(); 58 break; 59 }else{ 60 System.out.println("您输入的卡号不存在,请重新输入:"); 61 continue; 62 } 63 64 }catch(Exception e){ 65 System.out.println("您输入的账号格式有误!"); 66 System.out.println("请重新输入:"); 67 continue; 68 } 69 } 70 }
存款功能:通过输入的卡号从数据库中查询数据,若存在,则将重新计算的余额通过修改数据改到相应的余额中
1 public void Cunkuan(Yinlian yinl) { // 存款 2 3 System.out.println("请输入您要存款的账号:"); 4 while (true) { 5 try { 6 Scanner sc = new Scanner(System.in); 7 long a = sc.nextLong(); 8 // 访问数据库 9 // 1、加载驱动:加载数据库提供的驱动类 10 Class.forName("oracle.jdbc.driver.OracleDriver"); 11 12 // 2、获取数据库连接,通过java的驱动管理器 13 // url-数据库地址,不同的数据库写法不一样;user-用户名;password-密码 14 Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl ", "test01", 15 "131281huazioo"); 16 17 // 操作数据库——增删改查 18 // 3、获得操作数据库的声明 19 Statement st = conn.createStatement(); 20 // 5、查询数据 21 // ResultSet 数据结果集 22 ResultSet rs = st.executeQuery("select * from BANKCARD where card='" + a + "'"); 23 // 遍历结果集 24 // next()判断是否存在下一条记录,移动指针到下一条记录 25 26 if (rs.next()) { // 验证卡号 27 String pw = rs.getString("password"); 28 System.out.println("请输入您的密码:"); // 输入密码 29 int i = 0; 30 while (true) { 31 Scanner s = new Scanner(System.in); 32 String pws = s.nextLine(); 33 if (pws.equals(pw)) { // 验证密码 34 System.out.println("您要存款的账号信息为:"); 35 System.out.println("******************************"); 36 System.out.println( 37 "姓名 身份证号 卡号 金额"); 38 System.out.println(rs.getString("name") + " " + rs.getString("idcard") + " " 39 + rs.getString("card") + " " + rs.getString("yue")); 40 while (true) { 41 try { 42 System.out.println("请输入存款金额:"); 43 Scanner cun = new Scanner(System.in); 44 int jine = cun.nextInt(); // 输入存款金额 45 if (jine < 0) { 46 System.out.println("您输入的数据无效,系统将自动退出!谢谢使用"); // 负数提示 47 break; 48 } else { 49 yue = rs.getInt("yue"); 50 yue += jine; // 重新计算余额 51 try { 52 int ss = st.executeUpdate( 53 "update bankcard set yue='" + yue + "' where card='" + a + "'"); 54 } catch (Exception e) { 55 e.printStackTrace(); 56 } 57 System.out.println("存款成功,谢谢使用!"); 58 break; 59 } 60 } catch (Exception e) { 61 System.out.println("您输入的存款金额格式有误!"); 62 System.out.println("请重新输入:"); 63 continue; 64 } 65 } 66 break; 67 } else { 68 i++; 69 if (i == 3) { // 控制输入次数最多3次 70 System.out.println("密码输错超过3次,无法继续输入!"); 71 break; 72 } else { 73 System.out.println("密码输入错误!请重新输入:"); 74 continue; 75 } 76 } 77 } 78 //关闭数据结果集,释放资源 79 rs.close(); 80 //关闭声明,释放资源 81 st.close(); 82 //关闭连接 83 conn.close(); 84 break; 85 } else { 86 System.out.println("您输入的卡号不存在,请重新输入:"); 87 continue; 88 } 89 } catch (Exception e) { 90 System.out.println("您输入的账号格式有误!"); 91 System.out.println("请重新输入:"); 92 continue; 93 } 94 } 95 }
取款功能:通过输入的卡号从数据库中查询数据,若存在,则将重新计算的余额通过修改数据改到相应的余额中
@Override public void Qukuan(Yinlian yinl) { // 取款 System.out.println("请输入您要取款的账号:"); while(true){ try{ Scanner sc=new Scanner(System.in); long a=sc.nextLong(); // 访问数据库 //1、加载驱动:加载数据库提供的驱动类 Class.forName("oracle.jdbc.driver.OracleDriver"); //2、获取数据库连接,通过java的驱动管理器 //url-数据库地址,不同的数据库写法不一样;user-用户名;password-密码 Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:orcl ", "test01", "131281huazioo"); //操作数据库——增删改查 //3、获得操作数据库的声明 Statement st=conn.createStatement(); //5、查询数据 //ResultSet 数据结果集 ResultSet rs = st.executeQuery("select * from BANKCARD where card='" +a+"'"); //遍历结果集 //next()判断是否存在下一条记录,移动指针到下一条记录 if(rs.next()){ //验证卡号 String pw=rs.getString("password"); yue=rs.getInt(yue); System.out.println("请输入您的密码:"); //输入密码 int i=0; while(true){ Scanner qumi=new Scanner(System.in); String pws=qumi.nextLine(); if(pws.equals(pw)){ //验证密码 System.out.println("您要取款的账号信息为:"); System.out.println("******************************"); System.out.println("姓名 身份证号 卡号 金额"); System.out.println(rs.getString("name")+" "+rs.getString("idcard")+" "+rs.getString("card")+" "+rs.getString("yue")); while(true){ try{ System.out.println("请输入取款金额:"); Scanner quj=new Scanner(System.in); int jine=quj.nextInt(); //输入存款金额 if(jine>yue||jine<0){ System.out.println("您输入的数据无效,系统将自动退出!谢谢使用"); //负数提示 break; }else{ yue-=jine; //重新计算余额 try { int ss=st.executeUpdate("update bankcard set yue='" +yue+"' where card='" +a+"'"); } catch (Exception e) { e.printStackTrace(); } System.out.println("取款成功,谢谢使用!"); break; } }catch(Exception e){ System.out.println("您输入的存款金额格式有误!"); System.out.println("请重新输入:"); continue; } } break; }else{ i++; if(i==3){ //控制输入次数最多3次 System.out.println("密码输错超过3次,无法继续输入!"); break; }else{ System.out.println("密码输入错误,请重新输入:"); continue; } } } //关闭数据结果集,释放资源 rs.close(); //关闭声明,释放资源 st.close(); //关闭连接 conn.close(); break; }else{ System.out.println("您输入的卡号不存在,请重新输入:"); continue; } }catch(Exception e){ System.out.println("您输入的账号格式有误!"); System.out.println("请重新输入:"); continue; } } } }
测试类:
1 import java.util.Scanner; 2 3 import com.bank.abc.ATMzi; 4 import com.bank.abc.Bankchuxu; 5 import com.bank.abc.Bankclass; 6 import com.bank.unionpay.Yinlian; 7 8 /** 9 * 10 * @author Administrator 11 *测试类 12 */ 13 public class Test { 14 public static void main(String[] args) { 15 Jiemian.jiemian(); //调界面 16 Yinlian yinl=new Bankchuxu(); 17 while(true){ //死循环实现输入错误返回 18 Scanner sc=new Scanner(System.in); 19 try{ //输入异常 20 int shuru=sc.nextInt(); 21 switch(shuru){ 22 case 0: 23 System.out.println("****************************"); 24 System.out.println("您选择的为开户功能"); 25 ATMzi a=new ATMzi(); 26 a.Kaihu(); //调用开户 27 System.out.println("开户成功!"); 28 Jiemian.jiemian(); 29 break; 30 case 1: 31 System.out.println("****************************"); 32 System.out.println("您选择的为查询功能"); 33 yinl.Chaxun(yinl); 34 Jiemian.jiemian(); 35 break; 36 case 2: 37 System.out.println("****************************"); 38 System.out.println("您选择的为存款功能"); 39 yinl.Cunkuan(yinl); 40 Jiemian.jiemian(); 41 break; 42 case 3: 43 System.out.println("****************************"); 44 System.out.println("您选择的为取款功能"); 45 yinl.Qukuan(yinl); 46 Jiemian.jiemian(); 47 break; 48 case 4: 49 System.out.println("谢谢使用!"); 50 break; 51 default: 52 System.out.println("您选择的菜单不存在!"); 53 System.out.println("请重新选择:"); 54 continue; 55 } 56 if(shuru==4)break; 57 }catch(Exception e){ 58 System.out.println("输入有误!"); 59 System.out.println("请重新选择:"); 60 } 61 } 62 } 63 }
其它类:接口、枚举、单例等
1 package com.bank.unionpay; 2 /** 3 * 4 * @author Administrator 5 *银联接口 6 */ 7 public interface Yinlian { 8 void Chaxun(Yinlian yinl); //查询余额 9 void Cunkuan(Yinlian yinl); //存款 10 void Qukuan(Yinlian yinl); //取款 11 }
1 package com.bank.unionpay; 2 /** 3 * 4 * @author Administrator 5 *四大银行——枚举 6 */ 7 public enum Bank { 8 ABC("农行"),ICBC("工行"),CCB("建行"),BOC("中行"); //枚举类型 枚举列表 9 private final String name; //常量银行名 10 public String getName(){ //getter方法返回银行名 11 return this.name; 12 } 13 private Bank(String name){ //私有构造方法 14 this.name=name; 15 } 16 }
1 package com.bank.unionpay; 2 3 import java.util.Scanner; 4 5 /** 6 * 7 * @author Administrator 8 *ATM机抽象类 9 */ 10 public abstract class ATM { 11 private int yue; //变量余额 12 public abstract void Kaihu(); //抽象方法——开户 13 public int getYue() { //get余额方法 14 return yue; 15 } 16 public void setYue(int yue) { //set余额方法 17 this.yue = yue; 18 } 19 public void Chaxun(Yinlian yinl) { //查询余额 20 System.out.println("您的账户余额为:"+yue); 21 } 22 public void Cunkuan(Yinlian yinl) { //存款 23 while(true){ 24 System.out.println("请输入存款金额:"); 25 Scanner sc=new Scanner(System.in); 26 int jine=sc.nextInt(); //输入存款金额 27 if(jine<0){ 28 System.out.println("输入有误!"); //负数提示 29 continue; 30 }else{ 31 yue+=jine; //重新计算余额 32 break; 33 } 34 } 35 } 36 public void Qukuan(Yinlian yinl) { //取款 37 while(true){ 38 System.out.println("请输入取款金额:"); 39 Scanner sc=new Scanner(System.in); 40 int jine=sc.nextInt(); //输入取款金额 41 if(jine<=yue){ 42 yue-=jine; //重新计算余额 43 break; 44 }else if(jine>yue){ 45 System.out.println("余额不足,无法取款!"); //余额不足提示 46 continue; 47 }else{ 48 System.out.println("输入有误!"); //负数提示 49 continue; 50 } 51 } 52 } 53 }
package com.bank.abc; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.bank.unionpay.Bank; /** * * @author Administrator *银行类——单例模式 */ public class Bankclass { private Bankclass(){ //禁止外部访问构造方法 } private static Bankclass bank=new Bankclass(); //内部产生唯一实例 public static Bankclass getBankclass() //开放一个方法给调用者返回这个实例 { return bank; } private final Bank ABC=Bank.ABC; //银行类型(枚举类型=ABC) private String bankname; //银行名称 public List<Long> card=new ArrayList(); //银行卡列表——集合 public Map<Long,Bankchuxu> Account=new HashMap<>(); //账号储蓄卡集合 }
测是结果