《数据库系统综合实验》设计报告
分工我负责了图书管理系统中整个数据库的设计与实现,编写与整理了数据库相关方面的文档。梳理了概念设计,对于实体,实体对应的属性,各实体间的关联,E-R(实体联系)模型、CDM(概念数据模型)、PDM(物理数据模型)等有了更好的认识;此外进行了数据库各种基础编程操作,如索引、触发器、完整性说明、存储管理等,以实现图书管理。

图书管理系统

  • 1 需求分析
    • 1.1问题提出
    • 1.2 系统分析
    • 1.3 功能需求
    • 1.4 非功能性需求
    • 1.5 开发与运行环境
  • 2 数据库设计与实现(负责模块)
    • 2.1 概念设计
    • 2.2 逻辑设计与物理设计
      • 2.2.1 PDM(物理数据模型)图
      • 2.2.2 关系数据库模式——表
      • 2.2.3 关系数据库模式——视图
      • 2.2.4 关系数据库模式——索引
      • 2.2.5 完整性说明
      • 2.2.6 存储过程设计
      • 2.2.7 触发器
      • 2.2.8 数据库备份
    • 2.3 数据库实现
      • 2.3.1 数据库的建立
      • 2.3.2 测试数据
      • 2.3.3 数据的载入
  • 3 应用程序设计
    • 3.1软件结构设计
    • 3.2界面设计
    • 3.3 数据库存取技术
      • 3.3.1 JDBC技术
    • 3.4 程序详细设计与实现
      • 3.4.1相关业务流程算法框图
      • 3.4.2数据库连接工具类相关代码:
    • 3.5 测试及结果
  • 4 工作总结
    • 4.1小组成员及分工
    • 4.2自己的工作及贡献
    • 4.3体会,经验和教训
  • 5 参考文献

1 需求分析

1.1问题提出

随着信息技术的广泛应用,数字化管理的优势日趋明显。将数字化管理与图书馆相结合,不仅能够大大提高图书馆图书管理的效率,同时也能够有效缓解图书管理员人员不足的情况,在一定程度上为借阅者借阅归还书籍提供便利,减少时间上的浪费。
受学校现有的图书馆中的图书管理系统的启发,我们设计了此系统。此系统主要针对图书管理员的相关职责进行了功能的设计,除了最基本的借书、还书操作外,还包括了图书信息管理、用户信息管理等等,旨在为其提供操作简单、内容详尽的多功能一体化的图书管理服务。

1.2 系统分析

以下是图书管理系统设计的基本用例图展示:

1.3 功能需求

根据图书管理系统系统的用户需求,将本系统分成以下若干个功能模块。功能结构图如下:

设计阶段,对于部分用户需求用例进行如下描述:
用例UC-1 借阅图书
范围: 图书管理系统
级别: 用户目标
主要参与者: 图书管理员
前置条件: 借阅者找到要借阅的书籍,到借书处将图书交给图书管理员办理借阅手续,图书管理员已登录管理界面
后置条件: 记录借阅信息。更新学生账户信息和书籍借阅信息
主成功场景: 1.图书管理员请求系统处理借书业务。
2.系统显示借书处理界面
3.图书管理员输入学生的账户信息。
4.系统验证账户是否有效。
5.系统显示借阅者的借阅信息。
6.图书管理员输入要借阅的图书信息。
7.系统记录此次借阅信息,并更新该学生账户。
8.系统显示更新后的借阅信息,图书管理员重复6-8步,直至结束
扩展事件流: 3a. 账号无效
3a.1 系统提示账号无效,系统中不存在该账号对应的账户信息
3a.2 图书管理员进行确认
4a. 借书者借阅的图书超过了规定的数量
4a.1 系统提示借阅读书超出规定数量,并显示详细借阅信息
4a.2图书管理员结束此次借阅
4b. 借阅者有超过规定借阅期限而未归还的图书
4b.1系统提示有书未按时归还,显示未还书籍的信息
4b.2图书管理员结束此次借阅
7a. 书籍库存为0
7a.1 系统提示欲借阅书籍库存为0
7a.2 图书管理员结束此次借阅

用例UC-2 归还图书
范围: 图书管理系统
级别: 用户目标
主要参与者: 图书管理员
前置条件: 借阅者携带图书前往图书馆,图书管理员已登陆管理界面
后置条件: 记录借阅信息,更新学生账户信息和书籍借阅信息
主成功场景: 1.图书管理员请求系统处理借书业务
2.系统显示还书处理界面
3.图书管理员输入将要归还的图书的ID
4.系统验证该图书是否为本馆藏书
5.系统删除相应的借阅信息并且更新相应的借阅者账户
6.系统检验借阅者是否仍有超期未归还的图书
7.归还图书完成,用例结束
拓展事件流: 4a. 待归还的图书不是本馆藏书
4a.1 系统提示图书不是本馆的藏书
4a.2 图书管理员结束本次归还图书操作
6a. 借阅者有超期未归还的图书
6a.1 系统显示借阅者超期未归还的图书清单以及违规罚金

