MySQL图书管理系统设计

2023-11-13

目录

一、项目简介

二、项目分析

(1)需求分析

①图书管理功能(书籍的借出、归还)

②信息操作功能

③人员管理功能

(2)需求表信息分析

①图书管理需求表分析

②信息操作表信息分析

③人员信息表

三、项目实施

(1)创建图书信息表

(2)创建人员信息表

(3)创建信息操作表

(4)测试数据导入

(5)借书存储过程及测试

①借书存储过程

 ②还书测试

 (6)还书存储过程及测试

①还书存储过程

②还书测试

四、项目回顾总结

(1)项目要点

(2)项目扩展


一、项目简介

图书管理系统是许多学校图书馆、公共图书馆所经常使用到的数据管理系统,它主要是通过存储过程“封装”数据更新功能,实现图书的借书、还书功能以及记录人员操作信息功能,本次实验的MySQL图书管理系统设计是针对后端数据库采集数据、更新数据的一个小项目。

二、项目分析

(1)需求分析

根据图书管理系统功能实现要求,本次将实现以下功能:

①图书管理功能(书籍的借出、归还)

图书管理功能是实现书籍的借出、归还,判断书籍库存情况,更新图书数据。

②信息操作功能

信息操作功能是实现借书人员的操作记录信息,记录图书租借信息。

③人员管理功能

本次实验图书馆以学校图书馆为主要目标对象,因此还需要人员管理功能,人员管理功能是实现学校学生的信息管理,它所能完成的项目是图书馆仅开放于学校的学生和老师对平通员工不做开放

(2)需求表信息分析

①图书管理需求表分析

需要实现书籍的借阅,因此对书籍信息表(books)有以下信息:

书籍序号:book_id

书名:book_name

作者名:book_author

出版社:book_press

书籍价格:book_price

书籍库存:book_stock

书籍简介:book_desc

②信息操作表信息分析

借书记录表(records)存储租借信息记录的数据表

借书记录序号:rid

租借学生编号:snum

图书编号:bid

借书数量:borrow_num

借书状态:is_return(0表示归还,1表示未归还)

租借日期:borrow_date

③人员信息表

人员信息表(personnel)存储租借人员的信息表

人员编号:per_num

人员姓名:per_name

人员性别:per_gender

人员年龄:per_age

人员职能:per_func

三、项目实施

(1)创建图书信息表

create table books(
   book_id int primary key auto_increment,  -- 书籍序号
	 book_name varchar(50) not null,  -- 书名
	 book_author varchar(20) not null, -- 作者名
     book_press varchar(20) not null, -- 出版社
	 book_price decimal(10,2) not null, -- 书籍价格
	 book_stock int not null, -- 书籍库存
	 book_desc varchar(200)  -- 书籍简介
);

(2)创建人员信息表

create table personnel(
	per_num char(4) primary key, -- 人员编号
	per_name varchar(20) not null, -- 人员姓名
	per_gender char(2) not null, -- 人员性别
	per_age int not null, -- 人员年龄
    per_func varchar(20) not null -- 人员职能
);

(3)创建信息操作表

create table records(
   rid int primary key auto_increment, -- 借书记录序号
	 snum char(4) not null, -- 租借学生编号
	 bid int not null,  -- 图书编号
	 borrow_num int not null, -- 借书数量
	 is_return int not null, -- 0表示为归还   1 表示已经归还 借书状态
	 borrow_date date not null, -- 租借日期
	 constraint FK_RECORDS_STUDENTS foreign key(snum) references personnel(per_num),
	 constraint FK_RECORDS_BOOKS foreign key(bid) REFERENCES books(book_id)
);

(4)测试数据导入

图书书籍数据导入:

insert into books(book_name,book_author,book_press,book_price,book_stock,book_desc)
values('Java程序设计','亮亮','清华出版社',38.80,12,'亮亮老师带你学Java');
insert into books(book_name,book_author,book_press,book_price,book_stock,book_desc)
values('Python王者之路','威哥','重庆大学出版社',44.40,9,'千锋威哥,Java王者领路人');

 

人员信息添加:

