一、课程设计实验目的

课程设计围绕课程的整体教学目标进行,具有一定的综合性和应用性,只靠个别单元的知识一般不能实现课程设计的目标,需要对课程知识进行综合运用。要完成好课程设计,就要对课程知识进行系统学习、复习、总结、应用,达到在实践中学习知识、掌握知识、应用知识和培养能力的目的。
①通过课程设计,进一步熟悉掌握Oracle数据库的基本知识点。
②通过课程设计,达到系统理解、综合运用课程知识的学习目标。
③通过课程设计,学会应用Java语言程序解诀实际问题的方法。
④通过课程设计,掌握程序的局部测试、调试方法,建立程序系统调试、测试的基本概念和思想,学会较大程序的系统测试、调试方法。
通过使用java编程语言连接Oracle数据库实现小型程序项目,巩固对java语言理论知识–面向对象、swing、和Oracle数据库知识的理解,提升代码编写、bug调试能力。

二、课程设计任务及要求

1.设计任务
(1)每种图书有书号、书名、出版社、作者、借阅状态。
(2)借书记录有学生的学号、书号、登记时期等。
2.设计要求
(1)实现新进图书的数据录入和下架图书的数据删除。
(2)实现借阅图书证信息的录入和删除。
(3)能够记录学生的个人资料和所借图书的书名、书号、借书时间等。
(4)能够进行借书还书处理。
(5)能够进行用户管理

三、数据库设计

1.需求分析
需求分析的目标是了解用户对开发的数据库应用系统的确切要求。需求分析是设计数据的起点,需求分析的结果是否正确地反映了用户的实际要求,将直接影响到后面各个阶段的设计,并影响到设计结果是否合理和使用。在构造系统时,首先从需求出发构造数据库表,然后再由数据库表结合需求划分系统功能模块。这样,就把一个大的系统分解成了几个小系统。
这里把系统的层次划分为了四个部分:图书维护,人员信息管理,图书借阅管理,信息查询。能够实现以下功能:
①进行新书入库、现有图书信息修改以及删除;
②能够实现对读者管理;
③能够进行借阅归还图书功能;
④能够进行借阅信息的查询功能;

2.概念结构设计
概念设计阶段主要是将需求分析阶段得到的用户需求抽象为信息结构(概念模型)的过程,它是整个数据库设计的关键。这里一共建立了三个表users,borrows,books

(1)实体及属性图如下:

(2)E-R图:

3.逻辑结构设计
逻辑结构设计将概念模型转换成特定DBMS所支持的数据模型的过程,由初始关系模式设计到关系模式规范化再到模式评价
(1)将E-R图转换为关系模型
(2)模型优化
(3)完成数据库模式定义描述,包括各模式的逻辑结构定义、关系的完整性和安全性等内

E-R图向关系模型转换要解决的问题是如何将实体型和实体间的联系转换为关系模式,如何确定这些关系模式的属性和码。
关系模型的逻辑结构是一组关系模式的集合。E-R图则是由实体型、实体的属性和实体型之间的联系3个要素组成的。所以将E-R图转换为关系模型实际上就是要将实体型、实体的属性和实体型之间的联系转换为关系模式,这种转换一般遵循如下原则:
一个实体型转换为一个关系模式。实体的属性就是关系的属性,实体的码就是关系的码。
对于实体间的联系则有以下不同的情况:
(1)一个m: n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,各实体的码组成关系的码或关系码的一部分。
(2)一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。
(3)一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
(4)3个或3个以上实体间的一个多元联系可以转换为一个关系模式。与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而实体的码组成关系码或关系码得一部分。
(5)具有相同码的关系模式可合并。
由于管理员与图书之间的联系是1:n(一对多),可以将其之间的联系与n端实体图书合并,而读者与图书之间的借阅和归还联系方式则是n:m(多对多),这样要把它们之间的联系转化为独立的关系模式,读者与管理员之间的罚款联系是 m:n(多对多),将其联系也转化成独立的关系模式,具体的基本E-R图向关系模型的转化如下:

Users(USER_ID,USER_NAME,USER_PASS,USER_DEPART,USER_CLASS)
Books(BOOK_ID,BOOK_NAME,BOOK_PUBLISHER,BOOK_CLASSIFY,BOOK_STATUS)
Borrows(BORROW_ID,USER_ID,BOOK_ID,BORROW_DATE,RETURN_DATE)

4.物理结构设计
物理结构设计
为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。

(1)表结构:
Users
列名 数据类型 允许为空 是否主键 备注
USER_ID VARCHAR2(10BYTE) No Yes 用户ID
USER_NAME VARCHAR2(20BYTE) No No 用户姓名
USER_PASS VARCHAR2(16BYTE) No No 用户密码
USER_DEPART VARCHAR2(50BYTE) Yes No 用户部门
USER_CLASS VARCHAR2(50BYTE) Yes No 用户班级

