前段时间学习完了MySQL和JDBC,想着自己做个东西实战一下,于是写了一个烂大街的图书管理系统。。。但好歹是自己一个人日夜兼程,硬着头皮做出来的还像样的东西,总结一手吧。看的人欢迎吐槽。我会从以下几个方面进行总结。(总结的是我目前认为的以及怎么做的) + 这个项目设计步骤是什么 + 这个项目用到的知识有什么 + 这个项目遇到了什么问题,怎么解决的。 + 这个过程中收获的知识点有哪些
@[TOC]
一、这个项目设计步骤是什么
管理信息系统的建立与应用可以划分成总体规划、系统开发和系统运行三个阶段,其中系统开发阶段还可进一步分为系统分析、系统设计和系统实施等工作环节。上述各个阶段排列成一个严格的线性开发序列,在每个工作阶段均产生完整的技术文档作为下一阶段工作的指导和依据,每一阶段都应对文档进行评审,确信该阶段工作已完成并达到要求后才能进入下一阶段,同时在以后的工作中不能轻易改变前面经过评审的成果。 国外曾有人对一些软件项目开发各阶段的工作量进行了统计,结果表明,在开发过程中各工作阶段所占全部工作量的比重分别达到系统分析:系统设计:编程:模块调试:系统调试=20%:15%:20%:25%:20%。由此可见,程序编写在开发工作中只占很小比例,而调试工作却占整个开发工作量的一半左右
在做这个图书管理系统之前,我大概看了几篇相关的论文,我的大致的步骤如下:
1、明确开发环境
MySQL8.0.21、IDEA开发工具、JDK11.0、JDBC、SpringJDBC-Template、DBCP开源数据连接池 图形界面使用Swing组件 对每个工具有认识、懂得如何使用。(swing不太懂就扑街了 )
2、系统分析步骤
需要考虑:①系统的处理对象;②系统的功能、具体的业务;③对具体的业务有流程图设计;④将业务需求进行模块划分 处理对象: + 图书信息:书籍编号,书名,类型,作者,译者,出版商,出版时间,价格,存储量。 + 读者信息:编号,姓名,性别,最多可借数量,可借时间。 + 借阅信息:读者编号,书籍编号,借阅日期,还书日期,借阅时间,是否还书。 + 管理员信息:编号,姓名,密码,是否为管理员。
系统功能、业务 从处理对象的角度去分析 + 系统管理员能够对用户实施管理:包括添加、删除用户信息,对用户密码进行有效管理。 还能够方便的进行图书管理:包括设置图书种类和图书信息,添加、删除和修改图书信息。 + 读者用户在该系统进行借书,系统自动添加借书记录和借书日期,读者还书时管理员也能在平台进行还书操作,修改读者借书信息。 + 管理员可以修改用户信息和自己的信息,还可以对数据库的信息进行维护、日志管理等 + 游客和读者都能方便的对图书进行查询。但只有登陆了才能进行借书操作
流程图设计 我没有设计,按照自己的思路写的。
功能模块划分 + 应用启动界面模块 + 用户注册模块 + 用户信息登陆模块 + 用户借阅信息 + 图书馆藏资源模块 + 管理员模块
具体功能还需要细分、设计实现
3、数据库设计
大写强调 ; 设计数据库字段用英文 !
我们要设计数据库要考虑 + 表结构的实现(主键、非空、自增、数据类型、外键约束等) + 每个表插入和删除、修改、查询的时候需要注意什么 + 触发器和事务是否需要设计
附上我的表结构:
books表 书编号(主键)、书名、价格、剩余量、出版商、作者、出版日期、类型
user表 字段:id主键、用户名、密码、是否管理员(这里可以添加权限,我没有设计,0非管理员1管理员)
reader表 id关联user表的id,名字、可借书的天数、可借书本数、性别、已借书数、人生格言(默认值)
borrow表 借书者的id、所借书id、借书日期、是否归还、截止还书日期
创建的触发器 1、当书的余量为0,读者想要借书无法借 2、当读者成功借书、则余量-1且borrow表添加对应的借书记录 3、当读者还书时、则余量+1、且borrow表删除对应的记录 4、当添加图书时,检查出版日期不能超过今天
创建的表结构的MySQL语句汇合: 创建book表——>创建user表——>创建reader表——>创建borrow表
1
这个过程中遇到的错误: + 1、MySQL不支持在触发器使用事务,也就是不允许使用rollback等操作。可以使用抛出异常来替代 + 2、在MySQL WorkBeach里面添加触发器时需要修改sql语句结束符,该语句要和创建触发器的语句一起,不要单独执行。都写好了以后点击执行。 + 3、注意数据类型,TIMESTAMP和DATE,TIMESTAMP日期包含具体几点,格式比较长。尽量使用DATE,方便与java里面的数据类型进行转化。 + 4、注意new和old的使用场景以及针对的对象表,inset和update、delete三者的new区别。 + 5、判断日期的前后使用对应的函数:mysql 日期加减天数
MySQL
4、DAO三层架构模型实现
我们需要将与数据库的交互进行封装 在java里面创建表映射对象,我们对对象的操作就可以操作对应的表数据了。
一、ORM表映射
如books表的映射
package
我们把这些表映射放到统一的包ORM里面。
二、数据库连接池CP
在Java中开源的数据库连接池有以下几种 : 1、C3P0:是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate [2] 一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。 2、Proxool:是一个Java SQL Driver驱动程序,提供了对选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中,完全可配置,快速、成熟、健壮。可以透明地为现存的JDBC驱动程序增加连接池功能。 3、Jakarta DBCP:DBCP是一个依赖Jakartacommons-pool对象池机制的数据库连接池。DBCP可以直接的在应用程序中使用。 4、DDConnectionBroker:是一个简单、轻量级的数据库连接池。 5、DBPool:是一个高效、易配置的数据库连接池。它除了支持连接池应有的功能之外,还包括了一个对象池,使用户能够开发一个满足自己需求的数据库连接池。
我们使用是DBCP
利用该数据库连接池我们创建封装好的JDBC实例: 相关的配置我们写到一个文件里面:
然后我们创建工具类用于获取数据库连接池的datasource
package
三、基于ORM表映射,利用数据库连接池设计对应的DAOImpl实现CRUD
先利用SpringJDBCTemplate返回被封装的JDBC,类型是带命名参数的JDBCTemplate
package
创建对应表的DAOImpl,如books的DAOImpl实现CRUD操作:
package
我们把这些表的功能实现放在同一个包里面:
四、测试类,用于测试每个类的功能是否完成
package
把它放到测试包里面,当需要添加新功能时,就在这里进行测试
5、图形界面开发
一、启动界面StartUi
二、注册界面UserRegister
三、登陆界面LogInGUi
管理员的登陆界面也是这个,但是会添加额外功能
四、读者信息界面ReaderInfo
以读者身份登陆后显示个人信息,头像动态生成,man则是男头像,woman则是女头像
五、读者借书的信息界面(还书操作、ReturnBooksGui)
点击借书按钮,如果没有借书记录则不进入还书界面
点击借书按钮,进入馆藏资源借书,然后返回:已借书数动态更新
点击还书按钮:
输入id还书或者全部归还
六、图书馆资源一览界面LibrarySources
必须登陆才能进行借书:
七、管理员登陆界面AdminRegister
在登陆界面登陆提示管理员以后,点击是,会进入管理界面,弹出问候语
这里会有很多操作,功能实现等。采用了菜单栏和菜单、菜单选项、监听对应的菜单,触发不同的功能。
一些还没写的功能就用:
2、如何创建一个Map数组以及其实例化
Map
二、遇到的问题
1、如何使用下拉选择框
jComboBox_sex
2、如何给JPanel添加背景图片
千万不要信哪些人说的添加Jlabel,治标不治本的。设置透明毫无美感。可以自己手写一个类来实现,利用了重新绘制的函数。
package
3、如何动态修改JTable的值,同时检验数据的合格性,不合格不保存、如何动态删除选择的行、以及如何删除一行同时将对应的操作施加到数据库。
思路:将数据库的数据读取出来,然后得到了二维数据数据bookDate,给表创建单元格编辑器,在编辑器里可以设置对值的检验。然后在监听对应的表数据,将对应的修改值存起来,选择的行利用主键唯一性存起来。然后利用一个按钮来确认删除.就将存的数据提取处理删除。
表格编辑器
package
给表格添加该编辑器
// 创建单元格编辑器,使用文本框作为编辑组件
对表格更新操作进行监听,然后将数据保存到bookData,但是未保存到数据库。在确认按钮上添加监控,点击,则进行对应事件的处理。
///表格监听,编辑表格得到的数据将保存到实际的数据库,保存前会发出提示
删除多选的行操作,因为你移除了一次行,对应的行的索引会变化,你要像我这么做:
jButton_delete
全部删除;
while
表格的排序和过滤: TableModel没有移除行model.removeRow(0);//一行一行的删除 所以我们要将TableModel定义为DefaultTableModel
TableModel
4、菜单栏和菜单、菜单选项的使用
先添加菜单栏,再添加菜单,必须设置名字才能看见。。。 然后在对应的菜单添加多个菜单选项或者子菜单
JMenuBar
5、父窗体、子窗体、A-B-C-A等的调用关系如何处理
利用了传入参数的办法,判断是否null等、或者按照需要将对应的窗体设置为:
mainJFrame
6、将一些类和方法抽取公共类、公共方法、接口,代码依然冗杂
7、IDEA里面配置MySQL数据库
8、各种布局管理器
一个很实在的讲解: 运用 BoxLayout 进行 Swing 控件布局
8、整体项目架构使用maven项目管理工具
三、结语
项目做了6天,也是自己的第一个项目,完全独立的做,遇到了很多的难题,但是解决了以后现在我想不起啦 。。。总的来说还行。 贴上总代码行数:
最大的问题:怎么样让代码,不那么冗杂!!!DAO三层架构设计不知道我的到底算不算是
四、源码
github: https://github.com/linj21a/BooksMangementSystem
结后语 说明文档什么的就不会写了。。。。博客匆忙总结一把了。还有好多东西要学,大家加油!不懂就要问,我也不懂 。大家开始吐槽吧!!!
原文链接:
六天写出来的基于Swing的图书管理系统你不来吐槽一下?_LH is programming hard-CSDN博客blog.csdn.net