MySQL项目:银行ATM存取款机系统

1、数据库设计

绘制E-R

 绘制数据库模型

数据库模型图我们可以创建好表和约束之后,点击对象

选中需要绘制模型图的表 

数据库默认是第一个,我们可以选择第三个

 代码段在最下面

可以去看看这三个图案有什么不同,这样比我们一个一个去添加字段设置约束的效率要高很多,一举两得,希望能帮助到大家!

用例2:创建数据库及登录用户并授权

#创建bankDB数据库,如果存在先删除在创建
DROP DATABASE IF EXISTS bankDB;
CREATE DATABASE if not exists bankDB;
 
#创建普通用户bankMaster并授权
grant all on bankdb
to bankMaster@127.0.0.1 identifed by '1234';
登录用户的权限书本上有提到,可以去看看它的解析,这就不多做讲述了。

用例3:创建表、约束

#使用bankDB数据库
use bankDB;
 
 
#客户信息表
DROP TABLE IF EXISTS userInfo;
CREATE TABLE if not exists userInfo(
    customerID INT(8) PRIMARY KEY AUTO_INCREMENT COMMENT'客户编号',
    customerName VARCHAR(10) NOT NULL COMMENT'客户姓名',
    PID CHAR(18) NOT NULL COMMENT '身份证号',
    telephone CHAR(11) NOT NULL COMMENT '手机号码',
    address VARCHAR(50) comment '地址'
)ENGINE=INNODB COMMENT='客户表',
CHARSET=utf8;
 
 
#银行卡信息表
DROP TABLE IF EXISTS cardInfo;
CREATE TABLE if not exists cardInfo(
    cardID VARCHAR(19) PRIMARY KEY NOT NULL COMMENT'银行卡卡号',            
    curID VARCHAR(10) NOT NULL default 'RMB' COMMENT'币种',
    savingID INT(2) NOT NULL COMMENT'存款类型',
    openDate TIMESTAMP NOT NULL COMMENT'开户日期',
    openMoney DECIMAL NOT NULL COMMENT '开户金额',
    balance DECIMAL NOT NULL COMMENT '账户余额', 
    `password` VARCHAR(6) NOT NULL default '888888' COMMENT'密码',
    IsReportLoss BIT NOT NULL default 0 COMMENT '是否挂失',
    customerID INT(8) NOT NULL COMMENT'客户编号'
)ENGINE=INNODB COMMENT='银行卡信息表',
CHARSET=utf8;
 
alter table cardinfo modify openMoney decimal(9,2);
alter table cardinfo modify balance decimal(9,2);
 
#创建外键
alter table cardinfo
add constraint foreign key(customerID) references userinfo(customerID);
alter table cardinfo
add constraint foreign key(savingID) references deposit(savingID);
 
 
#交易信息表
DROP TABLE IF EXISTS tradeInfo;
CREATE TABLE if not exists tradeInfo(
    transDate TIMESTAMP NOT NULL COMMENT'交易日期',
    cardID char(19) NOT NULL NULL COMMENT'卡号',
    transType char(10) NOT NULL COMMENT'交易类型',
    transMoney DECIMAL NOT NULL COMMENT'交易金额',
    remark TEXT COMMENT'交易备注'
)ENGINE=INNODB COMMENT='交易信息表',
CHARSET=utf8;
 
#创建外键
alter table tradeinfo
add constraint foreign key(cardID) references cardinfo(cardID);
 
 
#存款类型表
DROP TABLE IF EXISTS deposit;
CREATE TABLE if not exists deposit(
    savingID INT(2) PRIMARY KEY COMMENT'存款类型',
    savingName VARCHAR(20) NOT NULL COMMENT'存款类型名称',
    curID VARCHAR(10) NOT NULL default 'RMB' COMMENT'存款币种'
)ENGINE=INNODB COMMENT='存款类型表',
CHARSET=utf8
用例4:插入测试数据库

#添加数据
 
#银行客户表数据
INSERT INTO userInfo(customerID,customerName,PID,telephone,address)
VALUES(1,'丁六','567891321242345618','13645667783','北京西城区'),
            (2,'王五','56789132124234567X','13642345112','河北石家庄市'),
            (3,'张三','567891321242345789','13567893246','北京海定区'),
            (4,'丁一','123451321242345618','13056434411','河南新乡'),
            (5,'李四','678911321242345618','13318877954','山东济南市');
 
 
