基于Java和Mysql的图书管理系统

Delicious

发布日期: 2020-03-08 20:25:01 浏览量: 225
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

一、设计题目

图书管理系统设计

二、问题描述

完成一个学校图书管理系统的设计,用户有以下需求:建立读者档案;建立图书档案;完成日常的图书检索、借还以及新书订购和系统维护工作。

三、需求分析

3.1 功能需求

3.1.1 读者档案

数据包括:借书证号、姓名、性别、专业,读者类型(不同读者类型具有不同的最多借书册数)、证件类型,证件号码,联系电话、办证日期、允许最多借书册数等。

实现办证、修改、注销、和读者信息检索(显示所有读者信息和按条件查询)等功能;

3.1.2 图书档案

数据包括:书号、书名、图书类别(不同图书类型具有不同的借阅天数)、可借天数、作者、出版单位、单价、藏书册数、书架编号、入库日期等。

实现对图书和图书类别的管理:包括图书的添加和修改功能,图书类型的添加和修改功能。

3.1.3 图书订阅

数据包括:图书编号、书名、作者、出版社、单价、订购日期、订购数量、操作员、是否验收等。

实现新书订购和验收新书功能。

3.1.4 借阅管理

图书借阅:根据借书证号判断该读者借书是否超出最大允许借书册数,是否有逾期未换的图书,满足借阅条件的进行借书登记,应记录借阅日期、应还日期,不满足借阅条件的给出提示信息。

图书归还:执行图书归还操作。

读者借阅搜索:对读者借阅记录进行检索。

3.1.5 系统维护

实现对管理员的添加和删除操作,以及修改密码的操作。

3.2 数据需求

需要管理员信息的数据、读者信息的数据、图书信息的数据,以及在借阅和归还图书过程中产生的借阅记录数据。

3.3 系统模块的划分

3.3.1 管理员用户登录

采用菜单形式,菜单项设计如下:

3.3.2 完成读者信息管理模块

3.3.3 完成图书信息管理模块

3.3.4 完成借阅管理模块

四、概念模型的设计 (E/R图设计)

4.1 E-R图

4.2 属性的说明

关于各个实体的属性的特性的说明

Admini

属性名 属性的类型 长度 属性的约束等说明 属性的特性说明
教职工号 char 6 主键,不为空 6位都是0-9的数字
姓名 Varchar 20
性别 Char 2 男或女
账号 int 唯一 账号>99999 账号<1000000
密码 Varchar 10
联系电话 varchar 15

属性名 属性的类型 长度 属性的约束等说明 属性的特性说明
图书编号 Char 14 主键,不为空 14位都是0-9的数字
图书名称 Varchar 20
出版社 Varchar 30
作者 Varchar 10
单价 Float 单价>0
藏书册数 Int 藏书册数>0
书架编号 Char 2 2位0-9的数字
入库日期 Datetime

图书类别

属性名 属性的类型 长度 属性的约束等说明 属性的特性说明
类别编号 Char 2 主键,不为空 2位都是0-9的数字
类别名称 Varchar 20 唯一
可借天数 Int 唯一 可借天数>0

读者信息

属性名 属性的类型 长度 属性的约束等说明 属性的特性说明
借书证号 Char 6 主键,唯一不为空 6位都是0-9的数字
姓名 Varchar 10
性别 Char 2 男或女
专业 Varchar 20
证件类型 Varchar 20
证件号码 Varchar 15
联系电话 Varchar 15
办证日期 Datetime
借阅册数 Int 借阅册数>=0

读者类型

属性名 属性的类型 长度 属性的约束等说明 属性的特性说明
借书证号 Char 6 主键,唯一不为空 6位都是0-9的数字
读者类型 Varchar 10
允许最多借书册数 Int 允许最多借书册数>0

4.3 依赖关系说明

  • 书所属类别表,borrow_relationship表中的图书编号依赖书表中的图书编号

  • 读者类型表,borrow_relationship表,借阅记录表中的借书证号依赖读者信息表中的借书证号

  • 解约记录表中的管理员编号依赖admini表中的教职工号

  • 图书所属类别表中的类别编号依赖图书类别中的类别编号