用例UC-3 查阅借阅信息
范围: 图书管理系统
级别: 用户目标
主要参与者: 图书管理员
前置条件: 借阅者前往图书馆,图书管理员已登录管理界面
后置条件: 系统显示借阅信息
主成功场景: 1. 图书管理员请求系统处理查询业务
2. 系统显示查询借阅信息界面
3. 图书管理员输入学生的账号信息
4. 系统验证输入的账号是否有效
5. 系统显示相应的借阅信息,包括借阅书籍、借阅日期、超期未归还的书籍、历史借阅记录等
6. 查询借阅信息完成,用例结束
拓展事件流: 4a. 账号无效
4a.1 系统提示账号无效,系统中不存在该账号对应的账户信息
4a.2 图书管理员进行确认

用例UC-4 处理违规赔偿问题
范围: 图书管理系统
级别: 用户目标
主要参与者: 图书管理员
前置条件: 借阅者前往图书馆,图书管理员已登录管理界面
后置条件: 系统更新借书者账户信息和借阅信息
主成功场景: 1.图书管理员请求系统处理违规赔偿业务
2.系统显示违规问题处理界面
3.图书管理员输入借书者的账号信息
4.系统验证输入的账号是否有效
5.系统显示借阅者的借阅信息,包括超期未归还的书籍
6.图书管理员根据系统显示的违规信息对借书者收取赔偿金额
7.图书管理员确认处理完毕
8.系统更新借阅信息以及借阅者账户信息,用例结束
拓展事件流: 3a. 账号无效
3a.1 系统提示账号无效,系统中不存在该账号对应的账户信息
3a.2 图书管理员进行确认
4a. 系统显示无违规信息
4a.1 结束用例

用例UC-5 添加图书
范围: 图书管理系统
级别: 用户目标
主要参与者: 图书管理员
前置条件: 图书管理员已登陆管理界面
后置条件: 更新图书管理系统中的图书信息
主成功场景: 1.图书管理员进入图书管理界面
2.图书管理员选择添加图书操作
3.图书管理员录入图书的信息
4.系统提示添加成功并更新系统中的图书信息
5.用例结束
拓展事件流: 4a. 录入信息失败
4a.1 系统提示录入失败,并显示原因(如录入信息不合规范等)
4a.2 图书管理员结束此次添加

用例UC-6 删除图书
范围: 图书管理系统
级别: 用户目标
主要参与者: 图书管理员
前置条件: 图书管理员已登陆管理界面
后置条件: 更新图书管理系统中的图书信息
主成功场景: 1. 图书管理员进入图书管理界面
2. 图书管理员选择删除图书操作
3. 图书管理员输入要删除的图书的信息
4. 系统提示删除成功并更新系统中的图书信息
5. 用例结束

拓展事件流: 3a. 图书不存在
4a.1 系统提示图书不存在
4a.2 图书管理员结束此次删除操作

用例UC-7 修改图书信息
范围: 图书管理系统
级别: 用户目标
主要参与者: 图书管理员
前置条件: 图书管理员已登陆管理界面
后置条件: 更新图书管理系统中的图书信息
主成功场景: 1. 图书管理员进入图书管理界面
2. 图书管理员选择修改图书信息操作
3. 图书管理员输入要修改信息的图书的信息
4. 系统显示该图书已有信息
4. 图书管理员修改相关信息
5. 系统提示修改成功并更新系统中的图书信息
6. 用例结束

拓展事件流: 3a. 图书不存在
3a.1 系统提示该图书不存在
3a.2 图书管理员结束此次修改操作

1.4 非功能性需求

1、性能/容量
能允许若干用户同时使用,并且系统处理业务时间有最迟时间设定
2、可靠性
除电源、硬件、操作系统、服务器系统外程序不允许异常退出或崩溃
3、安全性
用户信息保密,操作权限明确
4、可扩展性
可在当前需求基础上进行功能上的扩展
5、易用性
系统适用于不同水平的用户,包括专业人士和非专业人士,操作简单、业务流程清晰
6、正确性
业务错误不允许出现

1.5 开发与运行环境

IDE: Intellij IDEA
所用设计模式: MVC
语言: Java
数据库: MySQL
Web服务器: Tomcat
Action: Servlet
View: Jsp
版本控制:Git
CSS框架:BootStrap
JavaScript框架:jQuery

2 数据库设计与实现(负责模块)

2.1 概念设计

根据系统功能需求分析,数据库涉及的实体如下:
(1)图书信息-book
对应属性有:书本ID,书本名称,书本作者,出版社,书本价格,书本类目,在存数量,书本描述,图书位置

(2)借阅信息-iolog
对应属性有:书本ID,读者用户名,服务,借阅时间,借阅期限,是否归还