#银行卡信息数据
INSERT INTO cardInfo(cardID,savingID,openDate,openmoney,balance,`password`,IsReportLoss,customerID)
VALUES('1010357612121004',1,NOW(),1,1001,'888888',0,1),
            ('1010357612121130',1,NOW(),1,1,'888888',0,2),
            ('1010357612125678',3,NOW(),1000,6100,'123456',0,3),
            ('1010357612128284',3,NOW(),1000,1001,'888888',0,4),
            ('1010357612121134',1,NOW(),1,1501,'123123',1,5);
 
 
#交易信息表数据
INSERT INTO tradeInfo(transDate,cardID,transType,transMoney,remark)
VALUES(NOW(),'1010357612125678','支取',900,NOW()),
            (NOW(),'1010357612121130','存入',300,NOW()),
            (NOW(),'1010357612121004','存入',1000,NOW()),
            (NOW(),'1010357612121130','存入',1900,NOW()),
            (NOW(),'1010357612121134','存入',5000,NOW()),
            (NOW(),'1010357612121134','存入',500,NOW()),
            (NOW(),'1010357612121134','支取',2000,NOW()),
            (NOW(),'1010357612125678','存入',2000,NOW()),
            (NOW(),'1010357612121134','支取',2000,NOW()),
            (NOW(),'1010357612125678','存入',2000,NOW()),
            (NOW(),'1010357612125678','存入',2000,NOW());
 
 
#存款类型表数据
INSERT INTO deposit(savingID,savingName)
VALUES(1,"定期一年"),(2,"定期二年"),(3,'活期');
用例5:模拟常规业务

#1.修改客户密码
update cardinfo set `password`='123456' where cardID='1010357612125678';
update cardinfo set `password`='123123' where cardID='1010357612121134';
 
#2.办理银行卡挂失
update cardinfo set IsReportLoss=1 where cardID='1010357612121134';
select c.cardID 卡号,c.curID 货币,d.savingName 储蓄种类,c.openDate 开户日期,c.openMoney 开户金额,c.balance 余额,
             c.`password` 密码,c.IsReportLoss 是否挂失,u.customerName 客户姓名
from cardinfo c
inner join userinfo u
on c.customerID=u.customerID
inner join deposit d
on c.savingID=d.savingID;
 
#3.统计银行总存入金额和总总支取金额
select transType 资金流向,sum(transMoney) 总金额 from tradeInfo
where transType='支取' or transType='存入'
group by transType;
 
#4.查询本周开户信息
select c.cardID 卡号,u.customerName 姓名,c.curID 货币,c.savingID 存款类型,c.openDate 开户日期,c.openMoney 开户金额,
             c.balance 开户余额,c.IsReportLoss 账户状态
from cardinfo c
inner join userinfo u
on c.customerID=u.customerID
where week(c.openDate)=week(NOW());
 
#5.查询本月交易金额最高的卡号
select distinct cardID
from tradeinfo 
where  transMoney=(select MAX(transMoney) from tradeinfo where transType='支出' or transType='存入' 
                                     and MONTH(transDate)=MONTH(NOW()));
 
#6.查询挂失客户
select u.customerName 客户姓名,u.telephone 联系电话,c.cardID 卡号,c.IsReportLoss 是否挂失
from userinfo u
inner join cardinfo c
on u.customerID=c.customerID
where c.IsReportLoss=b'1';
 
 
#7.催款提醒业务
select u.customerName 客户姓名,u.telephone 联系电话,c.balance 存款余额
from userinfo u
inner join cardinfo c
on u.customerID=c.customerID
where c.balance<200;
用例6:创建、使用客户友好信息视图

#创建用户视图
DROP VIEW IF EXISTS view_userInfo;
create view view_userInfo
as
select customerID 客户编号,customerName 客户姓名,PID 身份证号,telephone 手机号码,address 地址
from userinfo u;
 
#创建银行卡视图
DROP VIEW IF EXISTS view_cardinfo;
create view view_cardinfo
as
select cardID 卡号,customerName 客户名,c.curID 货币种类,savingName 存款类型,openDate 开户日期,balance 余额, 
            `password` 密码,IsReportLoss 是否挂失
from cardinfo c
inner join userinfo u
on c.customerID=u.customerID
inner join deposit d
on c.curID=d.curID;
 
 
#创建交易信息视图
DROP VIEW IF EXISTS view_transInfo;
create view view_transInfo
as
SELECT transDate 交易日期,transType 交易类型,cardID 卡号, transMoney 交易金额, remark 备注
FROM tradeinfo;
用例7:使用事务完成转账

