一、项目分析

1、项目功能分析

项目功能模块主要分为三个模块,登录模块、管理员模块、操作员模块。

登录模块包括登录功能,注册功能,登录日志功能,修改密码以及找回密码。

管理员模块包括工作日志功能、图书借阅金额设定、操作员管理功能、图书借阅逾期账单。

操作员模块包括基础信息维护功能,对图书类别、读者类型、罚金进行增删改查的操作,图书信息管理功能是对图书信息的增删改查,读者信息管理功能对读者信息的增删改查,图书借阅管理功能包括图书的借阅,图书的归还以及图书借阅记录的查询。以上就是整个项目的主体功能结构,理清楚需求与结构后,便着手了项目的说明文档。

2、说明文档

说明文档主要从概要设计说明、软件需求说明、接口设计说明、数据库设计说明四个方便对项目的结构,需求,具体的接口,数据库进行全面的规划设计,保证了代码编写的依据性以及合理性。

概要设计说明对项目编写的背景、需求分析、程序运行的流程、功能结构、接口设计、数据库设计以及程序运行出错后的处理方案进行了总体的描述与规划。

软件需求说明是对整个程序进行了具体的需求分析,包括了项目整体的结构图,流程图,ER设计图,为项目的进行和程序的编写提供了方向。

接口设计说明是程序对数据库访问的具体方法的接口设计,接口设计清楚了就能更快速的进行对数据的处理与使用。

数据库设计说明主要是对数据库进行具体的数据表设计,根据软件的具体需求来设计相应的数据表,存放软件产生的数据。

二、项目实现

项目编写严格按照了三层架构的标准来设计同时具体体现了简单工厂的设计模式。从Dao类的设计到实体层再到业务逻辑成最后到页面设计,整体的结构清晰明了。然后展示一些代码吧,满满的成就感!

图书借阅Dao:

public interface BookBorrowAndReturnDao {//查询所有借阅记录List<BookBorrowAndReturn> selectAllBorrow(Connection conn);//添加一条借阅记录void addborrow(Connection conn, BookBorrowAndReturn bbr);//修改借阅记录int updateBorrow(Connection conn, int readerId, int ISBN, Date returnDate, BookBorrowAndReturn bbr);//根据readerId查询需要归还的图书记录List<BookBorrowAndReturn> selectBorrowByReaderId(Connection conn, int readerId);//根据isbn和readerId以及状态查询需要归还的图书记录BookBorrowAndReturn selectBorrowByIsbn(Connection conn, int readerId, int isbn, String state);//根据状态和图书编号查询List<BookBorrowAndReturn> selectBorrowByIsbn(Connection connection, int isbn, String state);//根据读者ID和状态查询List<BookBorrowAndReturn> selectBorrowByState(Connection connection, int readerId, String state);
}

图书借阅的Impl:

