用 JavaEE + Oracle 开发的一个简易版银行信息管理系统,具备用户管理、银行卡管理、存取款管理、贷款管理、业务提醒、统计查询等功能。用到了Oracle数据库存储过程、触发器等功能。
系统利用 java 开发,使用 Spring Boot 框架、MyBatis 框架简化逻辑操作;
模板引擎使用 Thymeleaf;
前端同时使用 BootStrap 技术,借鉴已有的后台管理网站模板开发;
开发工具包括但不仅限于下面所示:
(1) Intellij IDEA:JavaEE开发;
(2) VMware Workstation Pro:含有 Oracle 数据库平台;
(3) MobaXterm:SSH工具,用于连接Oracle数据库,进行对应的命令行数据操作;
(4) Navicat Premium 12:数据库管理工具,用于远程连接Oracle数据库,可视化界面操作。
系统采用Maven进行依赖包管理。
搜索 BootStrap 模板,选择合适的模板作为开发基础模板;
搭建开发平台,配置对应的连接配置参数,利用 Intellij IDEA 创建一个JavaEE项目Demo,包含Spring Boot框架、MyBatis框架、Thymeleaf模板引擎、BootStrap网站模板和Oracle数据库连接。
根据要求,设计网站前端页面的内容与跳转,包含登录注册、用户管理、银行卡管理、存取款管理、贷款管理、业务提醒、统计查询和消息通知共计八个模块。
根据银行管理系统的需求和八个功能模块的需求,设计数据库模型,考虑所需要设计的数据信息,设计并创建对应的表。
依次按照登录注册、用户管理、银行卡管理、存取款管理、贷款管理、统计查询、业务提醒和消息通知的顺序实现对应的功能模块的后端逻辑,实现前后端的数据交互、内容展示和用户操作。各个模块的功能主要包含如下所示:
(1) 登录注册:包好用户注册、用户登录;
(2) 用户管理:用户信息修改、密码修改;
(3) 银行卡管理:用户新建卡、注销卡、查看个人的所有卡信息;
(4) 存取款管理:用户存款与取款;
(5) 贷款管理:用户查看当前的借贷情况、借款与还款;
(6) 统计查询:按照一定的顺序条件给用户展示所有的存款、取款、借款和还款的数据信息,同时可以提供搜索查询功能;
(7) 业务提醒:主要是关于用户进行对应的操作是否给予对应的消息提供,包含存款提醒、取款提醒、借款提醒和还款提醒;
(8) 消息通知:在用户订阅业务提醒的前提下,只要用户进行存款、取款、借款和还款的任一项操作均记录到数据库中并以消息的形式的展示给用户。
在开发过程中还需不断进行数据库设计优化、页面改进等工作;
在实现对应的与数据库交互的操作时应优先考虑是否应该是否存储过程和触发器,能够简化操作或者更加符合开发逻辑则应采用。
银行管理系统的前端界面布局优化。
通过上述数据和截图的显示可以看出来已经完成了一个简易版的银行管理系统,包含用户管理、银行卡管理、存取款管理、贷款管理、业务提醒、统计查询等功能。
开发过程中还实现了触发器和存储过程的操作,由于功能比较多,在此各展示一个案例。
(1) 触发器
Oracle数据库中并不支持表的ID自增长,但是在一般操作中我们也不会去自定义ID,或者经过一系列查询对比操作然后实现自增长,这样难免过于复杂化。
在此处,就可以设计一个简单触发器实现ID自增长。
以用户信息信息表举例,先创建一个用户信息ID序列,然后创建一个触发器,在每次进行插入操作是自动实现ID变为下一个。
-- 2.USERINFO
create sequence userinfo_id_seq; --创建序列
create or replace trigger userinfo_id
before insert on USERINFO --before:执行DML等操作之前触发
for each row --行级触发器
begin
select userinfo_id_seq.nextval into :new.id from dual;
end;
/
(2) 存储过程
存储过程在系统中的应用就很广泛了,一般的增删改查理论上都是可以使用存储过程实现的。但是过于简单的我们也并没有必要使用,在一些逻辑相对复杂或者需要组合多个SQL操作才能实现的逻辑可以采用存储过程实现。
此处以还款操作举例,用户在进行还款操作是需要先进行卡余额的更新,之后再进行还款记录的插入。
可以先在Oracle中实现该存储过程,之后再项目中的xxxMapper.xml 文件中将原本进行的SQL语句更改为存储过程即可。
数据库表创建语句
CREATE TABLE USERINFO(
ID NUMBER PRIMARY KEY,
FIRSTNAME VARCHAR2(50),
LASTNAME VARCHAR2(20),
EMAIL VARCHAR2(50),
PHONE VARCHAR2(50),
USERNUM VARCHAR2(50),
POSITION VARCHAR2(50),
CITY VARCHAR2(50),
ADDRESS VARCHAR2(50),
DESCRIPTION VARCHAR2(255)
);
CREATE TABLE SIGNON(
ID NUMBER PRIMARY KEY,
USERNUM VARCHAR2(50),
PASSWD VARCHAR2(100)
);
CREATE TABLE CARD(
ID NUMBER PRIMARY KEY,
USER_ID NUMBER,
CARD_NUM VARCHAR2(50),
CREATE_TIME DATE,
BALANCE NUMBER
);
CREATE TABLE DEPOSIT(
ID NUMBER PRIMARY KEY,
CARD_ID NUMBER,
TIME DATE,
MONEY NUMBER
);
CREATE TABLE WITHDRAW(
ID NUMBER PRIMARY KEY,
CARD_ID NUMBER,
TIME DATE,
MONEY NUMBER
);
CREATE TABLE LOAN(
ID NUMBER PRIMARY KEY,
CARD_ID NUMBER,
TIME DATE,
MONEY NUMBER
);
CREATE TABLE REPAYLOAN(
ID NUMBER PRIMARY KEY,
CARD_ID NUMBER,
TIME DATE,
MONEY NUMBER
);
CREATE TABLE MESSAGE(
ID NUMBER PRIMARY KEY,
USERNUM VARCHAR2(50),
TYPE VARCHAR2(25),
STATUS NUMBER,
CONTENT VARCHAR2(255),
TIME DATE
);
CREATE TABLE SUBSCRIBE(
ID NUMBER PRIMARY KEY,
USERNUM VARCHAR2(50),
SERVICE VARCHAR2(50)
);
触发器
-- 1.SIGNON
create sequence signon_id_seq; --创建序列
create or replace trigger signon_id
before insert on SIGNON --before:执行DML等操作之前触发
for each row --行级触发器
begin
select signon_id_seq.nextval into :new.id from dual;
end;
/
-- 2.USERINFO
create sequence userinfo_id_seq; --创建序列
create or replace trigger userinfo_id
before insert on USERINFO --before:执行DML等操作之前触发
for each row --行级触发器
begin
select userinfo_id_seq.nextval into :new.id from dual;
end;
/
-- 3.CARD
create sequence card_id_seq; --创建序列
create or replace trigger card_id
before insert on CARD --before:执行DML等操作之前触发
for each row --行级触发器
begin
select card_id_seq.nextval into :new.id from dual;
end;
/
-- 4.DEPOSIT
create sequence deposit_id_seq; --创建序列
create or replace trigger deposit_id
before insert on DEPOSIT --before:执行DML等操作之前触发
for each row --行级触发器
begin
select deposit_id_seq.nextval into :new.id from dual;
end;
/
-- 5.WITHDRAW
create sequence withdraw_id_seq; --创建序列
create or replace trigger withdraw_id
before insert on WITHDRAW --before:执行DML等操作之前触发
for each row --行级触发器
begin
select withdraw_id_seq.nextval into :new.id from dual;
end;
/
-- 6.LOAN
create sequence loan_id_seq; --创建序列
create or replace trigger loan_id
before insert on LOAN --before:执行DML等操作之前触发
for each row --行级触发器
begin
select loan_id_seq.nextval into :new.id from dual;
end;
/
-- 7.REPAYLOAN
create sequence repayloan_id_seq; --创建序列
create or replace trigger repayloan_id
before insert on REPAYLOAN --before:执行DML等操作之前触发
for each row --行级触发器
begin
select repayloan_id_seq.nextval into :new.id from dual;
end;
/
-- 8.MESSAGE
create sequence message_id_seq; --创建序列
create or replace trigger message_id
before insert on MESSAGE --before:执行DML等操作之前触发
for each row --行级触发器
begin
select message_id_seq.nextval into :new.id from dual;
end;
/
-- 9.SUBSCRIBE
create sequence subscribe_id_seq; --创建序列
create or replace trigger subscribe_id
before insert on SUBSCRIBE --before:执行DML等操作之前触发
for each row --行级触发器
begin
select subscribe_id_seq.nextval into :new.id from dual;
end;
存储过程
-- 1.更新用户信息
CREATE OR REPLACE PROCEDURE updata_userinfo(
first_name IN VARCHAR2,
last_name IN VARCHAR2,
inputPhone IN VARCHAR2,
inputEmail IN VARCHAR2,
inputPosition IN VARCHAR2,
inputCity IN VARCHAR2,
inputAddress IN VARCHAR2,
inputDescription IN VARCHAR2,
inputUserNum IN VARCHAR2
) AS
BEGIN
UPDATE USERINFO
SET FIRSTNAME = first_name,
LASTNAME = last_name,
PHONE = inputPhone,
EMAIL = inputEmail,
POSITION = inputPosition,
CITY = inputCity,
ADDRESS = inputAddress,
DESCRIPTION = inputDescription
WHERE USERNUM = inputUserNum;
END;
/
-- 2.存款 存储过程
CREATE OR REPLACE PROCEDURE deposit_money(
cardId IN NUMBER,
time IN DATE,
money IN NUMBER
) AS
BEGIN
-- 记录存款过程
INSERT INTO DEPOSIT (CARD_ID, TIME, MONEY)
VALUES (cardId, time, money);
-- 更新卡余额
UPDATE CARD SET BALANCE = BALANCE + money
WHERE ID = cardId;
END;
-- 3.取款 存储过程
CREATE OR REPLACE PROCEDURE withdraw_money(
cardId IN NUMBER,
time IN DATE,
money IN NUMBER
) AS
BEGIN
-- 更新卡余额
UPDATE CARD SET BALANCE = BALANCE - money
WHERE ID = cardId;
-- 记录存款过程
INSERT INTO WITHDRAW (CARD_ID, TIME, MONEY)
VALUES (cardId, time, money);
END;
-- 4.贷款 存储过程
CREATE OR REPLACE PROCEDURE deal_loan(
cardId IN NUMBER,
time IN DATE,
money IN NUMBER
) AS
BEGIN
-- 更新卡余额
UPDATE CARD SET BALANCE = BALANCE - money
WHERE ID = cardId;
-- 记录贷款过程
INSERT INTO LOAN (CARD_ID, TIME, MONEY)
VALUES (cardId, time, money);
END;
-- 5.还款 存储过程
CREATE OR REPLACE PROCEDURE repay_loan(
cardId IN NUMBER,
time IN DATE,
money IN NUMBER
) AS
BEGIN
-- 更新卡余额
UPDATE CARD SET BALANCE = BALANCE + money
WHERE ID = cardId;
-- 记录还款过程
INSERT INTO REPAYLOAN (CARD_ID, TIME, MONEY)
VALUES (cardId, time, money);
END;
-- 6.添加消息 存储过程
CREATE OR REPLACE PROCEDURE add_message(
userNum_ IN VARCHAR2(50),
type_ IN VARCHAR2(25),
status_ IN NUMBER,
content_ IN VARCHAR2(255),
time_ IN DATE
) AS
BEGIN
-- 增加消息记录
INSERT INTO MESSAGE (USERNUM, TYPES, STATUS, CONTENT, TIME)
VALUES (userNum_, type_, status_, content_, time_);
END;
项目对应的数据库文件和源码都在下面链接中可以看到,其中 触发器和存储过程 的 sql 语句需要单独运行。
Github下载:simpleBankManageSystem
CSDN下载:JavaEE + Oracle 开发的简易版银行管理系统