(3)读者信息-reader
对应属性有:读者用户名,读者密码,读者姓名,读者性别,读者状态(1.正常 -1.黑名单),读者邮箱,读者电话,读者年级,读者班级

(4)图书临时借阅记录-tempadd
对应属性有:书本ID,书本名称,书本作者,出版社,书本价格,书本类目,在存数量,书本描述,图书位置

注:在借阅书籍过程中,图书管理员每一次输入一本书籍的借阅信息,就会形成一个tempadd临时的借阅记录,在最后管理员点击确定才会将tempadd加入到最终的借阅信息中。

(5)用户信息-user
对应属性有:用户名,用户密码,用户真实姓名,用户性别,用户部门,用户电话

对各实体间的关联具体说明:
用户(user)即管理者能进行增添借阅图书信息,会生成一个临时借阅记录(tempadd),每次的增添借阅图书操作只能由一个用户完成,且一个用户能进行多个增添借阅图书操作,因而user与tempadd之间是一对多的联系;
用户(user)即管理者能进行编辑图书信息(book)操作,每个图书信息编辑操作只能由一个用户完成,且一个用户能进行多个编辑图书信息操作,因而user与book之间是一对多的联系;
每次增添借阅图书信息操作,生成一个临时的借阅记录(tempadd),并且会和所借图书(book)中相对应,更新相对应的信息,因而tempadd与book之间是一对一的关系;
每本图书(book)会在不同时间被多个读者(reader)借阅进而产生多个不同的借阅信息(iolog),且每个借阅信息(iolog)对应一本图书(book),因而book与iolog之间是一对多的联系;
每个读者(reader)会在不同时间多次借阅图书(book)进而产生多个不同的借阅信息(iolog),且每个借阅信息(iolog)对应一个读者(reader),因而reader与iolog之间是一对多的联系;

由以上分析得CDM(概念数据模型)图:

图2.1数据库设计CDM图

2.2 逻辑设计与物理设计

2.2.1 PDM(物理数据模型)图

通过Power Designer,对sql文件逆向工程创建PDM:

图2.2 数据库设计PDM图

2.2.2 关系数据库模式——表

从上述物理模型可以看出,library数据库将分成五个关系模式,即五张表:图书信息表-book,借阅信息表-iolog,读者信息表-reader,增添图书信息表-tempadd,用户信息表-user,设计如下:

图书信息表-book
Field Type Null Key Default Extra
id varchar(10) NO PRI NULL
bookname varchar(30) YES NULL
author varchar(20) YES NULL
publisher varchar(30) YES NULL
price int(11) YES NULL
category varchar(10) YES NULL
store int(11) YES NULL
bookdesc varchar(1000) YES NULL
location varchar(45) YES NULL

借阅信息表-iolog
Field Type Null Key Default Extra
id varchar(10) YES NULL
readerid varchar(45) YES NULL
service int(11) YES NULL
borrowtime varchar(45) NO PRI NULL
borrowday int(11) YES NULL
complete int(11) YES NULL

读者信息表-reader
Field Type Null Key Default Extra
readerid varchar(50) NO PRI NULL
password varchar(45) YES NULL
name varchar(45) YES NULL
sex varchar(45) YES NULL
status int(11) YES NULL
mail varchar(45) YES NULL
tel varchar(45) YES NULL
grade int(11) YES -1
classnum int(11) YES -1

增添图书信息表-tempadd
Field Type Null Key Default Extra
id varchar(10) NO PRI NULL
bookname varchar(30) YES NULL
author varchar(20) YES NULL
publisher varchar(30) YES NULL
price int(11) YES NULL
category varchar(10) YES NULL
store int(11) YES NULL
bookdesc varchar(100) YES NULL
location varchar(45) YES NULL

用户信息表-user
Field Type Null Key Default Extra
user varchar(15) NO PRI NULL
password varchar(25) YES NULL
name varchar(20) YES NULL
sex varchar(5) YES NULL
department varchar(45) YES NULL
tel varchar(20) YES NULL

2.2.3 关系数据库模式——视图

(1)CREATE VIEW v_book AS SELECT * FROM book;

(2)CREATE VIEW v_iolog AS SELECT * FROM iolog;

(3)CREATE VIEW v_reader AS SELECT * FROM reader;

(4)CREATE VIEW v_tempadd AS SELECT * FROM tempadd;

(5)CREATE VIEW v_user AS SELECT * FROM user;

2.2.4 关系数据库模式——索引

(1)在图书信息表-book的bookname和author两个字段上创建了一个复合索引
CREATE INDEX in_book ON book(bookname,author);
SHOW INDEX FROM book;

(2)在读者信息表-reader的name字段上创建唯一性索引
CREATE UNIQUE INDEX in_reader ON reader(name);
SHOW INDEX FROM reader;

2.2.5 完整性说明

(1)实体完整性
创建表时定义实体完整性
CREATE TABLE book (

PRIMARY KEY (id)

)