public class BookBorrowAndReturnImpl extends BaseDao<BookBorrowAndReturn> implements BookBorrowAndReturnDao {//查询所有借阅信息@Overridepublic List<BookBorrowAndReturn> selectAllBorrow(Connection conn) {String sql = "select readerId,readerName,bookISBN as ISBN,bookName, borrowDate,returnDate,fine,state from bookborrowandreturn";List<BookBorrowAndReturn> beanList = getBeanList(conn, sql);return beanList;}//借书记录@Overridepublic void addborrow(Connection conn, BookBorrowAndReturn bbr) {String sql = "insert into bookborrowandreturn(readerId,readerName,bookISBN,bookName,borrowDate,state) values(?,?,?,?,?,?)";update(conn, sql, bbr.getReaderId(),bbr.getReaderName(), bbr.getISBN(),bbr.getBookName(), bbr.getBorrowDate(), bbr.getState());}@Overridepublic int updateBorrow(Connection conn, int readerId, int ISBN, Date returnDate, BookBorrowAndReturn bbr) {String sql = "update bookborrowandreturn set readerId = ?,readerName = ?,bookISBN = ?, bookName = ?,borrowDate = ? ,returnDate = ?, fine = ? ,state = ? where readerId = ? and bookISBN = ? and returnDate is ?";int update = update(conn, sql, bbr.getReaderId(), bbr.getReaderName(),bbr.getISBN(),bbr.getBookName(), bbr.getBorrowDate(), bbr.getReturnDate(), bbr.getFine(), bbr.getState(), readerId, ISBN,returnDate);return update;}@Overridepublic List<BookBorrowAndReturn> selectBorrowByReaderId(Connection conn, int readerId) {String sql = "select readerId,readerName,bookISBN as ISBN,bookName, borrowDate,returnDate,fine,state from bookborrowandreturn where readerId = ?";List<BookBorrowAndReturn> beanList = getBeanList(conn, sql, readerId);return beanList;}@Overridepublic BookBorrowAndReturn selectBorrowByIsbn(Connection conn,int readerId, int isbn,String state) {String sql = "select readerId,readerName,bookISBN as ISBN,bookName, borrowDate,returnDate,fine,state from bookborrowandreturn where bookISbn = ? and state = ? and readerId = ?";BookBorrowAndReturn beanList = getBean(conn, sql, isbn,state,readerId);return beanList;}@Overridepublic List<BookBorrowAndReturn> selectBorrowByIsbn(Connection connection, int isbn, String state) {String sql = "select readerId,readerName,bookISBN as ISBN,bookName, borrowDate,returnDate,fine,state from bookborrowandreturn where bookISbn = ? and state = ?";List<BookBorrowAndReturn> beanList = getBeanList(connection, sql, isbn,state);return beanList;}@Overridepublic List<BookBorrowAndReturn> selectBorrowByState(Connection connection, int readerId, String state) {String sql = "select readerId,readerName,bookISBN as ISBN,bookName, borrowDate,returnDate,fine,state from bookborrowandreturn where readerId = ? and state = ?";List<BookBorrowAndReturn> beanList = getBeanList(connection, sql, readerId,state);return beanList;}
}

图书归还功能的部分代码展示:

 页面设计展示:

 程序运行图:

三、项目心得

利用数据库来实现实现数据的存储比使用文件来储存数据要方便多了也要更快捷了,同时效率也更高了。但是在用的时候出现了一些问题还有在业务逻辑层循环语句的使用上还是避免不了出现错误,多层循环的嵌套容易理不清楚,所以就出现的一些bug进行总结。

1、JDBC使用时sql语句与数据库对应错误。

主要是由于实体层设计时属性名没有与数据表的列名保持一致,从而在sql语句编写出现错误,导致异常,要使用别名来进行联系。

如下图的bookISBN与实体类属性ISBN的不一致:

 public List<BookBorrowAndReturn> selectAllBorrow(Connection conn) {String sql = "select readerId,readerName,bookISBN as ISBN,bookName, borrowDate,returnDate,fine,state from bookborrowandreturn";List<BookBorrowAndReturn> beanList = getBeanList(conn, sql);return beanList;}

2、多层循环嵌套

在编写图书借阅与归还功能时需要添加许多的限制条件,就难免需要多层循环的嵌套,并且还需要对数据库查询出来的数据存储的集合进行遍历,许多的while循环,for循环,if语句嵌套在一起,当时就出现了循环的多余,以及引用的错误!在进行循环嵌套时首先就要搞清楚每一层循环的作用,并添加注释,那么在出现错误后也能一目了然。