五、关系模型的逻辑设计

5.1 完整的关系图

5.2 关系的模式描述

图书所属类别

  • 函数依赖:图书编号依赖书表中的图书编号,类别编号依赖图书类别中的类别编号

  • 范式级别:第二范式

属性名 属性的描述 属性的类型 约束 备注
图书编号 14位 char 参照书表
类别编号 2位 char 参照图书类别
可借天数 不同类别不同 Int 可借天数 >0

借阅关系

  • 函数依赖:借阅证号依赖读者信息表中的借阅证号,图书编号依赖书表中的图书编号

  • 范式级别:第二范式

属性名 属性的描述 属性的类型 约束 备注
图书编号 14位 char 参照书表
借书证号 6位 char 参照读者信息表

六、关系数据库创建

6.1 数据库物理模型的设计

数据文件的文件名:BookManagePro

日志物理文件的文件名:BookManagePro_log

建立数据库的T-SQL语句

  1. create database BookMangePro
  2. go

建立关系模型的T-SQL语句

  1. create table admini
  2. (
  3. 教职工号 char(6) not null primary key check(教职工号 like'[0-9][0-9][0-9][0-9][0-9][0-9]') ,
  4. 姓名 varchar(20),
  5. 性别 char(2) check(性别 ='男' or 性别='女'),
  6. 账号 int check(账号>99999 and 账号<1000000) unique ,
  7. 密码 varchar(10),
  8. 联系电话 varchar(15)
  9. );
  10. create table
  11. (
  12. 图书编号 char(14)not null primary key check(图书编号 like'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),
  13. 图书名称 varchar(20),
  14. 出版社 varchar(30),
  15. 作者 varchar(10),
  16. 单价 float,check (单价>0),
  17. 藏书册数 int,check (藏书册数>0),
  18. 书架编号 char(2) check(书架编号 like'[0-9][0-9]'),
  19. 入库日期 datetime
  20. );
  21. create table 图书类别
  22. (
  23. 类别编号 char(2) not null primary key check(类别编号 like'[0-9][0-9]'),
  24. 类别名称 varchar(20) unique,
  25. 可借天数 int check(可借天数 >0) unique
  26. );
  27. create table 图书所属类别
  28. (
  29. 图书编号 char(14) not null primary key references 书(图书编号),
  30. 类别编号 char(2) references 图书类别(类别编号),
  31. 可借天数 int,check(可借天数 >0)
  32. );
  33. create table 读者信息
  34. (
  35. 借书证号 char(6)not null primary key check(借书证号 like'[0-9][0-9][0-9][0-9][0-9][0-9]'),
  36. 姓名 varchar(10),
  37. 性别 char (2) check(性别 ='男' or 性别='女'),
  38. 专业 varchar(20),
  39. 证件类型 varchar(20),
  40. 证件号码 varchar(15),
  41. 联系电话 varchar(15),
  42. 办证日期 datetime ,
  43. 借阅册数 int,check(借阅册数>0)
  44. );
  45. create table 读者类型(
  46. 借书证号 char(6)not null primary key references 读者信息(借书证号),
  47. 读者类型 varchar(10),
  48. 允许最多借书册数 int,check(允许最多借书册数>0)
  49. );
  50. create table 借阅记录
  51. (
  52. 借书证号 char(6) references 读者信息(借书证号),
  53. 图书编号 varchar(14),
  54. 借阅日期 datetime,
  55. 应还日期 datetime,
  56. 归还日期 datetime,
  57. 管理员编号 char(6)references admini(教职工号),
  58. primary key(借书证号,图书编号,借阅日期)
  59. );
  60. create table borrow_relationship
  61. (
  62. 借书证号 char(6) references 读者信息(借书证号),
  63. 图书编号 char(14) references 书(图书编号),
  64. primary key(借书证号,图书编号)
  65. );
  66. insert into admini values('000000','斌','男',666666,'bin','151****9377')
  67. insert into admini values('000001','罗','男',888888,'luo','173****5269')

七、视图的设计

7.1 用户角色

用户角色为图书馆管理员,管理员操作本系统实现一系列功能。

7.2 功能模块

读者信息修改、、图书信息查询、图书信息修改图书借阅、读者借阅记录查询这几个功能模块需要用到视图方便操作。

7.3 用户视图的需求

需要所有图书信息的视图、可借图书信息的视图、读者借阅图书信息的视图、读者所有信息的视图。

所有图书信息的视图

  1. create view bookifo
  2. as
  3. (
  4. select a.图书编号,图书名称,类别名称,b.可借天数,c.类别编号,出版社,作者,单价,书架编号,入库日期
  5. from a,图书所属类别 b,图书类别 c
  6. where a.图书编号=b.图书编号 and c.类别编号=b.类别编号
  7. )

可借图书信息的视图

  1. create view loanable_book
  2. as
  3. select 书.图书编号,书.图书名称,书.出版社,类别名称,书.作者,书.单价,书.藏书册数,书.书架编号,书.入库日期,图书所属类别.可借天数
  4. from 书,图书所属类别,图书类别
  5. where 书.图书编号=图书所属类别.图书编号 and 图书类别.类别编号=图书所属类别.类别编号
  6. and 书.图书编号 not in(select borrow_relationship.图书编号 from borrow_relationship)

读者借阅图书信息的视图

  1. create view bookborrow
  2. as
  3. select 读者信息.借书证号,姓名,允许最多借书册数,书.图书编号,书.图书名称,借阅日期,应还日期,归还日期
  4. from 读者类型 ,读者信息,书,借阅记录
  5. where 读者信息.借书证号=读者类型.借书证号 and 读者信息.借书证号=借阅记录.借书证号 and 书.图书编号=借阅记录.图书编号

读者所有信息的视图

  1. create view reader
  2. as
  3. select 读者信息.借书证号,姓名,性别,专业,证件类型,证件号码,联系电话,办证日期,借阅册数,读者类型,允许最多借书册数
  4. from 读者信息,读者类型
  5. where 读者信息.借书证号=读者类型.借书证号

八、存储过程/触发器的建立

没有使用到存储过程与自建的触发器。

九、系统实现

9.1 系统功能结构框架图

9.2 功能模块实现

9.2.1 管理员注册模块

实现了普通管理员和超级管理员的登录,输入正确的账号密码即可登陆到主界面。并且可用键盘的回车键直接登陆;注册按钮可以进到普通管理员的注册界面;重置按钮可以清空已经输入的账号和密码内容。

该界面是通过继承JFrame利用windowsbulider插件进行合理的布局完成的。

键盘的监听,实际是对文本域的监听:

  1. KeyListener key_Listener = new KeyListener()
  2. {
  3. public void keyTyped(KeyEvent e) {}
  4. public void keyReleased(KeyEvent e){}
  5. public void keyPressed(KeyEvent e){
  6. if(e.getKeyChar() == KeyEvent.VK_ENTER )
  7. {
  8. enterloginActionPerformed(e);//键盘监听,按回车进入主界面,可与鼠标点击同时使用
  9. }
  10. }
  11. };
  12. userNameTxt.addKeyListener(key_Listener); passwordTxt.addKeyListener(key_Listener);

登录的sql操作方法

  1. public Admini login(Connection con,Admini admin)throws SQLException{
  2. Admini ad1=null;
  3. String sql = "select * from Admini where 账号=? and 密码=?";
  4. PreparedStatement pstmt = (PreparedStatement) con.prepareStatement(sql);
  5. pstmt.setInt(1,admin.getAccnumber());
  6. pstmt.setString(2,admin.getPassword());
  7. ResultSet rs = pstmt.executeQuery();
  8. if(rs.next()){
  9. ad1 = new Admini();
  10. ad1.setAccnumber(rs.getInt("账号"));
  11. ad1.setPassword(rs.getString("密码"));
  12. }
  13. return ad1;
  14. }

9.2.2 管理员登录模块

通过输入一系列的信息,进行普通管理员的注册,注册普通管理员时必须输入超级管理员的账号和密码,这样即表示只有在超管的允许下才可以注册普通管理员。不能随便一个人就可以注册。点击确认按钮即可注册,清空按钮可清空所有已填信息,返回按钮可返回到登录界面。

该界面是通过继承JFrame通过windowsbulider插件进行合理的布局完成的。

注册的sql 操作方法,通过传入一个连接数据库的参数,以及Admini类的一个对象,方法内写入相应的sql语句。

  1. public int register(Connection con,Admini admin)throws SQLException{
  2. String sql="insert into Admini"+"(教职工号,姓名,性别,账号,密码,联系电话)"+"values(?,?,?,?,?,?)";
  3. PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql);
  4. pstmt.setString(1, admin.getTeanumber());
  5. pstmt.setString(2, admin.getName());
  6. pstmt.setString(3, admin.getSex());
  7. pstmt.setInt(4, admin.getAccnumber());
  8. pstmt.setString(5, admin.getPassword());
  9. pstmt.setString(6, admin.getPhone());
  10. return pstmt.executeUpdate();
  11. }