CREATE TABLE iolog (

PRIMARY KEY (borrowtime)
)

CREATE TABLE reader (

PRIMARY KEY (username)
)

CREATE TABLE tempadd (

PRIMARY KEY (id)
)

CREATE TABLE user (

PRIMARY KEY (user)
)

(2)参照完整性
利用完整性约束实现,当删除或修改增添图书信息表-tempadd上的id列时,图书信息表-book中的值也随之变化
CREATE TABLE book (

FOREIGN KEY (id) REFERENCES tempadd(id)
ON DELETE CASCADE
ON UPDATE CASCADE
)

2.2.6 存储过程设计

以其中一个功能为例,创建一个存储过程,统计图书信息表-book中的图书数目,并存储到一个局部变量中,并输出该变量结果,调用存储过程。
DROP PROCEDURE IF EXISTS cout_book;
DELIMITER $$

CREATE PROCEDURE cout_book (OUT b_num1 INT)
BEGIN
DECLARE b_num2 INT;
SELECT bookname,COUNT(bookname)
FROM book
GROUP BY bookname;
SELECT COUNT(bookname) INTO b_num1 FROM book ;
SET b_num2 = (SELECT COUNT(*) FROM book);
SET b_num1 = b_num2;
END $$
DELIMITER ;
CALL cout_book(@b_num1);

2.2.7 触发器

创建触发器,在读者信息表-reader中删除读者信息的同时将借阅信息表-iolog中该读者的信息删除,以确保数据完整性。
DELIMITER $$

CREATE TRIGGER t_reader_delete AFTER DELETE
ON reader FOR EACH ROW
BEGIN
DELETE FROM iolog WHERE readerid = OLD.readerid;
END $$
DELIMITER ;

2.2.8 数据库备份

C:\WINDOWS\system32>cd C:\Program Files\MySQL\MySQL Server 8.0\bin

C:\Program Files\MySQL\MySQL Server 8.0\bin>mysqldump -h localhost -u root -p library>“C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\library数据库备份\library.sql”
Enter password: ********

2.2.9 范式分析
根据数据库的范式理论,在上述五个关系模式,即图书信息关系模式,借阅信息关系模式,读者信息关系模式,增添图书信息关系模式,用户信息关系模式中:
(1)每个非主属性均完全函数依赖于任何一个候选码;
(2)所有主属性和对每一个不包含他的码也是完全函数依赖;
(3)没有任何一组属性完全函数依赖于非码的任何一组属性。
即,上述五个关系模式均属于BCNF。

2.3 数据库实现

2.3.1 数据库的建立

创建数据库
CREATE DATABASE IF NOT EXISTS library;
USE library;