Books
列名 数据类型 允许为空 是否主键 备注
BOOK_ID NUMBER(10,0) No Yes 图书编号
BOOK_NAME VARCHAR2(50BYTE) No No 图书名
BOOK_PUBLISHER VARCHAR2(50BYTE) Yes No 出版社
BOOK_CLASSIFY VARCHAR2(20BYTE) Yes No 图书种类
BOOK_STATUS NUMBER(1,0) No No 图书状态,1为在架可借,0为已借出

Borrows
列名 数据类型 允许为空 是否主键 备注
BORROW_ID NUMBER(10,0) No Yes 借阅记录编号
USER_ID VARCHAR2(10BYTE) No No 外键
BOOK_ID NUMBER(10,0) No No 外键
BORROW_DATE CHAR(50 BYTE) Yes No 借书日期
RETURN_DATE CHAR(50 BYTE) Yes No 还书日期

(2)Oracle建表脚本
Users:
CREATE TABLE users
(
USER_ID NUMBER(10,0) NOT NULL PRIMARY KEY,
USER_NAME VARCHAR2(20) NOT NULL,
USER_PASSVARCHAR2(16) NOT NULL,
USER_DEPARTVARCHAR2(50) NULL,
USER_CLASS VARCHAR2(50) NULL
);

Books:
CREATE TABLE books
(
BOOK_ID NUMBER(10,0) NOT NULL PRIMARY KEY,
BOOK_NAME VARCHAR2(50) NOT NULL,
BOOK_PUBLISHER VARCHAR2(50) NULL,
BOOK_CLASSIFY VARCHAR2(20) NULL,
BOOK_STATUS NUMBER(1,0) NOT NULL
);

Borrows:
CREATE TABLE borrows
(
BORROW_ID NUMBER(10,0) NOT NULL PRIMARY KEY,
USER_ID VARCHAR2(50) NOT NULL references users(USER_ID) ,
BOOK_ID VARCHAR2(50) NOT NULL references users(BOOK_ID),
BORROW_DATE VARCHAR2(20) NULL,
RETURN_DATE VARCHAR2(20) NULL
);

(3)创建索引及触发器
–建立索引 从1开始每次加一最大值9999999999
CREATE SEQUENCE seqBorrowId
increment by 1
START WITH 1
maxvalue 9999999999
nocycle
nocache
order;

–建立触发器 用作向borrows表插入纪录时,自动添加主键BORROW_ID
CREATE OR REPLACE TRIGGER triggerBorrowId
BEFORE
INSERT ON borrows FOR EACH ROW
WHEN(new.borrow_id IS NULL)
BEGIN
SELECT seqBorrowId.NEXTVAL INTO:NEW.borrow_id FROM DUAL;
END;

四、程序设计

1.需求分析
(1)功能分析
在这里插入图片描述

(a)超级管理员用户:需要能够添加普通用户,能够对图书进行管理,能够查询用户借书记录;
(b)普通用户:需要能够搜索图书并执行借还书操作。

4-1 功能结构图

(2)非功能性分析

(a)源代码运行,版面清晰,语言流畅易懂,各模块的分析详细准确,具有极强的可移植性;
(b)代码规范,含丰富注释,具有易懂性。
(c)管理系统版面简洁,可操作性强,拥有丰富的界面交互功能,能够极大的方便用户与管理员完成图书管理的相关操作;
(d)除上述优点外,代码具有健壮性和可维护性

2.系统设计
(1)登录界面:操作者输入对应的登录账户和密码,进入对应的操作界面。
(2)管理员界面:
提供查询图书功能,在操作成功后显示查询页面;提供添加图书功能,在添加图书界面填写相关图书信息,添加成功则弹出提示“添加成功”,反之弹出提示“添加失败”;
提供删除图书功能,在删除图书界面填写相关图书信息,添加成功则弹出提示“删除成功”,反之弹出提示“删除失败”;
提供添加用户功能,在添加用户界面填写用户相关信息,添加成功则弹出提示“添加成功”,反之弹出提示“添加失败”;
提供借阅查询功能,在新页面展示所有借阅记录,可根据条件进行相应的查询。
(3)普通用户界面:主页面展示用户个人信息;
点击“我要借书”进入借阅面板,可根据条件查询所需图书,单击图书后点击“借书”,若借书成功则弹出提示“借书成功”,反之弹出“借书失败”;
点击“我要还书”进入归还面板,单击图书后点击“还书”,若还书成功则弹出提示“还书成功”,反之弹出“还书失败”。
(4)退出系统:点击主界面右上角的叉号即可退出管理系统。
在这里插入图片描述

3.系统实现
(1)登录验证
输入对应的账户密码后从数据库后台查询相应的用户信息,验证是否匹配,若不匹配则提示“用户名或密码错误”。图4-3为登录界面,图4-4为验证流程图。

4-3 登录界面
4-4验证流程图
在这里插入图片描述
在这里插入图片描述

(2)管理员界面
登录管理员界面,可执行图书和用户相关操作。

在这里插入图片描述