9.2.3 读者信息添加模块

通过输入读者的相关信息(不可输入的办证日期和最多借书都是系统自动生成),点击确认按钮从而完成一个新读者的信息的添加。若点击清空按钮即可清空已填入的读者信息。

该界面实在主界面的基础上继承JInternalframe实现的主界面下的子界面,同样是通过windowbulider插件进行合理的布局完成的。

两个add方法,分别插入数据库的两个表,只有两个方法返回都为一条记录是,才算插入数据库成功,即添加一位新的读者信息成功。

  1. public int add1(Connection con,Readertype readertype)throws SQLException{
  2. String sql="insert into 读者类型"+"(借书证号,读者类型,允许最多借书册数)"+"values(?,?,?)";
  3. PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql); pstmt.setString(1,readertype.getReadernumber());
  4. pstmt.setString(2,readertype.getReadertype());
  5. pstmt.setInt(3,readertype.getMax_borrownumber());
  6. return pstmt.executeUpdate();
  7. }
  8. public int add2(Connection con,Reader reader)throws Exception{
  9. Date date = new Date();
  10. Timestamp dateStr =new java.sql.Timestamp(System.currentTimeMillis());
  11. String sql="insert into 读者信息"+"(借书证号,姓名,性别,专业,证件类型,证件号码,联系电话,办证日期)"+"values(?,?,?,?,?,?,?,?)";
  12. PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql);
  13. pstmt.setString(1,reader.getReadnumber());
  14. pstmt.setString(2,reader.getName());
  15. pstmt.setString(3,reader.getSex());
  16. pstmt.setString(4,reader.getMajor());
  17. pstmt.setString(5,reader.getDocumenttype());
  18. pstmt.setString(6,reader.getDocumentnumber());
  19. pstmt.setString(7,reader.getPhone());
  20. pstmt.setTimestamp(8,dateStr);
  21. return pstmt.executeUpdate();
  22. }

