用Eclipse和Mysql编写模拟银行系统

用Eclipse和Mysql编写模拟银行系统

这是我的第一篇博客,本人大一结束,想通过CSDN记录一下自己学习程序的过程,也希望能够帮助到其他同学,有待改进的地方欢迎指正。

作业内容

考试题目及具体要求:

  1. 在MySQL数据库中建立名为bank的数据库,在bank库中建立银行储户表account存储储户信息,结构如下: —(10分)
    在这里插入图片描述
  2. 在eclipse下建立名为“JNXY学号”(例:JNXY2020101001,注意以你的学号为准)的项目–(2分)
    3.在上述你创建的项目内,创建名为jnxyjsj.你的名字首字母缩写.po的包(例:jnxyjsj.zxc.po)针对account表编写实体类Account。—(7分)
  3. 创建名为jnxyjsj.你的名字首字母缩写.dao的包(例:jnxyjsj.zxc.dao),编写数据访问接口AccountDao及其实现类AccountDaoImpl;创建名为jnxyjsj.你的名字首字母缩写.service的包(例:jnxyjsj.zxc.service),业务接口AccountService及其实现类AccountServiceImpl,实现以下业务需求:
    1)储户开户功能,应输入cardID,姓名,密码,初次开户余额为交易额-10(卡费)。
    2)储户根据cardID及password登录系统,只有账号和密码都正确才算登录成功,否则应给出“该储户不存在”或“密码错误”等提示。
    3)成功登录系统后完成存款操作,存款成功后应提示“存款成功”!
    4)成功登录系统后完成取款操作,当取款金额>账户余额时,应提示 “余额不足”。取款成功应提示“取款成功!”
    5)成功登录系统后完成转账操作,转账给他人,应输入他人的cardID,如果账户id有误(不存在),应提示“该储户不存在!”;应保证你的转帐金额<=你的余额,注意两人账户余额的更新,转账成功后,应提示“你向XXX(账户姓名)成功转账XXX(具体金额)元”。
    —本部分共计61分
  4. 创建名为jnxyjsj.你的名字首字母缩写.view的包(例:jnxyjsj.zxc.view),编写用户操作类AccountTest,可以给出具体的选项操作完成以上功能,如(1.开户2.存款3.取款4.转账5.退卡)。无论每个储户来银行办理什么具体业务,都首先应该欢迎,可打印“欢迎光临济宁银行”,当储户退卡离开,都应该表示欢迎其下次再来,可打印“感谢您的光临,欢迎您下次再来!”

我的思路

数据库的创建

首先是利用Navicat Premium创建一个名叫bank的数据库,在bank数据库下面创建account表,并且按照要求填入数据。在这里插入图片描述

写测试类代码

package jnxyjsj.lxy.view;

import java.sql.*;
import jnxyjsj.lxy.service.*;
import java.util.*;
import jnxyjsj.lxy.dao.*;
import jnxyjsj.lxy.po.Account;

public class AccountTest {
 
	public void view(){
		AccountServiceImpl AS=new AccountServiceImpl();
		        
				Scanner sc=new Scanner(System.in);
				int n;
				for (; ; ) {
					System.out.println("===========欢迎光临  济宁银行  欢迎光临==========");
					System.out.println("\t\t1、开户\n\t\t2、登录\n\t\t3、取款\n\t\t4、存款\n\t\t5、转账\n\t\t6、退出");
					System.out.println("===========欢 迎 使 用 自 助 服 务 系 统 ==========");
					System.out.print("输入操作编号:");
					n=sc.nextInt();
					switch(n)
				{
					case 1:
					AS.setAccount();//开户
					break;
					case 2:
					AS.userLogin();//登录
					break;
					case 3:
					AS.drawMoney();//取款
					break;
					case 4:
					AS.depositMoney();//存款
					break;
					case 5:
					AS.transferAccount();//转账
					break;
					case 6:	//退出
					System.out.println("===========感谢您的光临,欢迎您下次再来!==========");
					System.out.println("============感 谢 使 用 自 助 服 务 系 统==========");	
					return;
					default:
					System.out.println("输入错误!请重新输入!");
					break;
				}
			}			
}
	public static void main(String[] args) {
		AccountTest acc =new AccountTest();
		acc.view();
	}
}

写 po 类对象代码

持久对象,可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。

package jnxyjsj.lxy.po;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Account {
	private String name;//姓名
	private String cardID;//账号
	private String password;//密码
	private double balance;//余额
	public Account(){}
	public Account(String name,String cardID,String password,double balance){
		this.name=name;
		this.cardID=cardID;
		this.password=password;
		this.balance=balance;
		
	}
	public String getName(){
		return this.name;
	}
	public void setName(String name){
		this.name=name;
	}
 
 
	public String getAccountId(){
		return this.cardID;
	}
	public void setAccountId(String cardID){
		this.cardID=cardID;
	}
 
 
	public String getPassword(){
		return this.password;
	}
	public void setPassword(String password){
		this.password=password;
	}
 
	public double getBalance(){
		return this.balance;
	}
	public void setBalance(double balance){
		this.balance=balance;
	}

}