(2.1)搜索
在这里插入图片描述
在这里插入图片描述

(2.2)借阅记录
在这里插入图片描述

(2.3)新增图书

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2.4)删除图书

鼠标选中,点击删除即可
在这里插入图片描述

(2.5)添加用户
在这里插入图片描述

(3)普通用户界面
在这里插入图片描述

(3.1)借书

在这里插入图片描述
在这里插入图片描述

(3.2)还书
在这里插入图片描述
在这里插入图片描述

五、软件使用说明

该实验数据从Excel表格中导入

1、登录页面,查询数据库验证用户,错误会有提示“用户名或密码错误”

2、内置admin为超级用户,账号123密码为admin
① 登录后第一个页面是展示所有书籍情况的
② 选择搜索方式可以进行搜索
③ 可以新增图书,新增完成后需要刷新,点击一下搜索即可
④ 可以点击指定行删除图书,自动刷新
⑤ 点击借书记录可以查看所有用户的借书记录
⑥ 可以根据条件搜索相应的记录,全部是模糊查询的,按日期搜索请注意下面提示的格式

3、普通用户,在admin内添加
这里有个内置的张三普通用户,账号12345密码12345
① 登录后展示个人信息,可以选择借书或还书
② 点击借书,搜索,选择对应行,点击借书完成操作
③ 点击还书,选择要还的书,点击归还

六、课程设计总结

总结问题:
这次课程设计完成了图书管理系统,其中遇到了许多问题都想尽办法解决了,如下:

1.Oracle中 char类型与vachar2类型的区别,CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。 所以这对判断用户名是否存在会出现一直不匹配导致登录时一直找不到用户,在调试多次之后发现这个问题,最终将用户名使用vachar2类型,便解决这个小bug

2.在借书操作中,要实现自动添加borrow_id主键,所以要在Oracle中创建索引及触发器

–建立索引 从1开始每次加一最大值9999999999
CREATE SEQUENCE seqBorrowId
increment by 1
START WITH 1
maxvalue 9999999999
nocycle
nocache
order;

–建立触发器 用作向borrows表插入纪录时,自动添加主键BORROW_ID
CREATE OR REPLACE TRIGGER triggerBorrowId
BEFORE
INSERT ON borrows FOR EACH ROW
WHEN(new.borrow_id IS NULL)
BEGIN
SELECT seqBorrowId.NEXTVAL INTO:NEW.borrow_id FROM DUAL;
END;
3.在实现还书操作时,涉及到判断当前书籍归还日期是否为空这一逻辑,但是在Oracle 语法中空值不等于空值,意思是 oracle中把有null值的字段当做where查询条件时,有null的数据会返回false,所以当执行还书操作后 更新书籍状态时"update borrows set return_date=? where book_id=? and user_id=? and NVL(return_date,0)=?“而不能"update borrows set return_date=? where book_id=? and user_id=? and return_date=NULL”
NVL(return_date,0)函数是将值为空的字段置为0,这样就解决了这个问题!

等等除了以上令我印象深刻的问题之外,还有一些小的问题,都在查阅资料后一一解决。

优势:我认为一些好的地方在于界面设计的比较接地气,使用流畅,操作方便,还有把连接数据库部分的代码写在 db.properties 配置文件中,这使得即便想更换数据库也不用打开源程序进行操作,只需要把修改改文件即可,这极大地实现了面向对象编程的思想,实现了封装性!
劣势:当然这个小程序还存在着一些优化的空间,界面可以设置的再优美点,功能可以再丰富一些比如增加还书期限,逾期要罚款功能,由于时间精力有限,暂且没有加入该功能!
心得体会:
通过选择图书管理系统这个题目,让我掌握Java语言的用处并进一步理解了Oracle数据库的特点及语法规则,并且可以灵活的使用Eclipse软件。同时更加深入的了解图形化界面的编程过程,使我们更加熟练的掌握Java语言,代码的规范性和完整性有了很大提高,同时对相应代码的模块化也有了相当的认识。
在分析阶段,要进行面向对象的需求分析、系统设计,列出相应的需求文档、绘制系统设计模型图,这些工作很好的锻炼了我的逻辑思维能力,同时,我也学到了很多有关于软件管理方面的知识。总体来说这次课程设计收获还是很大的,达到了自己的预期效果,并且为我未来更好的学习打下了牢固的基础,比较满意!

七、附录

1.参考文献:
[1]赵明渊. Oracle数据库教程(第二版). 北京:清华大学出版社,2020
[2]Java2实验教程(第五版),北京:清华大学出版社,2017
[3]宋杰等.Oracle数据库项目教程(第一版).北京:清华大学出版社,2015
[4]唐友等.Oracle数据库实用教程(第一版).北京:清华大学出版社,2013
[5]赵宇兰.Oracle数据库应用技术(第一版).合肥:合肥工业大学出版社2014
[6]网络数据库及应用课程设计指导书

2.程序清单

见文件《Oracle课程设计—图书管理系统源码》

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