9.2.4 读者信息维护模块

在搜索条件是空时,将会显示所有的读者的信息,点击每一条,下方各个文本域就会显示该读者的所有信息,供管理员修改或删除,不可编辑的文本域即为不可修改,修改信息时先编辑文本域以及下拉框的内容,修改的信息都写好后,点击修改按钮即刻修改读者的信息。点击删除按钮即可删除该读者的所有信息。搜索时只要输入借书证号的个别位即可,支持模糊查询。

该界面实在主界面的基础上继承JInternalframe实现的主界面下的子界面,同样是通过windowbulider插件进行合理的布局完成的。

list方法是查询的函数,返回一个结果集,从而将数据库的读者信息显示到界面上。两个delete方法是删除数据库中两个表中选中的读者信息,先删除后建立的表,再删除先建立的表,顺序不能乱。两个update方法是修改数据库的读者信息,然后再显示到界面上。

  1. public ResultSet list(Connection con,Reader reader,Readertype readertype)throws Exception{
  2. StringBuffer sb = new StringBuffer("select * from reader");
  3. if(StringUtil.isNotEmpty(reader.getReadnumber())) {
  4. sb.append(" where 借书证号 like '%"+reader.getReadnumber()+"%'");
  5. }
  6. PreparedStatement pst =con.prepareStatement(sb.toString());
  7. return pst.executeQuery();
  8. }
  9. public int update2(Connection con,Readertype readertype)throws Exception{
  10. String sql="update 读者类型 set 读者类型=?,允许最多借书册数=? where 借书证号=?";
  11. PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql);
  12. pstmt.setString(1, readertype.getReadertype());
  13. pstmt.setInt(2, readertype.getMax_borrownumber());
  14. pstmt.setString(3, readertype.getReadernumber());
  15. return pstmt.executeUpdate();
  16. }
  17. public int update1(Connection con,Reader reader)throws Exception{
  18. String sql="update 读者信息 set 姓名=?,性别=?,专业=?,证件类型=?,证件号码=?,联系电话=?,办证日期=? where 借书证号=?";
  19. PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql);
  20. pstmt.setString(1, reader.getName());
  21. pstmt.setString(2, reader.getSex());
  22. pstmt.setString(3, reader.getMajor());
  23. pstmt.setString(4, reader.getDocumenttype());
  24. pstmt.setString(5, reader.getDocumentnumber());
  25. pstmt.setString(6, reader.getPhone());
  26. pstmt.setString(7, reader.getReadertime());
  27. pstmt.setString (8, reader.getReadnumber());
  28. return pstmt.executeUpdate();
  29. }
  30. public int delete1(Connection con,Reader reader)throws Exception{
  31. String sql="delete from 读者信息 where 借书证号=?";
  32. PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql);
  33. pstmt.setString(1, reader.getReadnumber());
  34. return pstmt.executeUpdate();
  35. }
  36. public int delete2(Connection con,Readertype readertype)throws Exception{
  37. String sql="delete from 读者类型 where 借书证号=?";
  38. PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql);
  39. pstmt.setString(1, readertype.getReadernumber());
  40. return pstmt.executeUpdate();
  41. }

