功能:转账、存款(转账失败时事务回滚)、余额查询、取款、分页查询、注册用户

JAVA中利用JDBC连接数据库,通过增删改查模拟ATM

(注册功能和分页查询在持久层和业务层写了,在模拟时未用到)

OracleSQL中建立 一个表如下:

susername代表用户名

password代表密码(注意代码中的单词写错了)

balance代表余额

create table tb_atm(username varchar(10),pasword varchar(10),banlance number(10));

username pasword balance
马云 123456 101000
小王 123456 100

<个人所写仅供参考>

1.映射

package atm_po;public class Atm {private String username;private String pasword;private int banlance;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPasword() {return pasword;}public void setPasword(String pasword) {this.pasword = pasword;}public int getBanlance() {return banlance;}public void setBanlance(int banlance) {this.banlance = banlance;}@Overridepublic String toString() {return "Atm [username=" + username + ", pasword=" + pasword + ", banlance=" + banlance + "]";}}

2.访问层(DAO)

package atm_dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import atm_po.Atm;
//方法有:1.单人数据更新2.单人的数据查询3.分页数据查询4.余额查询5.用户 注册6.转账功能
public class AtmDao {//加载驱动,连接数据库,获得Statementpublic  Connection getConn() {Connection conn=null;try {Class.forName("oracle.jdbc.driver.OracleDriver");conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "123456");} catch (ClassNotFoundException e) {System.out.println("驱动加载失败...");e.printStackTrace();} catch (SQLException e) {System.out.println("数据库连接失败...");e.printStackTrace();}return conn;}public Statement getState() {Statement state=null;try {state=getConn().createStatement();} catch (SQLException e) {System.out.println("创建Statement失败");e.printStackTrace();}return state;}//对数据库对应用户余额的更新public void updateDao(String username,int money) {String sql="update tb_atm set balance='"+money+"'where username='"+username+"'";try {getState().executeUpdate(sql);} catch (SQLException e) {System.err.println(username+"用户数据跟新失败!");e.printStackTrace();}}//查询用户在数据库的数据,完成ATM的映射public Atm queryDao(String username) {Atm atm=null;   try {String sql="select * from tb_atm where username='"+username+"'";ResultSet rs=getState().executeQuery(sql);if(rs.next()) {atm=new Atm();atm.setUsername(rs.getString("username"));atm.setPasword(rs.getString("pasword"));atm.setBanlance(rs.getInt("balance"));}else{System.out.println("用户数据获取失败");}} catch (SQLException e) {System.err.println("用户数据获取失败!");e.printStackTrace();}return atm;}//余额查询public int banlanceDao(String username) {return queryDao(username).getBanlance();}//分页查询public List<Atm> queryAll(int start,int end) {List<Atm> list=new ArrayList<Atm>();String sql="select * from (select rownum r,tb_atm.* from tb_atm)t where t.r between'"+start+"' and '"+end+ "'"; Statement st=getState();try {ResultSet rs=st.executeQuery(sql);while(rs.next()) {Atm atm=new Atm();atm.setUsername(rs.getString("username"));atm.setPasword(rs.getString("pasword"));atm.setBanlance(rs.getInt("balance"));list.add(atm);}} catch (SQLException e) {System.out.println("分页查询失败");e.printStackTrace();}return list;}//注册用户,此处使用预处理,此时就不能使用Stament了,由于以上没有封装public void register(Atm atm){Connection conn=getConn();//预处理try {System.out.println("开始注册");String sql="insert into tb_atm(username,pasword,balance)values(?,?,?)";PreparedStatement ps=conn.prepareStatement(sql);ps.setString(1, atm.getUsername());ps.setString(2, atm.getPasword());ps.setInt(3, atm.getBanlance());ps.executeUpdate();} catch (SQLException e) {System.out.println("注册失败!");e.printStackTrace();}}//对于转账功能应当重新写一个方法,因为转账的过程可能会失败,此时需要事务回滚,不能扣除转账人的存款,由于在Java//中提交事务是系统默认的,所以我们需要修改一下状态,使用conn.setAutteoCunmmit(false),然后将conn.rollBack()写入catch中//保证在数据出出现问题时,会执行数据回滚操作public void zhuanzhangDao(String zusername,int money,String rusername) {Connection conn=getConn();//改变事务自动提交的状态try {conn.setAutoCommit(false);Statement st=conn.createStatement();//对转账人数据的查询处理if(money<this.banlanceDao(zusername)) {int n=this.banlanceDao(zusername)-money;String sql="update tb_atm set balance='"+n+"'where username='"+zusername+"'";st.executeUpdate(sql);//对转入账户的处理int n1=this.banlanceDao(rusername)+money;String sql1="update tb_atm set balance='"+n1+"'where username='"+rusername+"'";st.executeUpdate(sql1);System.out.println("转账成功");conn.commit();}else {System.out.println(zusername+"余额不足!");}} catch (Exception e) {System.out.println("转账失败!");try {conn.rollback();} catch (SQLException e1) {System.out.println("事务回滚失败");e1.printStackTrace();}}}
}

