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

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

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;
	}
	@Override
	public 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 {
	//加载驱动,连接数据库,获得Statement
	public  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;
						}
						
				}
			}
		}	
	}

}

猜你喜欢

转载自blog.csdn.net/qq_36055407/article/details/81748496