insert into personnel(per_num,per_name,per_gender,per_age,per_func) values('1001','张三','男',20,'学生');
insert into personnel(per_num,per_name,per_gender,per_age,per_func) values('1002','李四','女',20,'学生');
insert into personnel(per_num,per_name,per_gender,per_age,per_func) values('1003','王五','男',35,'讲师');
insert into personnel(per_num,per_name,per_gender,per_age,per_func) values('1004','王三','女',35,'副教授');

(5)借书存储过程及测试

①借书存储过程

-- 参数1:学号
-- 参数2:图书编号
-- 参数3:借书的数量
-- 参数4:借书状态
create procedure proc_borrow_book(IN a char(4),IN b int, IN m int,OUT state varchar(20))
begin
	declare per_count int default 0;
	declare book_count int default 0;
	declare stock int default 0;
	-- 判断学号是否存在:根据参数 a 到学生信息表查询是否有stu_num=a的记录
	select count(per_num) INTO per_count from personnel where per_num=a;
	if per_count>0 then
		 -- 学号存在
		 -- 判断图书ID是否存在:根据参数b 查询图书记录总数
		 select count(book_id) INTO book_count from books where book_id=b;
		 if book_count >0 then
		    -- 图书存在
			  -- 判断图书库存是否充足:查询当前图书库存,然后和参数m进行比较
				select book_stock INTO stock from books where book_id=b;
				if stock >= m then
					-- 执行借书
					-- 操作1:在借书记录表中添加记录
					insert into records(snum,bid,borrow_num,is_return,borrow_date) values(a,b,m,0,sysdate());
					-- 操作2:修改图书库存
					update books set book_stock=stock-m where book_id=b;
					-- 借书成功
					set state='借书成功';
				else
				  -- 库存不足
					set state='库存不足';
				end if;				
		 else
				-- 图书不存在
				set state = '图书不存在';
		 end if;
	else
	   -- 不存在
		 set state = '非学校人员';
	end if;
end;

 注:借书存储过程运行之后,若用的是Navicat的函数选项有创建的存储过程名,若是终端则使用语句:show procedure status where db='数据库名'
 

 ②还书测试

-- 调用存储过程借书
-- 参数1:学号
-- 参数2:图书编号
-- 参数3:借书的数量
-- 参数4:借书状态
set @state='';
call proc_borrow_book('1001',2,1,@state);
-- 反应借书情况
select @state from dual;

运行后得到如下结果,则借书过程成功

 同时观察借书记录中的数据

 (6)还书存储过程及测试

①还书存储过程

-- 参数1:换书人学号
-- 参数2:归还图书编号
-- 参数3:还书的数量
-- 参数4:还书状态

create procedure proc_return_book(IN a char(4),IN b int, IN m int,OUT state VARCHAR(20))
begin
	declare per_count int default 0;
	declare book_count int default 0;
	declare stock int default 0;
	-- 判断学号是否存在:根据参数 a 到学生信息表查询是否有stu_num=a的记录
	select count(per_num) INTO per_count from personnel where per_num=a;
	if per_count>0 then
		 -- 学号存在
		 -- 判断图书ID是否存在:根据参数b 查询图书记录总数
		 select count(book_id) INTO book_count from books where book_id=b;
		 if book_count >0 then
		    -- 图书存在
					-- 操作1:在借书记录表中添加记录
					insert into records(snum,bid,borrow_num,is_return,borrow_date) values(a,b,m,1,sysdate());
					-- 操作2:修改图书库存
					update books set book_stock=stock+m where book_id=b;
					-- 借书成功
					set state='还书成功';
						
		 else
				-- 书籍归还错误
				set state = '此书籍不是图书馆的书';
		 end if;
	else
	   -- 不存在
		 set state = '还书人员信息错误';
	end if;
end;

②还书测试

-- 参数1:还书人学号
-- 参数2:归还图书编号
-- 参数3:还书的数量
-- 参数4:还书状态
set @state='';
call proc_return_book('1001',2,1,@state);
-- 反应借书情况
select @state from dual;

 

四、项目回顾总结

(1)项目要点

本次实验项目主要要点是对表创建的考察、存储过程创建考察、存储过程中间逻辑运算的考察,同时会有人疑惑为什么不一个一个的查或者写好固定的SQL语句更改参数?

其实这和存储过程的运用有关,存储过程的运用一是增加了SQL语句的复用性,二是增加了SQL语句的安全性,三是增加了SQL语句的便捷性。

(2)项目扩展