#使用事务完成转账
#从卡号为“1010357612121134”的账户中转出300元给卡号为“1010357612345678”的账户,即李四转账300元给张三。
#先关闭自动提交状态
set autocommit=0;
 
#开启事务
begin;
update cardinfo set balance=balance-300 where cardID='1010357612121134';
update cardinfo set balance=balance+300 where cardID='1010357612125678';
 
#提交事务
commit;
 
#遇到问题回滚数据到原来的状态
rollback;
 
#恢复自动提交
set autocommit=1;
可以根据书本上的提示完成项目……
 

可以去看看这三个图案有什么不同,这样比我们一个一个去添加字段设置约束的效率要高很多,一举两得,希望能帮助到大家!

用例2:创建数据库及登录用户并授权

#创建bankDB数据库,如果存在先删除在创建
DROP DATABASE IF EXISTS bankDB;
CREATE DATABASE if not exists bankDB;
 
#创建普通用户bankMaster并授权
grant all on bankdb
to bankMaster@127.0.0.1 identifed by '1234';
登录用户的权限书本上有提到,可以去看看它的解析,这就不多做讲述了。

用例3:创建表、约束

#使用bankDB数据库
use bankDB;
 
 
#客户信息表
DROP TABLE IF EXISTS userInfo;
CREATE TABLE if not exists userInfo(
	customerID INT(8) PRIMARY KEY AUTO_INCREMENT COMMENT'客户编号',
	customerName VARCHAR(10) NOT NULL COMMENT'客户姓名',
	PID CHAR(18) NOT NULL COMMENT '身份证号',
	telephone CHAR(11) NOT NULL COMMENT '手机号码',
	address VARCHAR(50) comment '地址'
)ENGINE=INNODB COMMENT='客户表',
CHARSET=utf8;
 
 
#银行卡信息表
DROP TABLE IF EXISTS cardInfo;
CREATE TABLE if not exists cardInfo(
	cardID VARCHAR(19) PRIMARY KEY NOT NULL COMMENT'银行卡卡号',            
	curID VARCHAR(10) NOT NULL default 'RMB' COMMENT'币种',
	savingID INT(2) NOT NULL COMMENT'存款类型',
	openDate TIMESTAMP NOT NULL COMMENT'开户日期',
	openMoney DECIMAL NOT NULL COMMENT '开户金额',
	balance DECIMAL NOT NULL COMMENT '账户余额', 
	`password` VARCHAR(6) NOT NULL default '888888' COMMENT'密码',
	IsReportLoss BIT NOT NULL default 0 COMMENT '是否挂失',
	customerID INT(8) NOT NULL COMMENT'客户编号'
)ENGINE=INNODB COMMENT='银行卡信息表',
CHARSET=utf8;
 
alter table cardinfo modify openMoney decimal(9,2);
alter table cardinfo modify balance decimal(9,2);
 
#创建外键
alter table cardinfo
add constraint foreign key(customerID) references userinfo(customerID);
alter table cardinfo
add constraint foreign key(savingID) references deposit(savingID);
 
 
#交易信息表
DROP TABLE IF EXISTS tradeInfo;
CREATE TABLE if not exists tradeInfo(
	transDate TIMESTAMP NOT NULL COMMENT'交易日期',
	cardID char(19) NOT NULL NULL COMMENT'卡号',
	transType char(10) NOT NULL COMMENT'交易类型',
	transMoney DECIMAL NOT NULL COMMENT'交易金额',
	remark TEXT COMMENT'交易备注'
)ENGINE=INNODB COMMENT='交易信息表',
CHARSET=utf8;
 
#创建外键
alter table tradeinfo
add constraint foreign key(cardID) references cardinfo(cardID);
 
 
#存款类型表
DROP TABLE IF EXISTS deposit;
CREATE TABLE if not exists deposit(
	savingID INT(2) PRIMARY KEY COMMENT'存款类型',
	savingName VARCHAR(20) NOT NULL COMMENT'存款类型名称',
	curID VARCHAR(10) NOT NULL default 'RMB' COMMENT'存款币种'
)ENGINE=INNODB COMMENT='存款类型表',
CHARSET=utf8
用例4:插入测试数据库

#添加数据
 