9.2.5 图书类别添加模块

通过输入信息,完成对新类别的添加,每个类别的可借天数和编码都是不一样的,点击添加按钮即可加入一个新的图书类别,重置按钮可清空已填的所有信息。

该界面实在主界面的基础上继承JInternalframe实现的主界面下的子界面,同样是通过windowbulider插件进行合理的布局完成的。

  1. public int add(Connection con,BookType bookType)throws Exception{
  2. //操作的记录数,影响的记录条数
  3. String sql="insert into 图书类别 values(?,?,?)";
  4. PreparedStatement pstmt = con.prepareStatement(sql);
  5. pstmt.setString(1, bookType.getId());
  6. pstmt.setString(2, bookType.getBookTypeName());
  7. pstmt.setInt(3, bookType.getTypeday());
  8. //执行,返回影响的记录条数
  9. return pstmt.executeUpdate();
  10. }

9.2.6 图书类别管理模块

通过数图书类别名称从而搜索该类别的信息(支持模糊查询),搜索条件为空时显示所有的类别的信息。点击表单的没一个类别的信息,即可将信息显示在下方文本域,可供管理员进行类别的修改和删除(不可编辑的文本框即为不可修改的内容)。

该界面实在主界面的基础上继承JInternalframe实现的主界面下的子界面,同样是通过windowbulider插件进行合理的布局完成的。

  1. public ResultSet list(Connection con,BookType bookType)throws Exception{
  2. StringBuffer sb = new StringBuffer("select * from 图书类别");
  3. if(StringUtil.isNotEmpty(bookType.getBookTypeName())) {
  4. sb.append(" and 类别名称 like '%"+bookType.getBookTypeName()+"%'");
  5. }
  6. //把第一个and换成where
  7. PreparedStatement pst =con.prepareStatement(sb.toString().replace("and", "where"));
  8. return pst.executeQuery();
  9. }
  10. public int delete(Connection con,String id)throws Exception{
  11. String sql="delete from 图书类别 where 类别编号=?";
  12. PreparedStatement pstmt = con.prepareStatement(sql);
  13. pstmt.setString(1, id);
  14. return pstmt.executeUpdate();
  15. }
  16. public int update(Connection con,BookType bookType)throws Exception{
  17. String sql="update 图书类别 set 类别名称=?,可借天数=? where 类别编号=?";
  18. PreparedStatement pstmt = con.prepareStatement(sql);
  19. pstmt.setString(1, bookType.getBookTypeName());
  20. pstmt.setInt(2,bookType.getTypeday());
  21. pstmt.setString(3, bookType.getId());
  22. return pstmt.executeUpdate();
  23. }