这里的项目扩展是作者的一个小小运用,本次的图书管理系统可以运用到生活中,我们编写一个存储过程可以用以记录一些日常事务,

例如:作者和女友有个行为信息记录表,每次的行为信息可以给女友进行加分,我们可以通过编写存储实现对日常行为的记录加分,同时可以编写存储过程实现对女友日常行为积分的兑换,设置积分兑换表,即可以完成兑换记录的添加。这就是本次实验可以运用到日常生活的地方,当然我们还你可以编写一个可视化界面,进行一个可视化的操作,用以自己的生活记录也是可以的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL图书管理系统设计 的相关文章

  • 在 Android 中获取联系方式需要花费大量时间?

    您好 目前正在做一个与联系人相关的项目 我正在从联系人中获取详细信息 电子邮件 电话号码和联系人姓名 效果很好 但问题是获取联系方式需要很长时间 超过 1000 个联系人 包括从社交网站同步的联系人 这样我就放了一个Asynchronous
  • 从 CSV 到 MySQL 的换行问题

    我正在将 csv 文件导入 MySQL 除了文件中的换行符之外 一切正常 我的 csv 行之一如下所示 42 E A R Classic Earplugs ear images ear classic jpg 5 Proven size s
  • 数据库中的 HTML 标签是不好的做法还是好的做法?

    有时我需要格式化来自数据库的特定数据或部分数据 例如 如果我有这样的 desc 存储在数据库中 HTML 4 经过调整 延伸和增强 超出了其最初的范围 为网站带来了高水平的交互性和多媒体 Flash Silverlight 和 Java 等
  • MySQL 5:我的 GROUP BY 字段的顺序重要吗?

    Peeps 我的 MySQL 查询中有一些聚合 计算字段 我的 GROUP BY 子句是动态生成的 具体取决于用户在 Web 表单中选择的选项 很好奇 GROUP BY 子句中列出的字段顺序是否会对计算产生任何影响 例如 SUM AVERA
  • 如何按关系的数量或成员对 Doctrine DQL 查询进行排序?

    我正在尝试创建一个查询 用于从 Doctrine 数据库中检索对象 并按特定一对多关系的成员数量排序 更具体地说 我有两个实体 Person 和 Federation 一个人可以是一个联盟的成员 人具有 联盟 关系 并且一个联盟可以有n人
  • MySQL通过UPDATE/DELETE合并重复数据记录

    我有一个看起来像这样的表 mysql gt SELECT FROM Colors ID USERNAME RED GREEN YELLOW BLUE ORANGE PURPLE 1 joe 1 null 1 null null null 2
  • PDO获取最后插入的ID

    我有一个查询 我想获取插入的最后一个 ID 字段ID是主键并且自动递增 我知道我必须使用这个声明 LAST INSERT ID 该语句适用于如下查询 query INSERT INTO cell place ID VALUES LAST I
  • 错误代码:1062。重复条目“PRIMARY”

    因此 我的教授给了我表格将其插入数据库 但是当我执行他的代码时 MySQL 不断给出错误代码 1062 这是冲突表和插入 TABLES CREATE TABLE FABRICANTES COD FABRICANTE integer NOT
  • MySQL InnoDB引擎是否对只读事务运行任何性能优化

    根据参考文档 只读事务标志可能会提示存储引擎运行一些优化 设置会话事务只读 如果事务访问模式设置为 READ ONLY 则对表进行更改 被禁止 这可能使存储引擎能够提高性能 不允许写入时可能进行的改进 InnoDB引擎是否对只读事务运行这样
  • Magento - 无法重新索引产品价格 - 外键约束失败

    我最近刚刚将我的 magento 商店从 1 4 2 升级到 1 7 0 2 升级进行得很顺利 但是当我尝试在升级后重新索引数据时 产品价格失败了 我尝试过使用php shell indexer php reindexall来自 SSH 它
  • 当我尝试计算 mysqli 结果时,为什么会收到警告?

    下面的代码会导致此警告 警告 count 参数必须是数组或实现 Countable 的对象 为什么要这样做 如何防止出现警告 if isset GET edit sonum GET edit update true result mysql
  • 如何在没有 DROP 数据库权限的情况下从命令行删除所有 MySQL 表? [复制]

    这个问题在这里已经有答案了 如何使用命令提示符删除 Windows MySQL 中的所有表 我想这样做的原因是我们的用户有权访问数据库删除 但无权重新创建数据库本身 因此我们必须手动删除表 有没有办法一次删除所有表 请记住 大多数表都与外键
  • 内连接 3 个表

    我正在使用 PHP 和 PDO 我需要重新收集连接 3 个表的信息 photos albums 相册照片 该表具有以下结构 photos photo id int path varchar nick varchar date timesta
  • 如何删除MySQL中的所有事件

    如果我想删除某个事件 我需要查询类似的内容 DROP EVENT IF EXISTS eventname 但我找不到一次性删除所有事件的命令 必须一项一项地删除 有没有一次性删除所有事件的SQL DROP EVENT IF EXISTS S
  • 无法启动 MongoDB:Windows 中的系统错误 1067

    在 Windows Server 2008 R2 上设置 MongoDB 服务后 出现此错误 C mongodb bin gt net start MongoDB The Mongo DB service is starting The M
  • Apache 子进程已退出,状态为 255

    经过大量的搜索 尝试 修复 等待和哭泣 在我放弃之前 我想为这个错误抓住最后的机会 我们正在奔跑Microsoft Windows Server 2012 Apache 2 4 6 Win64 OpenSSL 1 0 1e PHP 5 5
  • MySQL 两种日期格式之间的转换

    用户将以这种格式输入日期 2017 年 2 月 17 日 存储在 mysql 数据库中的日期格式如下 2015 02 17 00 00 00 我想做的是 SELECT FROM insurance where DATE FORMAT in
  • 我应该检查代码中的数据库约束还是应该捕获数据库抛出的异常

    我有一个将数据保存到名为 作业 的表中的应用程序 Jobs 表有一个名为 Name 的列 该列具有 UNIQUE 约束 名称列不是主键 我想知道在尝试保存 更新新条目之前是否应该自己检查重复条目 或者最好等待数据访问层抛出异常 如果这个应用
  • sql直接获取表行数的方法

    stackoverflow 的朋友们大家好 我的例行程序中有一个我认为不必要的步骤 假设您想从图库中获取所有图像 并限制每页一定数量的图像 db PDO object start pagenum x images per page limi
  • 如何统计订单总价?

    我有这些表 Orders id status user id address id 1 await 1 1 products id name price quantity 1 test1 100 5 2 test2 50 5 order p