创建表
(1)book表
CREATE TABLE book (
id varchar(10) NOT NULL COMMENT ‘书本ID’,
bookname varchar(30) DEFAULT NULL COMMENT ‘书本名称’,
author varchar(20) DEFAULT NULL COMMENT ‘书本作者’,
publisher varchar(30) DEFAULT NULL COMMENT ‘出版社’,
price int(11) DEFAULT NULL COMMENT ‘书本价格’,
category varchar(10) DEFAULT NULL COMMENT ‘书本类目’,
store int(11) DEFAULT NULL,
bookdesc varchar(1000) DEFAULT NULL,
location varchar(45) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘书籍数据库’;

(2)iolog表
CREATE TABLE iolog (
bookid varchar(10) DEFAULT NULL,
readerid varchar(45) DEFAULT NULL,
service int(11) DEFAULT NULL,
borrowtime varchar(45) NOT NULL,
borrowday int(11) DEFAULT NULL,
complete int(11) DEFAULT NULL,
PRIMARY KEY (borrowtime)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(3)reader表
CREATE TABLE reader (
username varchar(50) NOT NULL COMMENT ‘读者用户名’,
password varchar(45) DEFAULT NULL COMMENT ‘读者密码’,
name varchar(45) DEFAULT NULL COMMENT ‘读者姓名’,
sex varchar(45) DEFAULT NULL COMMENT ‘读者性别’,
status int(11) DEFAULT NULL COMMENT ‘读者状态(1.正常 -1.黑名单)’,
mail varchar(45) DEFAULT NULL COMMENT ‘读者邮箱’,
tel varchar(45) DEFAULT NULL COMMENT ‘读者电话’,
grade int(11) DEFAULT ‘-1’ COMMENT ‘读者年级’,
classnum int(11) DEFAULT ‘-1’ COMMENT ‘读者班级’,
PRIMARY KEY (username)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘读者表’;

(4)tempadd表
CREATE TABLE tempadd (
id varchar(10) NOT NULL,
bookname varchar(30) DEFAULT NULL COMMENT ‘书本名称’,
author varchar(20) DEFAULT NULL COMMENT ‘书本作者’,
publisher varchar(30) DEFAULT NULL COMMENT ‘出版社’,
price int(11) DEFAULT NULL COMMENT ‘书本价格’,
category varchar(10) DEFAULT NULL COMMENT ‘书本类目’,
store int(11) DEFAULT NULL,
bookdesc varchar(100) DEFAULT NULL,
location varchar(45) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(5)user表
CREATE TABLE user (
user varchar(15) NOT NULL COMMENT ‘用户名’,
password varchar(25) DEFAULT NULL COMMENT ‘用户密码’,
name varchar(20) DEFAULT NULL COMMENT ‘用户真实姓名’,
sex varchar(5) DEFAULT NULL COMMENT ‘用户性别’,
department varchar(45) DEFAULT NULL COMMENT ‘用户部门’,
tel varchar(20) DEFAULT NULL COMMENT ‘用户电话’,
PRIMARY KEY (user)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.3.2 测试数据

为检测系统功能的正确实现,设计如下测试数据:

(1)对图书馆中“图书信息更新”相关功能的测试数据
SELECT * FROM library.v_book;
id bookname author publisher price category store bookdesc location
1 java kbh 高等教育出版社 10 编程 20 java123456 3
2 高数 wzb 高等教育出版社 20 数学 15 高数123456 3
4 线代 zl 高等教育出版社 30 数学 15 线代123456 1
3 c语言 kbh1234 高等教育 90 1230 120 c语言 4
1123 123 123 1231 1231 1231 12313 1313123 1231123
123 123 123 123 31 31124 12412 12124 2141
1234 数据库 wjy 高等教育出版社 40 编程 20 。。。。。。。。。。 4

(2)对图书馆中“借阅信息更新”相关功能的测试数据
SELECT * FROM library.v_iolog;
bookid readerid service borrowtime borrowday complete
1234 121714130 -1 2019年12月24日 19时48分33秒 7 1
1234 121714130 1 2019年12月24日 19时48分45秒 NULL 1
1234 121714130 -1 2019年12月24日 19时50分52秒 14 0
3 121714130 -1 2019年12月24日 19时56分18秒 14 1
3 121714130 1 2019年12月24日 19时56分49秒 NULL 1
1234 121714130 -1 2019年12月24日 20时34分41秒 7 0
1234 121714130 -1 2019年12月24日 20时55分14秒 14 1
1234 121714130 -1 2019年12月24日 20时55分54秒 7 0
1234 121714130 1 2019年12月24日 20时56分19秒 NULL 1

(3)对图书馆中“借阅者借阅信息更新”相关功能的测试数据
SELECT * FROM library.v_reader;
username password name sex status mail tel grade classnum
121714130 123456 kbh123 male 1 123@qq.com 123456 9 2

(4)对图书馆中“借阅临时信息更新”相关功能的测试数据
SELECT * FROM library.v_tempadd;
id bookname author publisher price category store bookdesc location
654321 数据库 张三 清华 50 计算机 30 数据库0000001 1

(5)对图书馆中“用户信息更新”相关功能的测试数据
SELECT * FROM library.v_user;
user password name sex department tel
123456 123456 kbh 男 图书馆 123456789

2.3.3 数据的载入

针对以上所设计的测试数据,进行载入:
INSERT INTO book VALUES
(‘000001’,‘java’,‘kbh’,‘高等教育出版社’,10,‘编程’,20,‘java123456’,‘3’),
(‘000002’,‘高数’,‘wzb’,‘高等教育出版社’,20,‘数学’,15,‘高数123456’,‘3’),
(‘000004’,‘线代’,‘zl’,‘高等教育出版社’,30,‘数学’,15,‘线代123456’,‘1’),
(‘00003’,‘c语言’,‘kbh1234’,‘高等教育’,90,‘1230’,120,‘c语言’,‘4’),
(‘1123’,‘123’,‘123’,‘1231’,1231,‘1231’,12313,‘1313123’,‘1231123’),
(‘123’,‘123’,‘123’,‘123’,31,‘31124’,12412,‘12124’,‘2141’),
(‘1234’,‘数据库’,‘wjy’,‘高等教育出版社’,40,‘编程’,20,’。。。。。。。。。。’,‘4’);

INSERT INTO iolog VALUES
(‘1234’,‘0121714130’,-1,‘2019年12月24日 19时48分33秒’,7,1),
(‘1234’,‘0121714130’,1,‘2019年12月24日 19时48分45秒’,NULL,1),
(‘1234’,‘0121714130’,-1,‘2019年12月24日 19时50分52秒’,14,0),
(‘00003’,‘0121714130’,-1,‘2019年12月24日 19时56分18秒’,14,1),
(‘00003’,‘0121714130’,1,‘2019年12月24日 19时56分49秒’,NULL,1),
(‘1234’,‘0121714130’,-1,‘2019年12月24日 20时34分41秒’,7,0),
(‘1234’,‘0121714130’,-1,‘2019年12月24日 20时55分14秒’,14,1),
(‘1234’,‘0121714130’,-1,‘2019年12月24日 20时55分54秒’,7,0),
(‘1234’,‘0121714130’,1,‘2019年12月24日 20时56分19秒’,NULL,1);

INSERT INTO reader VALUES
(‘0121714130’,‘123456’,‘kbh123’,‘male’,1,‘123@qq.com’,‘123456’,9,2);

INSERT INTO tempadd VALUES
(‘654321’,‘数据库’,‘张三’,‘清华’,50,‘计算机’,30,‘数据库0000001’,‘1’);

INSERT INTO user VALUES
(‘123456’,‘123456’,‘kbh’,‘男’,‘图书馆’,‘123456789’);

3 应用程序设计

3.1软件结构设计

数据库存取技术使用java原生的JDBC
使用jdbc+servlet+jsp实现本图书馆里项目
Model层:封装数据模型,dao中封装数据库CRUD操作
Controller层:使用servlet实现
view层:使用jsp对页面进行渲染

3.2界面设计

(1)登录界面

(2)登录后主界面

(3)查看所有书籍信息界面

(4)添加书籍填写信息界面

(5)确认添加图书界面

(6)管理借书信息,为读者添加借书信息界面

(7)输入读者信息来管理还书界面

(8)指定读者借书信息以及还书操作界面

(9)查看借书记录界面

(10)查看读者信息界面

3.3 数据库存取技术

3.3.1 JDBC技术

本系统我们使用的是JDBC直接访问数据库。
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
JDBC API 既支持数据库访问的两层模型(C/S),同时也支持三层模型(B/S)。在两层模型中,Java applet或应用程序将直接与数据库进行对话。这将需要一个JDBC驱动程序来与所访问的特定数据库管理系统进行通讯。用户的SQL语句被送往数据库中,而其结果将被送回给用户。数据库可以位于另一台计算机上,用户通过网络连接到上面。这就叫做客户机/服务器配置,其中用户的计算机为客户机,提供数据库的计算机为服务器。网络可以是 Intranet(它可将公司职员连接起来),也可以是 Internet。
在三层模型中,命令先是被发送到服务的"中间层",然后由它将SQL 语句发送给数据库。数据库对 SQL 语句进行处理并将结果送回到中间层,中间层再将结果送回给用户。MIS 主管们都发现三层模型很吸引人,因为可用中间层来控制对公司数据的访问和可作的的更新的种类。中间层的另一个好处是,用户可以利用易于使用的高级API,而中间层将把它转换为相应的低级调用。最后,许多情况下三层结构可提供一些性能上的好处。

3.4 程序详细设计与实现

3.4.1相关业务流程算法框图

(1)借书业务流程算法框图

(2)登录流程算法框图

(3)还书业务流程算法框图

3.4.2数据库连接工具类相关代码:

(1)使用JDBC
private s tic final String driver = “com.mysql.jdbc.Driver”; //数据库驱动
private static final String url = “jdbc:mysql://localhost:3306/library?useUnicode=true&characterEncoding=UTF-8&useSSL=false”;//连接数据库的URL地址
private static final String username = “root”;//数据库的用户名
private static final String password = “101010”;//数据库的密码

private static Connection conn = null;

(2)返回数据库连接对象
public static Connection getConnection() throws Exception {
Class.forName(driver); //加载数据库驱动
if (conn == null) {
conn = DriverManager.getConnection(url, username, password); //获取数据库连接对象
return conn;
}
return conn;
}

(3) 关闭数据库
public static void close(Connection conn, Statement st, ResultSet rs) {
try {
if (conn != null)
conn.close();
if (st != null)
st.close();
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

(4)DAO层BookDao类中查询书籍封装函数:
public ArrayList getAllBook(){
ArrayList booklist = new ArrayList<>();
IODao ioDao = new IODao();
try {
Connection conn = super.getConnection(); //连接数据库
String sql = “SELECT * FROM Book”; //查询sql语句
PreparedStatement pstmt = conn.prepareStatement(sql); //对sql进行预编译
ResultSet rs = null;
rs = pstmt.executeQuery() ; //执行查询,得到resultSet对象
while (rs.next()) { //查询结构写入新的book对象
Book book = new Book();
book.setId(rs.getString(“id”));
book.setName(rs.getString(“bookname”));
book.setAuthor(rs.getString(“author”));
book.setPublisher(rs.getString(“publisher”));
book.setPrice(rs.getInt(“price”));
book.setCategory(rs.getString(“category”));
book.setStore(rs.getInt(“store”));
book.setLend(ioDao.QueryBookNumById(book.getId()));
book.setRemain(book.getStore() - book.getLend());
book.setLocation(rs.getString(“location”));
booklist.add(book);
}
return booklist;
} catch (Exception e) {
e.printStackTrace();
}
return booklist;
}

(5)DAO层借书封装函数:对数据库插入借书记录数据
public void borrow(String bookid, String readerid, String time, int borrowday){
try {
int i = 0;
Connection conn = super.getConnection(); //连接数据库
String sql = "INSERT INTO iolog (bookid, readerid, service, borrowtime, borrowday, complete)VALUES(?, ?, ?, ?, ?, ?)
PreparedStatement pstmt = conn.prepareStatement(sql); //预编译
pstmt.setString(1, bookid);
pstmt.setString(2, readerid);
pstmt.setInt(3, -1);
pstmt.setString(4, time);
pstmt.setInt(5, borrowday);
pstmt.setInt(6, 0);
i = pstmt.executeUpdate(); //执行insert操作
} catch (Exception e) {
e.printStackTrace();
}
}

(6)实现登录功能的servlet部分代码:
String username = null;
String password = null;
PrintWriter out = response.getWriter(); //得到打印输出流
HttpSession session = request.getSession(); //得到httpSesion对象
username = request.getParameter(“username”);
password = request.getParameter(“password”);
User user = new User(); //新建登录user对象
user.setUsername(username);
user.setPassword(password);
String result = udao.login(user); //使用DAO封装好的登录检查sql语句
if(result.equals(“true”)){
session.setAttribute(“adminname”, user.getName());
request.getRequestDispatcher("/main.jsp").forward(request, response); //成功即可跳转页面
}
else{
out.write(result);
}

(7)展示书籍信息的jsp代码
<%if(booklist!=null && booklist.size() > 0)
{
for(int i = 0; i < booklist.size(); i++)
{
Book b = booklist.get(i);
}
}
%>

<%=b.getId()%>
<%=b.getName()%>
<%=b.getAuthor()%>
<%=b.getPublisher()%>
<%=b.getPrice()%>
<%=b.getCategory()%>
<%=b.getStore()%>
<%=b.getLend()%>
<%=b.getRemain()%>
<%=b.getLocation()%>
edit or delete

3.5 测试及结果

(1)添加书籍测试:
1》输入要添加的书籍信息

2》add添加之后查询所有书籍,可以看到我们新添加的书籍信息。

3》点击edit/delete后删除python程序设计这本书,再查看所有书籍,可以看到已经背澈成功删除了

(2)借书测试:
1》输入借书读者id以及要借的书本id

2》点击submit后查看记录表,发现记录已经被添加了

3》再返回查看所有图书界面,可以看到被借书数量更新为1,书本剩余数量更新为19.

(3)还书测试
1》输入读者id可以看到读者的借书未归还信息,点击return进行还书。

2》还书后查看记录表,记录已经被添加:

3》之后查看所有书籍信息,发现书籍借出数量-1,剩余数量+1,说明幻术操作成功

4 工作总结

4.1小组成员及分工

4.2自己的工作及贡献

主要负责数据库部分文档的编写与整理,编写library数据库涉及的实体,以及对各实体间的关联作出具体说明;借由组内其他成员完成的数据库相关设计,利用MySQL Workbench导出各个表的ER模型,进而作出CDM(概念数据模型)图;利用Workbench导出library数据库的表结构,导入sql文件到Power Designer逆向工程创建PDM(物理数据模型)图;编写测试数据,并在Workbench中进行数据载入完成测试;整理归纳library数据库的相关信息,梳理关系数据库模式等数据库操作,完成实验报告中数据库设计与实现部分的编写。

4.3体会,经验和教训

本次小组开发图书管理系统的过程中,由于分工我图书管理系统中整个数据库的设计与实现,编写与整理了数据库相关方面的文档。本次数据库系统的综合实验,使我对于数据库代码编程操作之外,一些基础的知识加深了理解;梳理了概念设计,对于实体,实体对应的属性,各实体间的关联,E-R(实体联系)模型有了更好的认识;此外学习并完成了MySQL Workbench导出E-R模型进而绘制了CDM(概念数据模型),Workbench导出SQL表结构,进而导入sql文件到Power Designer逆向工程创建PDM(物理数据模型)图,加深了对于数据库概念结构与逻辑结构的学习;梳理数据库关系模式的过程中,对于先前每次数据库小实验中完成的各种操作,如完整性,存储结构,触发器以及数据库备份等都是一种复习回顾,并尝试着对于一些数据库功能进行改进与完善。
此次实验结束后,由于在实验过程中设计与开发的参与度不高,相关能力并未得到锻炼与提升,但是小组开发的过程中,大家分工协作完成整个系统功能的实现,其中有适当的交流与学习,收获颇多。所以接下来的学习中,应当巩固自己的数据库基础知识,并勤加动手编写实现相关操作代码,不断丰富与提高自己的设计与开发能力,后续完善对于数据库知识的学习与运用。

5 参考文献

[1].数据库系统概论(第5版),王珊 萨师煊,高等教育出版社,2017.3
[2].软件工程导论(第6版),张海藩 牟永敏,清华大学出版社,2013.10
[3].Java编程思想,作:埃克尔,译:陈昊鹏,机械工业出版社出版,2007

JavaWeb 图书管理系统(数据库综合实验)相关推荐

  1. 图书管理系统数据库综合应用

    图书管理系统数据库综合练习用到下面三个关系表: CARD      借书卡.    CNO 卡号,NAME   姓名,CLASS 班级 BOOKS     图书.      BNO 书号,BNAME ...

  2. 数据库综合实验——网上书店管理系统

    数据库综合实验13--网上书店管理系统 实验要求:给出网上书店管理系统的需求分析报告(见四),要求根据功能分析和数据分析设计概念模型,实现完整的数据库(包括:各种表,视图,必要的存储过程,触发器等). ...

  3. 学生课程成绩信息实体表设计mysql_数据库综合实验--设计某高校学生选课管理系统...

    数据库综合实验重做 因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下 题目如下: 设计某高校学生选课管理系统 实现学生信息.课程学生管 ...

  4. JavaWeb图书管理系统day03

    视频+资料+笔记[链接:https://pan.baidu.com/s/127I2oA8zvhTECCmC6wMSmQ   提取码:zjxs] JavaWeb图书管理系统[bookEstore文档] ...

  5. JavaWeb图书管理系统day02

    视频+资料+笔记[链接:https://pan.baidu.com/s/127I2oA8zvhTECCmC6wMSmQ   提取码:zjxs] JavaWeb图书管理系统[bookEstore文档] ...

  6. JavaWeb图书管理系统day01

    视频+资料+笔记[链接:https://pan.baidu.com/s/127I2oA8zvhTECCmC6wMSmQ   提取码:zjxs] JavaWeb图书管理系统[bookEstore文档] ...

  7. Javaweb图书管理系统t

    JavaWeb图书管理系统 一.创建数据库bookdb,导入数据库文件在这里插入代码片 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;-- ------- ...

  8. JavaWeb图书管理系统 图书借阅系统项目源码附带视频部署演示教程

    一.项目介绍 更新记录 2022.05.29 修复Java代码,添加过滤器未实现的方法 解决css,js样式失效,引入改为本地引入 重构项目,一个项目分两版本,一个idea版本一个eclipse版本 ...

  9. 图书管理系统-数据库设计

    选题背景 依照图书管理系统的要求,完成如下任务 设计适合此应用需求的规范化的数据库: 建立ODBC数据源: 创建数据库连接: 制作一个具有安全性控制(权限管理和视图管理等)的数据库访问程序. 数据项 ...

最新文章

  1. 软件定义光网络-SDON
  2. matlab shortest函数,MATLAB函數graphallshortestpaths不返回對稱矩陣
  3. 简单BP网络识别数码表字符
  4. 99用c语言怎么写出来的,c语言的书写格式是什么
  5. 计算机辅助语言和计算语言学关系,建构主义理论视角下计算机辅助语言学习环境对留学生学习汉语动机的影响——以广西大学泰国留学生为例-语言学及应用语言学专业论文.docx...
  6. 赞!超炫的页面切换动画效果【附源码下载】
  7. php接收get数组参数吗,php获取到data参数,如何与数组匹配
  8. 使用脚本进行 SAP Spartacus 安装工作
  9. HDU-3664-Permutation Counting
  10. VOC2007xml转YOLO的txt格式代码
  11. Spark+Python+Pycharm在Windows下的配置
  12. html切换搜索引擎,关于JavaScript如何切换搜索引擎的导航网页搜索框的实例代码分享...
  13. mysql 内连接查询总数_MySQL - 统计内连接查询
  14. python 遍历_Python中遍历列表的方法总结
  15. 【python笔记】入门练手的题
  16. 内网基础-隧道技术、内网穿透(SSH隧道、Socket隧道、跨路由扫描)
  17. 为什么Windows的文件名不能超过255个英文字符,求解答
  18. 涨价不再“嘘声”一片,“爱优腾”集体“想开了”?
  19. NFM 网络介绍与源码浅析
  20. 在CMD命令行中切换到管理员权限模式

热门文章

  1. 腾讯安全科恩实验室荣获“AutoSec安全之星”年度杰出汽车信息安全实验室
  2. 【项目总结】锂电池充电器
  3. 用计算机发短信,怎样发短信的步骤_教你如何使用电脑发短信!
  4. 关于latch的一点点理解
  5. FPGA对定点数的处理 作业
  6. 配置文件是用来解耦的吗_一次配置,随处运行:解耦配置和运行时
  7. 用“仁义”,重新设计计算机操作系统。
  8. 100m光纤测速多少正常_终于知道为什么我的百兆宽带测速只有一半了
  9. 20幅程序员才能看懂的趣图,看到第三个我就忍不住哈哈哈哈哈!
  10. 爬虫实战17:多线程爱丝APP图片爬虫