9.2.7 添加模块

图书编号是当前的系统的时间,一共十四位,精确到秒,在填入图书信息后,根据藏书册数借助线程暂停的方法有延迟的连续添加相应的本数,这样可使图书编号唯一,入库日期也是当前系统时间。重置按钮可重置所有填入的图书信息。

该界面实在主界面的基础上继承JInternalframe实现的主界面下的子界面,同样是通过windowbulider插件进行合理的布局完成的。

  1. public int add(Connection con,Book book)throws SQLException{
  2. Book bk1=null;
  3. String sql = "insert into 书 values(?,?,?,?,?,?,?,?)";
  4. PreparedStatement pstmt = (PreparedStatement) con.prepareStatement(sql);
  5. pstmt.setString(1,book.getBookid());
  6. pstmt.setString(2,book.getBookname());
  7. pstmt.setString(3,book.getBookpublish());
  8. pstmt.setString(4,book.getAuthor());
  9. pstmt.setFloat(5, book.getPrice());
  10. pstmt.setInt(6,book.getNumber());
  11. pstmt.setString(7,book.getShelfnum());
  12. pstmt.setTimestamp(8,book.getArrivedate());
  13. return pstmt.executeUpdate();
  14. }

9.2.8 图书信息修改删除模块

通过图书编号 图书名称 作者 出版社 图书类别都可以模糊查询图书的信息,若搜索条件为空时,将会显示所有的图书信息。选择一条信息,该图书信息将会在下方的文本域显示,供管理员修改和删除。

该界面实在主界面的基础上继承JInternalframe实现的主界面下的子界面,同样是通过windowbulider插件进行合理的布局完成的。

  1. public ResultSet list(Connection con,Book book)throws Exception{
  2. StringBuffer sb=new StringBuffer("select 图书编号,图书名称,类别名称,出版社,作者,单价,书架编号,入库日期" + " from bookifo");
  3. if(StringUtil.isNotEmpty(book.getBookid())){
  4. sb.append(" and 图书编号 like '%"+book.getBookid()+"%'");
  5. }
  6. if(StringUtil.isNotEmpty(book.getBookname())){
  7. sb.append(" and 图书名称 like '%"+book.getBookname()+"%'");
  8. }
  9. if(StringUtil.isNotEmpty(book.getAuthor())){
  10. sb.append(" and 作者 like '%"+book.getAuthor()+"%'");
  11. }
  12. if(StringUtil.isNotEmpty(book.getBookpublish())){
  13. sb.append(" and 出版社 like '%"+book.getBookpublish()+"%'");
  14. }
  15. if(StringUtil.isNotEmpty(book.getType())){
  16. sb.append(" and 类别名称 like '%"+book.getType()+"%'");
  17. }
  18. PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sb.toString().replaceFirst("and", "where"));
  19. return pstmt.executeQuery();
  20. }
  21. public int delete(Connection con,String id)throws Exception{
  22. //关联删除,同时删除书表和图书所属类别表中的所有信息
  23. String sql="delete from 图书所属类别 where 图书编号 =?;delete from 书 where 图书编号 =?";
  24. PreparedStatement pstmt=con.prepareStatement(sql);
  25. pstmt.setString(1,id);
  26. pstmt.setString(2,id);
  27. return pstmt.executeUpdate();
  28. }
  29. public int update(Connection con,Book book,BookType booktype)throws Exception{
  30. String sql="update 书 set 图书名称=?,出版社=?,作者=?,单价=?,书架编号=? where 图书编号=?;" + "update 图书所属类别 set 类别编号=?,可借天数=? where 图书编号=?";
  31. PreparedStatement pstmt=con.prepareStatement(sql);
  32. pstmt.setString(1,book.getBookname());
  33. pstmt.setString(2,book.getBookpublish());
  34. pstmt.setString(3,book.getAuthor());
  35. pstmt.setFloat(4, book.getPrice());
  36. pstmt.setString(5,book.getShelfnum()); //书架编号,两位字符
  37. pstmt.setString(6,book.getBookid());
  38. pstmt.setString(7,booktype.getId());
  39. pstmt.setInt(8,booktype.getTypeday());
  40. pstmt.setString(9,book.getBookid());
  41. return pstmt.executeUpdate();
  42. }
  43. public int update(Connection con,Book book,BookType bookType)throws Exception{
  44. String sql="update 图书所属类别 set 类别编号=?,可借天数=? where 图书编号=?";
  45. PreparedStatement pstmt = con.prepareStatement(sql);
  46. pstmt.setString(1, bookType.getBookTypeName());
  47. pstmt.setInt(2,bookType.getTypeday());
  48. pstmt.setString(3, book.getBookid());
  49. return pstmt.executeUpdate();
  50. }
  51. public int delete(Connection con,Book book)throws Exception{
  52. String sql="delete from 图书所属类别 where 图书编号=?";
  53. PreparedStatement pstmt = con.prepareStatement(sql);
  54. pstmt.setString(1, book.getBookid());
  55. return pstmt.executeUpdate();
  56. }