随机推荐

  • Pod 启动时命令和参数 与 dockerfile镜像区别

    主要是记录问题 如下文档 为容器设置启动时要执行的命令和参数 KubernetesDockerfile 中的 CMD 与 ENTRYPOINT sparkdev 博客园 K8s Pod Command 与容器镜像 Cmd 启动优先级详解 腾
  • Intellj IDE出现 java.lang.NoClassDefFoundError:

    在Intellj Idea中 主程序依赖了一个库modules 在模块中有一个dependence选项卡 把相关的依赖库选项的provided改为compile即可
  • python获取上一层文件夹路径

    https www cnblogs com yajing zh p 6807968 html
  • 零基础程序员自学编程的6种方法,你知道吗?

    随着互联网日趋迅猛 编程已经在我们生活当中无处不在了 众所周知 程序员的工资都很不错 于是越来越多的人 都想加入到编程的行业中来 那么如何加入到程序员的行业当中 PHP从入门到放弃 C语言从入门到放弃 Java从入门到放弃 Python从入
  • flutter创建项目指定语言

    每次新建Flutter项目都会去用命令来创建 因为不熟悉android的kottlin语言 每次都会抗拒一下 所以每次创建项目我都会选择去选用我熟悉的Java跟OC语言 直接上方法 注意 现在flutter创建的项目默认是swift跟kot
  • 如何实现在一个 Socket 应用程序中同时支持 IPv4 和 IPv6

    如何实现在一个 Socket 应用程序中同时支持 IPv4 和 IPv6 如何巧妙地设计代码结构 陈 鲁 软件工程师 IBM 孙 妍 软件工程师 IBM 简介 当今的网络主流是 IPv4 网络 但随着 IP 地址的日益短缺 IPv6 网络开
  • JSP页面获取cookie内容

    当使用jsp技术时会用到cookie保存一些信息 在后端逻辑代码设置cookie Cookie name new Cookie uname na Cookie pwd new Cookie upwd pw 设置最大存活时间180s name
  • vue之路由配置中的meta

    仅对以前所学做复习记录使用 meta 数据的元数据 也就是程序员可以自己自定义的一些变量
  • 5G QoS管理及与DRB映射关系

    前言 无线网络是一个等级森严的体系 一直以来 无线资源都是紧张的 因而无线网络上的各种业务所享受的服务也无法平等 网络需要优先保障重要的业务 比如 相比普通上网的数据业务 音视频数据业务的优先级会更高 相比音视频数据业务 语音通话的优先级会
  • JVM对象内存布局

    HotSpot虚拟机中 对象在内存中的存储布局分3部分 对象头 实例数据 对齐填充 一 对象头 对象头包含两部分信息 对象的运行时数据和类型指针 1 对象的运行时数据 对象的运行时数据非常多 主要有哈希码 GC分代年龄 锁状态标志 线程持有
  • VMware虚拟机安装Linux系统教程(图文详解)

    一 安装 VMware 1 VMware虚拟机下载 链接 https pan baidu com s 1TElrJharG7jX25D9QO2Iyw pwd 5a8n 提取码 5a8n 安装 选一下安装地址 一直下一步即可 可能会要求重启电
  • Yii Framework 开发教程(30) Zii组件-ListView 示例

    CListView可以用来显示列表 CListView支持使用自定义的View模板显示列表的的记录 因此可以非常灵活的显示数据的表 这点有点像Android的ListView CListView 支持分页和排序 分页和排序支持使用AJAX实
  • vue项目部署到服务器打不开,Vue 项目部署到服务器的问题解决方法_盂希_前端开发者...

    相信很多小伙伴在用开发的时候 在 如何打包 基于 如何部署 将打包出来的 但有时候 我们会直接将dist文件扔到服务端 出现的问题 打包到服务器后 出现 打包到服务器后 出现空白页的问题 打包到服务器后 出现引入的 打包到服务器后 出现路由
  • MD5,SHA1,SHA256,NTLM,LM等Hash在线破解网站收集

    MD5 http hashchecker de find html http paste2 org p 441222 http r0ot podzemlje net x md5 http hashkiller com index php a
  • i春秋 从0到1CTFer成长之路-CTF中的SQL-1注入

    这是本萌新第一次写博客 作为对前面的学习的总结 如有错误 欢迎各位师傅们指正 如何判断注入类型我就不做过多的解释 不知道同学请移步去学习 手动狗头 CTF中的SQL注入 我采用的是手注 根据经验判断是字符型注入 接下来就来查看有几列 ord
  • 区块链学习7:超级账本项目Hyperledger与Fabric以及二者的关系

    前往老猿Python博文目录 一 超级账本 hyperledger 超级账本 hyperledger 是Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目 成员包括金融 银行 物联网 供应链 制造和科技行业的领头羊 h
  • GBDT和随机森林的区别

    GBDT和随机森林的相同点 1 都是由多棵树组成 2 最终的结果都是由多棵树一起决定 GBDT和随机森林的不同点 1 组成随机森林的树可以是分类树 也可以是回归树 而GBDT只由回归树组成 2 组成随机森林的树可以并行生成 而GBDT只能是
  • 关注物联网、关注NB-IoT

    概述 关注物联网 关注NB IoT 跟紧时代步伐 让更多人深入理解5G用意 在当下情况下 今天就来来聊一聊NB IoT 特意整理了一些NB IoT的入门级问题 问 NB IoT的优势是什么 答 支持单小区50K用户连接 做上传用低功耗优势明
  • 【SpringBoot深入浅出系列】SpringBoot集成Eureka及Feign

    目录 前言 一 Eureka 是什么 二 Feign 是什么 三 集成步骤 1 创建 Eureka 服务注册中心 1 添加依赖 2 添加配置 3 启动类添加注解 4 启动服务 2 创建 SpringBoot 项目 provider 1 添加
  • MySQL图书管理系统设计

    目录 一 项目简介 二 项目分析 1 需求分析 图书管理功能 书籍的借出 归还 信息操作功能 人员管理功能 2 需求表信息分析 图书管理需求表分析 信息操作表信息分析 人员信息表 三 项目实施 1 创建图书信息表 2 创建人员信息表 3 创