#银行客户表数据
INSERT INTO userInfo(customerID,customerName,PID,telephone,address)
VALUES(1,'丁六','567891321242345618','13645667783','北京西城区'),
			(2,'王五','56789132124234567X','13642345112','河北石家庄市'),
			(3,'张三','567891321242345789','13567893246','北京海定区'),
			(4,'丁一','123451321242345618','13056434411','河南新乡'),
			(5,'李四','678911321242345618','13318877954','山东济南市');
 
 
#银行卡信息数据
INSERT INTO cardInfo(cardID,savingID,openDate,openmoney,balance,`password`,IsReportLoss,customerID)
VALUES('1010357612121004',1,NOW(),1,1001,'888888',0,1),
			('1010357612121130',1,NOW(),1,1,'888888',0,2),
			('1010357612125678',3,NOW(),1000,6100,'123456',0,3),
			('1010357612128284',3,NOW(),1000,1001,'888888',0,4),
			('1010357612121134',1,NOW(),1,1501,'123123',1,5);
 
 
#交易信息表数据
INSERT INTO tradeInfo(transDate,cardID,transType,transMoney,remark)
VALUES(NOW(),'1010357612125678','支取',900,NOW()),
			(NOW(),'1010357612121130','存入',300,NOW()),
			(NOW(),'1010357612121004','存入',1000,NOW()),
			(NOW(),'1010357612121130','存入',1900,NOW()),
			(NOW(),'1010357612121134','存入',5000,NOW()),
			(NOW(),'1010357612121134','存入',500,NOW()),
			(NOW(),'1010357612121134','支取',2000,NOW()),
			(NOW(),'1010357612125678','存入',2000,NOW()),
			(NOW(),'1010357612121134','支取',2000,NOW()),
			(NOW(),'1010357612125678','存入',2000,NOW()),
			(NOW(),'1010357612125678','存入',2000,NOW());
 
 
#存款类型表数据
INSERT INTO deposit(savingID,savingName)
VALUES(1,"定期一年"),(2,"定期二年"),(3,'活期');
用例5:模拟常规业务

#1.修改客户密码
update cardinfo set `password`='123456' where cardID='1010357612125678';
update cardinfo set `password`='123123' where cardID='1010357612121134';
 
#2.办理银行卡挂失
update cardinfo set IsReportLoss=1 where cardID='1010357612121134';
select c.cardID 卡号,c.curID 货币,d.savingName 储蓄种类,c.openDate 开户日期,c.openMoney 开户金额,c.balance 余额,
			 c.`password` 密码,c.IsReportLoss 是否挂失,u.customerName 客户姓名
from cardinfo c
inner join userinfo u
on c.customerID=u.customerID
inner join deposit d
on c.savingID=d.savingID;
 
#3.统计银行总存入金额和总总支取金额
select transType 资金流向,sum(transMoney) 总金额 from tradeInfo
where transType='支取' or transType='存入'
group by transType;
 
#4.查询本周开户信息
select c.cardID 卡号,u.customerName 姓名,c.curID 货币,c.savingID 存款类型,c.openDate 开户日期,c.openMoney 开户金额,
			 c.balance 开户余额,c.IsReportLoss 账户状态
from cardinfo c
inner join userinfo u
on c.customerID=u.customerID
where week(c.openDate)=week(NOW());
 
#5.查询本月交易金额最高的卡号
select distinct cardID
from tradeinfo 
where  transMoney=(select MAX(transMoney) from tradeinfo where transType='支出' or transType='存入' 
									 and MONTH(transDate)=MONTH(NOW()));
 
#6.查询挂失客户
select u.customerName 客户姓名,u.telephone 联系电话,c.cardID 卡号,c.IsReportLoss 是否挂失
from userinfo u
inner join cardinfo c
on u.customerID=c.customerID
where c.IsReportLoss=b'1';
 
 
#7.催款提醒业务
select u.customerName 客户姓名,u.telephone 联系电话,c.balance 存款余额
from userinfo u
inner join cardinfo c
on u.customerID=c.customerID
where c.balance<200;
用例6:创建、使用客户友好信息视图

#创建用户视图
DROP VIEW IF EXISTS view_userInfo;
create view view_userInfo
as
select customerID 客户编号,customerName 客户姓名,PID 身份证号,telephone 手机号码,address 地址
from userinfo u;
 
#创建银行卡视图
DROP VIEW IF EXISTS view_cardinfo;
create view view_cardinfo
as
select cardID 卡号,customerName 客户名,c.curID 货币种类,savingName 存款类型,openDate 开户日期,balance 余额, 
			`password` 密码,IsReportLoss 是否挂失