9.2.9 图书借阅模块

通过图书编号 图书名称 作者 出版社 图书类别都可以模糊查询图书的信息,若搜索条件为空时,将会显示所有的图书信息。点击该图书信息,即可在下方表格显示该图书的编号,在手动输入借书证号以及操作管理员的教职工号,即可进行借书。应还日期和借阅日期都会自动生成。

该界面实在主界面的基础上继承JInternalframe实现的主界面下的子界面,同样是通过windowbulider插件进行合理的布局完成的。

  1. public int borrowbook(Connection con,Book book,String readerid,String adminid) throws SQLException{
  2. String sql ="insert into 借阅记录 (借书证号,图书编号,借阅日期,应还日期,管理员编号)values(?,?,?,?,?);" + "insert into borrow_relationship values(?,?)";
  3. PreparedStatement pstmt = (PreparedStatement) con.prepareStatement(sql);
  4. Timestamp nowtime =new java.sql.Timestamp(System.currentTimeMillis());
  5. pstmt.setString(1,readerid);
  6. pstmt.setString(2,book.getBookid());
  7. pstmt.setTimestamp(3,nowtime); //借阅日期
  8. pstmt.setTimestamp(4,plusDay2(book.getTypeday())); //应还日期,sql设置时间戳
  9. pstmt.setString(5,adminid);
  10. pstmt.setString(6,readerid);
  11. pstmt.setString(7,book.getBookid());
  12. return pstmt.executeUpdate();
  13. }

9.2.10 图书归还模块

输入要归还的图书编号,点击归还按钮,即可归还图书。

该界面实在主界面的基础上继承JInternalframe实现的主界面下的子界面,同样是通过windowbulider插件进行合理的布局完成的。

  1. public int returnbook(Connection con,Book book) throws SQLException{
  2. String sql ="update 借阅记录 set 归还日期=? where 图书编号=? and 归还日期 is null;" + "delete from borrow_relationship where 图书编号=?";
  3. PreparedStatement pstmt = (PreparedStatement) con.prepareStatement(sql);
  4. Timestamp nowtime =new java.sql.Timestamp(System.currentTimeMillis());
  5. pstmt.setTimestamp(1,nowtime); //当前归还日期,sql设置时间戳
  6. pstmt.setString(2,book.getBookid()); //加借阅日期限制不行
  7. pstmt.setString(3,book.getBookid());
  8. return pstmt.executeUpdate();
  9. }

9.2.11 图书借阅信息搜索

通过对借书证号的搜索(支持模糊查询),搜索想要查询的读者的借书记录,若搜索条件为空,则显示所有的读者的借阅记录。