写 service 服务类和服务类接口

package jnxyjsj.lxy.service;

import java.util.Scanner;

import jnxyjsj.lxy.po.Account;
public interface AccountService{
	//开户
	public void setAccount();
	//登录
	public void userLogin();
	//取款
	public void drawMoney();
	//存款
	public void depositMoney();
	//转账
	public void transferAccount();
	//退出
	//public void cancel();
}
package jnxyjsj.lxy.service;


import java.sql.SQLException;
import java.util.Scanner;

import jnxyjsj.lxy.dao.AccountDao;
import jnxyjsj.lxy.dao.AccountDaoImpl;
import jnxyjsj.lxy.po.Account;

	public class AccountServiceImpl implements AccountService{
		AccountDaoImpl DAO = new AccountDaoImpl();
		public void setAccount() {
			// TODO Auto-generated method stub
			System.out.print("欢迎开户!请按照提示填写以下信息:");
			System.out.print("\n");
			DAO.setAccountDao();
		}

		public void userLogin() {
			// TODO Auto-generated method stub
			System.out.print("欢迎登录!请按照提示操作:");
			System.out.print("\n");
			DAO.userLoginDao();
		}

		public void drawMoney() {
			// TODO Auto-generated method stub
			
			System.out.print("欢迎使用取款系统!请按照提示操作:");
			System.out.print("\n");
			DAO.drawMoneyDao();
		}

		public void depositMoney() {
			// TODO Auto-generated method stub
			System.out.print("欢迎使用存款系统!请按照提示操作:");
			System.out.print("\n");
			DAO.depositMoneyDao();
		}
		public void transferAccount() {
			// TODO Auto-generated method stub
			System.out.print("欢迎使用转账系统!请按照提示填操作:");
			System.out.print("\n");
			DAO.transferAccountDao();
		}

//		@Override
//		public void cancel() {
//			// TODO Auto-generated method stub
//			
//		}

		}
		 
		 
		 

写Dao类访问呢数据库

最主要也是让我最头疼的就是访问数据库的这些代码了,修修改改好几天才弄明白,一部分原因是因为疫情原因,老师授课时间有限(考前还在讲课),另一部分原因也是因为自己学的不透彻。废话不多说上源码哈哈。

package jnxyjsj.lxy.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.mysql.jdbc.PreparedStatement;

import jnxyjsj.lxy.po.Account;
//import com.shao.model.user;
public interface AccountDao{
	//定义接口类
	//开户
	public void setAccountDao();
	//登录
	public void userLoginDao();
	//取款
	public abstract void drawMoneyDao();
	//存款
	public void depositMoneyDao();
	//转账
	public void transferAccountDao();
	//退出
	//public void cancelDao();
	
}
package jnxyjsj.lxy.dao;

import java.sql.*;
import java.util.*;
import java.util.Scanner;

import jnxyjsj.lxy.dao.*;
import jnxyjsj.lxy.po.*;
import jnxyjsj.lxy.view.*;
import jnxyjsj.lxy.service.*;

import java.beans.PropertyVetoException;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;

import jnxyjsj.lxy.po.*;
import com.mysql.jdbc.*;
import com.mysql.jdbc.Connection;

public  class AccountDaoImpl implements AccountDao{
	int i,j;
	String selectSql = "SELECT password FROM account where cardID=?";
	String selectSql2 = "SELECT balance FROM account where cardID=?";
	String insertSql = "INSERT INTO account VALUES(?,?,?,?)";
	String updateSql = "UPDATE account SET balance = balance + ? WHERE cardID=?";
	String updateSql2 = "UPDATE account SET balance = balance - ? WHERE cardID=?";
	String deleteSql = "DELETE FROM account WHERE cardID=?";
	String sql="select * from account where cardID=? and password=? ";
	DBUtil db = new DBUtil();
	Scanner scanner=new Scanner(System.in);
	Statement stmt=null;
	ResultSet rs = null;
	Connection conn=null;
	PreparedStatement pstm=null;
	ResultSet rest=null;



