用Eclipse和Mysql编写模拟银行系统
这是我的第一篇博客,本人大一结束,想通过优快云记录一下自己学习程序的过程,也希望能够帮助到其他同学,有待改进的地方欢迎指正。
作业内容
考试题目及具体要求:
- 在MySQL数据库中建立名为bank的数据库,在bank库中建立银行储户表account存储储户信息,结构如下: —(10分)
- 在eclipse下建立名为“JNXY学号”(例:JNXY2020101001,注意以你的学号为准)的项目–(2分)
3.在上述你创建的项目内,创建名为jnxyjsj.你的名字首字母缩写.po的包(例:jnxyjsj.zxc.po)针对account表编写实体类Account。—(7分) - 创建名为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分 - 创建名为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版本,还需要改进的地方有很多,下学期学了界面之后我希望能写出一个界面模拟银行系统。如果以上内容有需要改进的地方请多多指正。