该界面实在主界面的基础上继承JInternalframe实现的主界面下的子界面,同样是通过windowbulider插件进行合理的布局完成的。

  1. public ResultSet list(Connection con,Reader reader,Book book,Readertype readertype)throws Exception{
  2. StringBuffer sb = new StringBuffer("select * from bookborrow"); if(StringUtil.isNotEmpty(reader.getReadnumber())) {
  3. sb.append(" where 借书证号 like '%"+reader.getReadnumber()+"%'");
  4. }
  5. PreparedStatement pst =con.prepareStatement(sb.toString());
  6. return pst.executeQuery();
  7. }

9.2.12 系统维护模块(只有超级管理员登录的界面才有)

通过输入管理员的教职工号进行查询(可支持模糊查询),即可在下方表格显示查询的普通管理员信息,点击信息,将会显示在下方的文本域内,可供超级管理员修改删除普通管理员的信息。

该界面实在主界面的基础上继承JInternalframe实现的主界面下的子界面,同样是通过windowbulider插件进行合理的布局完成的。

  1. public int update(Connection con,Admini admini)throws Exception{
  2. String sql="" +"update admini set 姓名=?,性别=?,密码=?,联系电话=? where 教职工号=? and 账号=?";
  3. PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql);
  4. pstmt.setString(1, admini.getName());
  5. pstmt.setString(2, admini.getSex());
  6. pstmt.setString(3, admini.getPassword());
  7. pstmt.setString(4, admini.getPhone());
  8. pstmt.setString(5, admini.getTeanumber());
  9. pstmt.setInt(6, admini.getAccnumber());
  10. return pstmt.executeUpdate();
  11. }
  12. public int delete(Connection con ,Admini admini)throws Exception{
  13. String sql="delete from admini where 教职工号=?";
  14. PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql);
  15. pstmt.setString(1, admini.getTeanumber());
  16. return pstmt.executeUpdate();
  17. }
  18. public ResultSet list(Connection con,Admini admini)throws Exception{
  19. StringBuffer sb = new StringBuffer("select * from admini where 账号<>666666 and 账号<>888888");
  20. if(StringUtil.isNotEmpty(admini.getTeanumber())) {
  21. sb.append(" where 教职工号 like '%"+admini.getTeanumber()+"%'");
  22. }
  23. PreparedStatement pst =con.prepareStatement(sb.toString());
  24. return pst.executeQuery();
  25. }

十、设计总结

在设计的过程中我们先后遇到了数据库设计,JDBC数据可访问,Java图形用户界面实现,数据库实现借还书sql语句如何书写等一系列问题。

我们解决数据库设计问题的方法是两人共同商量探讨,先给出数据库关系模型的1.0版本,在经过不断的推理论证,在结合实际的测试操作,不断更新迭代多次,最终形成健壮可靠的数据库关系模型。

解决JDBC数据库访问的方法是先在本地sql server服务器上进行操作实验,后来发现组员南绍斌电脑上没有安装数据库,结合两个人连接一个数据库会很不方便,于是我想到了在我自己的云主机上架设数据库,这样就可以两个人同时使用云主机上的数据库,经过一系列操作结合网上的资料,这一大胆的设想变成了现实,从而解决了这个问题。

在Java图形用户界面方面,由于我们之前都没有接触过,所以这方面显得很欠缺,于是我们广泛收集资料,找寻到了一些目前比较前沿并且很方便操作的技术windowbuilder插件制作GUI,我们于是从零开始学习如何使用该插件,一步一个脚印,最终成功解决了GUI的问题。

最容易出现问题的还是JavaDAO中的SQL语句的问题,因为它需要的思维逻辑性很强,并且错误不容易被发现,我们只能一边用eclipse调试程序,一边用与主机上的数据库测试SQL语句,在不断的测试与改正之后,最终我们成功的解决了这个问题。

通过做数据库课程设计,巩固了数据库和Java的知识,还在实践的过程当中学习到了许多课本上没有的知识,提高了我们的动手能力,和程序设计实现能力,以及团队协作配合的能力。

上传的附件 cloud_download 基于Java和Mysql的图书管理系统.7z ( 5.22mb, 8次下载 )
error_outline 下载需要16点积分

发送私信

1
文章数
1
评论数
最近文章
eject