	@Override
	public void setAccountDao() {
		// TODO Auto-generated method stub
		try {
			//链接数据库
			db.getConnection();
			//执行添加
			System.out.println("请按照顺序输入卡号、姓名、密码、存入金额");
			System.out.print("请输入卡号:");
			String String1=scanner.next();
			System.out.print("请输入姓名:");
			String string2=scanner.next();
			System.out.print("请输入密码:");
			String String3=scanner.next();
			System.out.print("请存入金额:");
			String String4=scanner.next();
			double value = Double.valueOf(String4.toString());
			value = value-10;//首次开户金额 -10 元手续费
			//if语句判断是否大于开户手续费
			if(value>0) {
				String result = String .format("%.2f",value);
				int count = db.executeUpdate(insertSql, new String[]{String1,string2,String3,result});
				System.out.println("添加" + count + "用户");
				System.out.println("开户成功!欢迎您!");
				System.out.println("首次开户扣除手续费10元,您的当前余额为"+value+"元");
			}else {
				System.out.println("您存入的余额不足10元手续费!");
			}

		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			db.closeAll();
		}
		}
	
	
	@Override
	public void userLoginDao() {
		// TODO Auto-generated method stub
		try {
			//链接数据库
			db.getConnection();
			//查看是否存在登录账号
			System.out.println("请输入您的账号:");
			String String5=scanner.next();
			rs = db.executeQuery(selectSql,new String[]{String5});
//			System.out.println("查询成功");
			String password = null;
			while(rs.next()) {
//			System.out.println("password="+rs.getString("password"));
			password = rs.getString("password");
//			System.out.println(value);
	}
			
//			System.out.println(value);
			System.out.println("请输入您的密码:");
			String String6=scanner.next();
			double password1 = Double.valueOf(String6.toString());
			double password2 = Double.valueOf(password.toString());

		if(password1 == password2) {
			System.out.println("登陆成功\n");
			
			rs = db.executeQuery(selectSql2,new String[]{String5});
//			System.out.println("查询成功");
			String balance = null;
			while(rs.next()) {
			balance = rs.getString("balance");
			System.out.println("当前账户("+String5+")的余额是 "+balance+"元\n");
	}
		}else {
			System.out.println("登陆失败\n");
		}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			db.closeAll();
		}
		
	}

	@Override
	public void drawMoneyDao() {
		// TODO Auto-generated method stub
		//执行修改
		try {
			//链接数据库
			db.getConnection();
			System.out.print("请输入卡号:");
			String String7=scanner.next();
			System.out.println("请输入您的密码:");
			String String8=scanner.next();
			rs = db.executeQuery(selectSql,new String[]{String7});
//			System.out.println("查询成功");
			String password = null;
			while(rs.next()) {
			password = rs.getString("password");
	}
			
//			System.out.println(value);
			double password1 = Double.valueOf(String8.toString());
			double password2 = Double.valueOf(password.toString());

		if(password1 == password2) {
			System.out.println("登陆成功!");
			System.out.print("取款金额:");
			String String9=scanner.next();
//			double value = Double.valueOf(String9.toString());
//			value = -value;//取款扣费
//			String result = String .format("%.2f",value);
			//执行修改
			int count = db.executeUpdate(updateSql2, new String[]{String9,String7});
			System.out.println("您取款"+String9+"元");
			System.out.println("取款成功");
			rs = db.executeQuery(selectSql2,new String[]{String7});
			String balance = null;
			while(rs.next()) {
			balance = rs.getString("balance");
			System.out.println("当前账户("+String7+")的余额是 "+balance+"元\n");
	}

		}else {
			System.out.println("密码输入错误,登陆失败\n");
		}		
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			db.closeAll();
		}


	}

	
	
	@Override
	public void depositMoneyDao() {
		// TODO Auto-generated method stub
		//执行修改
		try {
			//链接数据库
			db.getConnection();
			System.out.print("请输入卡号:");
			String String10=scanner.next();
			System.out.println("请输入您的密码:");
			String String11=scanner.next();
			rs = db.executeQuery(selectSql,new String[]{String10});
//			System.out.println("查询成功");
			String password = null;
			while(rs.next()) {
			password = rs.getString("password");
	}
			
//			System.out.println(value);
			double password1 = Double.valueOf(String11.toString());
			double password2 = Double.valueOf(password.toString());

		if(password1 == password2) {
			System.out.println("登陆成功\n");
			System.out.print("存款金额:\n");
			String String7=scanner.next();
//			double value = Double.valueOf(String7.toString());
//			value = value;//取款扣费
//			String result = String .format("%.2f",value);
			int count = db.executeUpdate(updateSql, new String[]{String7,String10});
			System.out.println("您取款"+String7+"元");
			System.out.println("存款成功");
			rs = db.executeQuery(selectSql2,new String[]{String10});
			String balance = null;
			while(rs.next()) {
			balance = rs.getString("balance");
			System.out.println("当前账户("+String10+")的余额是 "+balance+"元\n");
	}

		}else {
			System.out.println("密码输入错误,登陆失败\n");
		}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			db.closeAll();
		}


	}
	