3.业务层(Service)

package atm_service;
import java.util.List;import org.junit.Test;import atm_dao.AtmDao;
import atm_po.Atm;public class AtmService {//存款public void cunkuan(String username,int money) {AtmDao ad=new AtmDao();Atm atm=ad.queryDao(username);atm.setBanlance(atm.getBanlance()+money);ad.updateDao(username, atm.getBanlance());}//取款public void qukuan(String username,int money) {AtmDao ad=new AtmDao();Atm atm=ad.queryDao(username);if(atm.getBanlance()>money) {atm.setBanlance(atm.getBanlance()-money);ad.updateDao(username, atm.getBanlance());}else {System.out.println("余额不足!");}}//查询余额public int query(String username) {AtmDao ad=new AtmDao();Atm atm=ad.queryDao(username);return atm.getBanlance();}//查询多条数据,指定分页查询public List<Atm> allQuery(int start,int end) {AtmDao  ad=new AtmDao();return ad.queryAll(start, end);}//转账功能public void zhuanzhang(String zusername,int money,String rusername) {AtmDao ad=new AtmDao();ad.zhuanzhangDao(zusername, money, rusername);}//用户注册功能public void register(Atm atm) {AtmDao ad=new AtmDao();ad.register(atm);}}

4.登陆DAO

package login_dao;
import atm_dao.AtmDao;
import atm_po.Atm;public class LoginDao {public Atm login(String username){ AtmDao ad=new AtmDao();return ad.queryDao(username);}//编写一个检测用户是否存在的功能public boolean detection(String username) {Atm atm=new AtmDao().queryDao(username);if(atm==null) {return false;}else{return true;}}
}

5.控制层(Action)

package dengluAction;import login_dao.LoginDao;public class Action {public boolean login(String username,String password) {LoginDao ld=new LoginDao();if(ld.login(username)==null) {System.out.println("用户不存在,登陆失败");return false;}else if(ld.login(username).getPasword().equals(password)){return true;}else {System.out.println("密码错误");return false;}}
}

6.模拟测试

package ceshi;import java.util.Scanner;
import atm_service.AtmService;
import dengluAction.Action;
import login_dao.LoginDao;public class test {public static void main(String[] args) {//模拟登陆Scanner scan=new Scanner(System.in);Action ac=new Action();AtmService ad=new AtmService();String username=null;String password=null;System.out.println("请输入用户名:");username=scan.nextLine();System.out.println("请输入密码:");password=scan.nextLine();if(ac.login(username, password)) {System.out.println("登陆成功....");System.out.println("欢迎        "+username+"      使用ATM");p:while(true) {System.out.println("1.存款 2.取款 3.转账4.查询服务/r/n请输入您的服务请求编号");int value=scan.nextInt();scan.nextLine();switch(value) {case 1:System.out.println("请输入要存款的金额:");int money=scan.nextInt();scan.nextLine();ad.cunkuan(username, money);System.out.println("是否继续使用服务?是请数入1,否请输入2");int n=scan.nextInt();scan.nextLine();if(n==2) {break p;}else {continue;}case 2:System.out.println("请输入要存款的金额:");int money1=scan.nextInt();scan.nextLine();ad.qukuan(username, money1);System.out.println("是否继续使用服务?是请数入1,否请输入2");int n3=scan.nextInt();scan.nextLine();if(n3==2) {break p;}else {continue;}case 3:System.out.println("请输入对方的姓名:");String name=scan.nextLine();LoginDao ld=new LoginDao();boolean bl=ld.detection(name);if(bl) {System.out.println("请输入转款的额度:");int money3=scan.nextInt();scan.nextLine();ad.zhuanzhang(username, money3, name);}else {System.out.println("对方账号不存在");}System.out.println("是否继续使用服务?是请数入1,否请输入2");int n2=scan.nextInt();scan.nextLine();if(n2==2) {break p;}else {continue;}case 4:System.out.println("您的账户余额为:"+ad.query(username));System.out.println("是否继续使用服务?是请数入1,否请输入2");int n1=scan.nextInt();scan.nextLine();if(n1==2) {break p;}else {continue;}}}} }}

用java、JDBC模拟银行ATM取款、存款、转账、注册用户(笔记)相关推荐

  1. Java 多线程 模拟银行ATM实时存取钱

    近期想回顾一些知识: 一.Java 多线程 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.多线程是多任务的一种特别的形式,但多线程使用了更小的资源开 ...

  2. 用Java程序模拟银行ATM机,实现包括存款、取款、查询、转账功能的简单应用

    (1)想象现实世界中的相关操作沙及哪些实体呢?一个是储户,一个是ATM机.因 此根据面向对象中的抽象原则,可将其抽象为两个类:代表储户的账户信息类,代表银行 ATM机的ATM类.外加一个主类(负责实例 ...

  3. Java程序模拟银行ATM机,实现存款、取款、查询、转账功能等操作

    一.介绍 ATM柜员机模拟程序 程序的功能点如下: 要求使用图形用户界面: 通过主界面,可以进入管理员界面.用户界面.系统设置界面.退出: 启动软件,可以进入用户模式,也可以进入系统管理模式: 进入系 ...

  4. c语言模拟银行ATM的程序,简单模拟银行ATM取款系统 | C/C++程序员之家

    学习C#,第一次C#实验课,模拟ATM取款系统,锻炼基本的C#语法以及选择控制语句! 实现功能: 1.取款 2.余额查询 3.修改密码 4.退出 [cpp] using System; using S ...

  5. 模拟银行ATM存款存取款的相关功能

    模拟银行ATM存款存取款的相关功能 具体需求: 模拟.3张银行卡,1001,1002,1003,分别设置密码和余额(可以用9个变里分别保存卡号.密码和余额) 提示用户输入银行卡和密码 如果用户输入正确 ...

  6. python循环案例:模拟银行ATM存款取款

    案例:模拟银行ATM存款取款 1.模拟3张银行卡,1001,1002,1003,分别设置密码和余额(使用列表嵌套字典的方式): 2.提示用户输入银行卡和密码,遍历每张卡的信息验证是否成功: 3.如果用 ...

  7. python循环结构练习(五)—— 模拟银行ATM存款取款

    一. 场景描述案例:模拟银行ATM存款取款 1.模拟3张银行卡,1001,1002,1003,分别设置密码和余额(使用列表嵌套字典的方式): 2.提示用户输入银行卡和密码,遍历每张卡的信息验证是否成功 ...

  8. java模拟银行存取_JAVA基础案例 模拟银行存取款业务

    模拟银行存取款业务 编写一个Java应用程序,模拟网上银行登录及存取款业务.登录时需判断银行卡号和银行卡密码,当输入的卡号和密码都正确时,登录成功,提示当前登录的账户名,并进入下一步选择操作类型.操作 ...

  9. java实验报告之模拟银行存取款业务

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com Time of completion:2022.12.20 La ...

最新文章

  1. 0.2秒居然复制了100G文件?
  2. python之路--嵌套函数、匿名函数、高阶函数。函数的递归
  3. mybatis 批量查询参数语句
  4. [SPOJ375]QTREE - Query on a tree【树链剖分】
  5. MTK Code Sync Clone
  6. 《架构之美》学习随笔:设计第一步
  7. JavaScript的Array对象使用(1)
  8. hmcl手机版_hmcl启动器app下载
  9. java 数组排序 Arrays.sort()用法
  10. smail if-eqz理解
  11. itext文本域自动换行_itextpdf生成pdf问题汇总
  12. 高仿闪电报销app查看图片效果的实现
  13. 在线免费给图片添加水印,图片加水印方法教程!
  14. 智能电表DLT698.45-2017协议规约红外无线抄表报文解析示例说明
  15. Jsp实验0:调试运行eBuy电子商城系统
  16. 2021年,我们 CSDN App做了什么?
  17. 阿里巴巴python岗位_想到阿里巴巴从事Python吗?年薪300K不是梦!
  18. 卷积神经网络预测数据值,一维卷积神经网络 keras
  19. 小学生python游戏编程arcade----灯光示例
  20. oracle中数据文件创建,操作oracle中的数据文件

热门文章

  1. wegame搭建饥荒联机服务器教程
  2. Python学习日记(三) 学习使用dict
  3. opencv滤镜-去色滤镜
  4. 真正统治世界的十大算法
  5. 【win32】day11-windows的库/静态库/动态库
  6. 性能测试工具LoadRunner的基本使用
  7. SAP 长期计划编制和模拟
  8. 手指静脉解剖学与成像特点分析
  9. SEO赚钱思路,真的能够赚钱吗?
  10. Elasticsearch系列——全文搜索控制精准度