如:

 public void returnBook() {System.out.println("**********************");System.out.println("********图书归还********");System.out.println("**********************");//打印读者信息表System.out.println("读者信息表");new SetReader().selectAllReader();//获取连接Connection conn = null;try {conn = JDBCutils.getConnectionDruid();boolean flag = true;while (flag) {System.out.println("请选择你要进行还书的读者的序号");int Id = TSUtility.readInt();List<Reader> readers = new ReaderDAOImp().selectAllReaders(conn);if (Id > readers.size() || Id <= 0) {System.out.println("选择错误,请重新选择!");} else {flag = false;int readerId = readers.get(Id - 1).getReaderId();//查询选择的序号对应的读者的所有未还记录String state = "未还";BookBorrowAndReturnOperation b = new BookBorrowAndReturnOperation();List<BookBorrowAndReturn> books = b.selectBorrowByState(readerId, state);Date borrowBookDate = null;if (books.size() == 0) {System.out.println("读者" + readers.get(Id - 1).getName() + "暂无未归还记录");} else {System.out.println("====图书未还记录====");System.out.println("序号\t读者ID\t读者姓名\t图书ISBN\t图书名称\t借书日期\t还书日期\t罚金\t状态");for (int i = 0; i < books.size(); i++) {System.out.println((i + 1) + "\t" + books.get(i).getReaderId() + "\t" + books.get(i).getReaderName() + "\t" + books.get(i).getISBN()+ "\t" + books.get(i).getBookName() + "\t" + books.get(i).getBorrowDate() + "\t" + books.get(i).getReturnDate() +"\t" + books.get(i).getFine() + "\t" + books.get(i).getState());borrowBookDate = books.get(i).getBorrowDate();}TSUtility.readReturn();//选择需要归还的图书(一次只能还一本)boolean returnFlag = true;while (returnFlag) {System.out.println("请选择你要还的图书的序号");int bId = TSUtility.readInt();if (bId > books.size() || bId <= 0) {System.out.println("选择错误,请重新选择!");} else {returnFlag = false;int bookId = 0;for (int j = 0; j < books.size(); j++) {bookId = books.get(bId - 1).getISBN();}//设置归还时间Scanner sc = new Scanner(System.in);Date returnDate = null;boolean flagD = true;int days = 0;while (flagD) {System.out.println("请输入归还日期(格式:yyyy-MM-dd):");String date = sc.next();boolean date1 = isDate(date);returnDate = getDateStr(date);if (!date1) {System.out.println("日期格式输入错误,请重新输入");TSUtility.readReturn();} else {//获取借书时间java.sql.Date borrowDate1 = books.get(bId - 1).getBorrowDate();//得到相隔天数int day = daysBetween(borrowDate1, returnDate);//相隔天数//与可借天数对比计算逾期时间double money = 0;Reader reader = new ReaderDAOImp().selectReaderById(conn, readerId);if (day >= 0) {days = day - reader.getLimit();flagD = false;//获取罚金标准根据逾期时间计算罚金String typeName = reader.getTypeName();List<Fine> fines = new FineDaoImpl().selectAllFine(conn);for (Fine fine : fines) {if (typeName.equals(fine.getReaderTypeName())) {//罚金金额if (days <= 0) {System.out.println("您未逾期,感谢您保持良好的信用习惯。");money = 0;} else {money = days * fine.getFine();System.out.println("你已逾期" + days + "天" + ",需缴纳" + money + "元罚金!");}}}String stated = "已还";Date returnDatejiaoyan = null;BookBorrowAndReturn bbr = books.get(bId - 1);bbr.setReturnDate(new java.sql.Date(returnDate.getTime()));bbr.setFine(money);bbr.setState(stated);bbr.setReaderId(readerId);new BookBorrowAndReturnOperation().updateBorrow2(readerId, bookId, (java.sql.Date) returnDatejiaoyan, bbr);System.out.println("归还成功!");//归还成功后需返还读者可借数量Reader reader1 = new ReaderDAOImp().selectReaderById(conn, readerId);int Num = (reader.getMaxBorrowNum() + 1);reader1.setMaxBorrowNum(Num);new ReaderDAOImp().updateReaderById(conn, readerId, reader1);//返还图书库存数Book book = new BookDaoImpl().selectByISBN(conn, bookId);int printTime = (book.getPrintTime() + 1);book.setPrintTime(printTime);new BookDaoImpl().updateBook(conn, book, bookId);} else if (day < 0) {System.out.println("还书日期不能小于借书日期,请重新输入");TSUtility.readReturn();}}}}}}}}} catch (SQLException throwables) {throwables.printStackTrace();} finally {JDBCutils.closeResoureSelect(conn, null, null);}}

最后得到最深的感触是,做项目时一定先把说明文档清清楚楚的做好了,在进行程序的编写,只要有方向的去做,时间会节约,效率会提高,bug一直会存在,但这是最宝贵的经验。未来的日子加油!不负韶华!

图书管理系统(数据库)相关推荐

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

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

  2. ASP.NET MVC CODE FIRST 图书管理系统 数据库

    ASP .NET MVC CODE FIRST 图书管理系统 本项目最后更新于2018-7-4,可能会因为没有更新而失效.如已失效或需要修正,请提issue! 我使用VS2017进行开发,框架是.NE ...

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

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

  4. 图书管理系统 数据库课程实验设计

    本课设系软件工程大二学生作,拙笔狂言,恭请斧正. 开发工具:Eclipse 2020-12,Microsoft SQL server 2012 程序语言:Java 引 言 选题题目:图书管理系统 选题 ...

  5. 橘猫图书管理系统--数据库原理期末项目

    需求分析 图书馆作为文学的聚集地和展示平台,书籍是从古至今文化传递记载的介质.图书馆是高校不可缺少的基础设施,图书馆管理系统是图书馆正常运转的关键.此次数据库课程设计采用C++语言编写程序,实现图书登 ...

  6. Java web图书管理系统——数据库课程设计

    写了一个最基础的java web数据库课设,遵循三层架构. 后端:Java 前端:jsp + layui + echarts 数据库:mysql web容器:tomcat 操作系统:win10 IDE ...

  7. 图书管理系统 数据库实现(oracle)

    create tablespace library2 datafile 'E:\oracle\datafiles\library2.dbf' size 10M autoextend on; creat ...

  8. 图书管理系统的数据库设计

    一.实验目的 选用一种DBMS作为设计平台,理解并应用课程中关于数据库设计的相关理论,能按照数据库设计步骤完成完整的数据库设计,包括需求分析.概念设计.逻辑设计.物理设计和实施.同时能够正确应用各个阶 ...

  9. 数据库设计:SQL server 网上图书管理系统

    点击查看:数据库设计:SQL server 网上图书管理系统 文件大小:8.4M 操作系统:Windows10旗舰版 开发工具:SQL server 2016 开发语言:. sql 简要概述: SQL ...

  10. 图书管理系统之用户信息维护

    在上一期我们讲到了图书管理系统数据库的设计思路,这期我们就讲讲第一个模块的功能实现. 这一期就讲第一个模块:用户信息维护表格查询和数据新增. 表格查询如下: var layer, layuiTable ...

最新文章

  1. 【Web API系列教程】1.2 — Web API 2中的Action Results
  2. androidstudio集成ijkplayer教程
  3. TRIZ发明问题解决理论——本质是分析问题中的矛盾,利用资源(时间空间物质能量功能信息等)来解决矛盾从而解决问题——抽象出来:问题是什么,为什么?...
  4. Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】...
  5. webpack4.x加vue模板文件简单还原vue-cli
  6. Qt--基础图形绘制
  7. Linux允许61440端口,释放对某端口的占用
  8. 【Java】选择结构排坑指南
  9. ROS下多个kinect在一台电脑上同时运行
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的企业费用信息管理系统
  11. 谷歌将反欺诈系统绕过纳入漏洞奖励计划
  12. 酒店前台html,酒店前台常用英语单词
  13. 想自学python看哪位的视频比较好-Python入门视频看哪个好?适合初学者的教学视频推荐...
  14. ocr 超时小票识别_票总管-发票识别核验利器
  15. NYOJ--31 5个数求最值
  16. java 15道经典,15道非常经典的Java面试题
  17. jackson dataformat yaml简介及使用
  18. word图片靠右_word设置图片边缘透明的方法步骤
  19. 用javascript 判断IE窗口是否打开
  20. 【unity 保卫星城】--- 开发笔记05(普通子弹武器)

热门文章

  1. 腾讯C++程序员面试题
  2. Python tan函数图像绘制,不带有极值的线条
  3. 小黑课堂c语言题库,未来教育和小黑课堂哪个好 试卷题目是一样的吗
  4. 关于定时任务的时间表达式
  5. [iOS_Dev] 官方Mac OS X.dmg 下载,dmg 转 iso,Mac 镜像。
  6. .gpx文件转geojson
  7. 考研计算机专业课复试都有什么,2019计算机考研复试科目总结
  8. oracle常用函数详解(详细)
  9. 税盘怎么看服务器是否在维护,税盘服务器地址怎么查
  10. 移动边缘计算环境下边缘服务器放置方法研究