	@Override
	public void transferAccountDao() {
		// TODO Auto-generated method stub
		try {
			//链接数据库
			db.getConnection();
			System.out.print("请输出卡号:");
			String String12=scanner.next();
			System.out.println("请输入您的密码:");
			String String13=scanner.next();
			rs = db.executeQuery(selectSql,new String[]{String12});
//			System.out.println("查询成功");
			String password = null;
			while(rs.next()) {
			password = rs.getString("password");
	}
			
//			System.out.println(value);
			double password1 = Double.valueOf(String13.toString());
			double password2 = Double.valueOf(password.toString());

		if(password1 == password2) {
			System.out.println("登陆成功\n");
			System.out.print("请确认转出卡号:"+String12+"\n");
//			String String9=scanner.next();			
			System.out.print("请输入转入卡号:");			
			String String14=scanner.next();	
			System.out.print("转账金额:");
			String String15=scanner.next();
			
			double value = Double.valueOf(String15.toString());
			double value1 = -value;//转出扣费扣费
			String result = String .format("%.2f",value);
			String result2 = String .format("%.2f",value1);
			int count = db.executeUpdate(updateSql, new String[]{result2,String12});
			int count1 = db.executeUpdate(updateSql, new String[]{result,String14});
			System.out.println("您从账号"+String12+"转账给账号"+String14+" ¥:"+String15+"元\n");
			System.out.println("转账成功");
			rs = db.executeQuery(selectSql2,new String[]{String12});
			String balance = null;
			while(rs.next()) {
			balance = rs.getString("balance");
			System.out.println("当前账户("+String12+")的余额是 "+balance+"元\n");
	}
		}else {
			System.out.println("密码输入错误,登陆失败\n");	
		}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			db.closeAll();
		}
		
		}
	
		
	
//	@Override
//	public void cancelDao() {
//
//	}
	
}
		
以下是链接数据库的工具,也放在dao文件夹下
package jnxyjsj.lxy.dao;


import java.io.FileInputStream;
import java.util.Properties;

public class Config {
	private static Properties p = null;
	static {
		try {
			p = new Properties();
			p.load(new FileInputStream("config/mysql.properties"));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static String getValue(String key) {
		return p.get(key).toString();
	}
}
package jnxyjsj.lxy.dao;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class DBUtil {
	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;

	/**
	 * 得到数据库链接
	 */
	public Connection getConnection() throws ClassNotFoundException,
			SQLException, InstantiationException, IllegalAccessException {
		//ͨ通过Config读取MySQL数据库配置信息
		String DRIVER = Config.getValue("driver");
		String URL = Config.getValue("url");
		String USERNAME = Config.getValue("username");
		String PASSWORD = Config.getValue("password");
		try {
			// 指定驱动程序
			Class.forName(DRIVER);
			// 建立数据库链接
			conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
			return conn;
		} catch (Exception e) {
			// 如果出现错误抛出异常
			throw new SQLException("驱动错误或连接失败!");
		}
	}

	/**
	 * 释放资源
	 */
	public void closeAll() {
		//如果rs不空,关闭rs
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		// 如果pstmt不空,关闭pstmt
		if (pstmt != null) {
			try {
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		// 如果conn 不空,关闭conn 
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 *执行的SQL语句,可以进行查询
	 */
	public ResultSet executeQuery(String preparedSql, String[] param) {
		// 处理SQL,执行SQL
		try {
			// 得到PreparedStatement对象
			pstmt = conn.prepareStatement(preparedSql);
			if (param != null) {
				for (int i = 0; i < param.length; i++) {
					// 为预编译sql设置参数
					pstmt.setString(i + 1, param[i]);
				}
			}
			//执行SQL语句
			rs = pstmt.executeQuery();
		} catch (SQLException e) {
			// 处理SQLException异常
			e.printStackTrace();
		}
		return rs;
	}

	/**
	 * ִ执行SQL语句,可以增删改的操作,不能执行查询
	 */
	public int executeUpdate(String preparedSql, String[] param) {

		int num = 0;

		try {
			// 得到PreparedStatement对象
			pstmt = conn.prepareStatement(preparedSql);
			if (param != null) {
				for (int i = 0; i < param.length; i++) {
					// 为预编译sql设置参数
					pstmt.setString(i + 1, param[i]);
				}
			}
			// 执行SQL语句
			num = pstmt.executeUpdate();
		} catch (SQLException e) {
			// 处理SQLException异常
			e.printStackTrace();
		}
		return num;
	}

}
最后是数据库的地址和密码放在config文件夹内
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/bank?useUnicode=true&characterEncoding=utf8
username=root
password=123456

以上就是代码的全部内容

通过以上代码可以实现从控制台对数据库的增删改查,这个是1.0版本,还需要改进的地方有很多,下学期学了界面之后我希望能写出一个界面模拟银行系统。如果以上内容有需要改进的地方请多多指正。

  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值