from cardinfo c
inner join userinfo u
on c.customerID=u.customerID
inner join deposit d
on c.curID=d.curID;
 
 
#创建交易信息视图
DROP VIEW IF EXISTS view_transInfo;
create view view_transInfo
as
SELECT transDate 交易日期,transType 交易类型,cardID 卡号, transMoney 交易金额, remark 备注
FROM tradeinfo;
用例7:使用事务完成转账

#使用事务完成转账
#从卡号为“1010357612121134”的账户中转出300元给卡号为“1010357612345678”的账户,即李四转账300元给张三。
#先关闭自动提交状态
set autocommit=0;
 
#开启事务
begin;
update cardinfo set balance=balance-300 where cardID='1010357612121134';
update cardinfo set balance=balance+300 where cardID='1010357612125678';
 
#提交事务
commit;
 
#遇到问题回滚数据到原来的状态
rollback;
 
#恢复自动提交
set autocommit=1;
可以根据书本上的提示完成项目……

  • 25
    点赞
  • 176
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java MySQL模拟ATM机系统是一个使用Java编程语言和MySQL数据库技术来模拟实现ATM功能的项目。 首先,我们可以通过Java编写一个ATM类,该类包含账号管理、余额查询、取款、存款、转账、修改密码等功能。利用MySQL数据库存储相关数据。 在MySQL数据库中,我们可以设计一个"users"表来存储用户信息,包括账号、密码、姓名和余额等字段。 我们可以在Java程序中使用JDBC连接MySQL数据库,并通过SQL语句来实现以下功能: 1. 账号管理:在"users"表中插入一条新的用户记录,包括账号、密码、姓名和初始余额等信息。 2. 余额查询:通过输入账号,执行查询语句,从"users"表中获取对应账号的余额字段,并输出显示给用户。 3. 取款:通过输入账号和取款金额,执行更新语句,从"users"表中扣除对应账号的余额字段,并更新数据库中的余额记录。 4. 存款:通过输入账号和存款金额,执行更新语句,向"users"表中添加对应账号的余额字段,并更新数据库中的余额记录。 5. 转账:通过输入转出账号、转入账号和转账金额,执行更新语句,从转出账号扣除对应金额,向转入账号添加对应金额,并更新数据库中的余额记录。 6. 修改密码:通过输入账号和新密码,执行更新语句,将"users"表中对应账号的密码字段更新为新密码。 以上是简单的实现思路,具体实现还需考虑异常处理、用户界面设计等因素。同时,为了保障系统的安全性,我们可以加入数字密码验证、事务处理、账号锁定等制。 通过以上的实现,我们可以模拟ATM机系统的基本功能,增加额外的功能补充完善项目。 ### 回答2: Java MySQL模拟ATM机系统是一个基于Java和MySQL项目,旨在模拟和实现ATM的基本功能。该系统具有如下特点和功能: 1. 用户登录:用户可以通过输入银行卡号和密码来登录系统。 2. 查询余额:登录后,用户可以查询自己的账户余额,系统将从数据库中查询并显示对应的余额信息。 3. 存款:用户可以选择将现金存入ATM中。在存款过程中,系统会检查输入金额的有效性,并将相应的金额更新到数据库中。 4. 取款:用户可以选择从ATM中取款。在取款过程中,系统会检查用户账户余额是否充足,并更新数据库中的账户余额。 5. 转账:用户可以选择将一定金额从自己的账户转到其他账户。在转账过程中,系统会进行双重验证和更新数据库信息。 6. 交易记录:系统可以记录每一笔交易的详细信息,包括交易类型、交易时间、交易金额等,并存储在数据库中。 7. 密码修改:用户可以选择修改自己的登录密码。系统将对用户输入的新密码进行验证,并更新数据库中的密码信息。 8. 退出系统:用户可以选择安全退出ATM机系统。 为了实现该系统,我们将使用Java编写程序,并借助MySQL数据库管理用户和交易信息。在MySQL中,我们将创建用户表和交易记录表,用于存储对应的数据。我们将使用Java JDBC来连接和操作MySQL数据库,通过执行SQL语句来实现对数据的增删改查。 通过以上的功能和技术实现,我们可以构建一个模拟ATM机系统,具备基本的账户管理、交易操作和查询功能。这个系统可以帮助用户在虚拟环境中进行安全、方便的账户管理和交易操作,并通过MySQL数据库保证数据的可靠性和持久性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值