文章目录
项目:图书借阅系统
子项目:需求分析
图书借阅系统有以下四大模块:读者信息管理、图书信息管理、图书借阅管理、用户信息管理、类型信息管理,我们接下来对每一模块的具体功能进行分析需求。
第一模块:图书信息管理
图书信息管理是图书借阅系统最核心的功能,因为图书是最关键的要素, 在系统中有着所有图书的相关信息。
图书增、删、改、查功能
首先我们得能知道系统中有什么书,这本书的相关信息,知道了图书的信息这样我们才能根据读者的需求借书,所以这一模块就需要一个图书查询功能。查询要能查询所有书籍的关键信息,同时也能在知道了书名或者书的ISBN进行指定查找。
如果图书馆新进了一批书籍,我们得把这些书籍给登记进入系统中,这里模块就需要一个图书信息增加功能,我们需要输入图书的关键信息然后添加信息到我们的后台系统中。
如果输入的图书信息有误,我们需要一个图书信息修改功能,如果有的图书被读者弄丢了,最后我们要把这本书的记录在图书系统中删除,所以需要一个图书删除功能。
第二模块:读者信息管理
图书借阅系统中读者信息也是很重要的,我们需要对读者的信息进行操作。
如果是第一次来借书,那么必须要在系统中创建读者信息, 在根据读者id进行借阅书籍,所以需要一个读者信息增加功能。系统管理员给长期不借阅书籍的读者注销读者用户,需要读者信息删除功能。系统管理员要知道当前读者的所有信息或者指定信息,此模块需要一个查询读者信息的功能,还包括查询所有和根据id指定查询。
第三模块:类型信息管理
读者类型信息管理
我们借阅书籍,因为读者的身份或者类别不同,读者借阅书籍肯定有不同的规则,参照一般大学图书馆的规则,学生能最多借3本书,3个月内归还,老师最多能借5本书,5个月内归还,所以因为读者身份不同借阅书籍的规则也不同,所以我们要对读者类型信息进行分类,用户可以对读者的类型信息进行增删改查操作。
图书类型信息管理
与之对应的图书类别信息也是如此,真正图书系统中书籍一定是很多的,所以分类就很有必要,所以我们也要对书籍的类别进行管理,对书籍的类别信息进行增删改查操作。
第四模块:借阅信息管理
图书借阅与归还也是系统中较为关键的业务,读者需要根据自己的需求借阅自己想要阅读的图书,此时就需要图书的借阅功能,功能展开,我们需要最为关键的读者信息、借阅的图书信息,以及借书的日期,然后增加到借书的数据库中。
当读者阅读完这本书或者到达了阅读的最长期限,用户必须要归还图书,当前模块需要一个归还功能,根据借阅图书的ISBN或者图书id进行归还,具体就是在借阅的书籍列表中进行删除,把书籍的借阅信息删除。
我们同时也会在借阅和归还的面板中加入显示所有借阅书籍的功能,让读者知道那本书被借阅了,书被借走了没法再借了(默认系统中每本书只有一本)。这里就需要一个查询功能,直接查询数据库中所有被借阅的图书信息以及相关的读者信息。
第五模块:用户信息管理
用户信息对于图书系统是至关重要的,为什么重要呢?它关乎与我们是否能够成功登入该系统中。首先登陆需要一个具体的登录功能,用户输入用户名跟或者密码,然后程序在后台中查询数据库进行比对操作,比对成功才能登入
如果用户第一次登陆,那么没有注册用户名,需要我们设置一个注册功能,就是添加用户操作,用户自己设置用户名和密码(前提:不能和数据库中的用户名一致),增加成功我们就用此用户的信息进行登陆操作。如果该用户想要修改密码,那么就需要写一个修改密码的功能,先输入原密码,然后输入新密码,最后确认新密码。
如果系统管理员想要删除某个用户(长期不登录,或者登陆异常)的用户信息,那么就需要在后台中写一个删除用户的功能,根据用户名进行删除(前提:数据库中对应字段设为唯一)。同时系统管理员想要查找用户的信息,需要写一个查询功能进行查询所有。
子项目:数据库设计
图书信息表用于存储图书基本信息,如表1所示
数据库中具体的表相关信息
图书类别信息表用于存储图书类别基本信息,如表2所示
数据库中具体的表相关信息
读者信息表用于存储读者基本信息,如表3所示
数据库中具体的表相关信息
读者类别信息表用于存储读者基本信息,如表4所示
数据库中具体的表相关信息
借阅图书信息表用于存储借阅的图书关键信息,如表5所示
数据库中具体的表相关信息
用户表用于存储系统中的用户信息,如表6所示
数据库中具体的表相关信息
子项目:图书借阅系统中类的应用
数据库操作具体表相关的类,如图7所示
具体表中数据对应的实体类(pojo),如图8所示
Swing实现的Java可视化界面相关的类,如图9所示
实现前端界面与后端数据交互的类(事件),如图10 所示
子项目:图书借阅系统界面设计与实现
1、创建登录界面
用户在文本框中输入用户名和密码,成功登录后进入图书系统的主界面,如图11所示
packagecom.bbm.staticview;importjavax.swing.*;publicclassLoginextendsJFrame{privateJPanel myPanel;privateJLabel labName,labPassword;privateJTextField txtName;privateJPasswordField txtPassword;privateJButton btnConfirm,btnReset;publicLogin(String name){super(name);//框架类设标题setSize(250,150);setLocationRelativeTo(null);
myPanel=newJPanel();setContentPane(myPanel);
labName=newJLabel("用户名:");
labPassword=newJLabel("密 码:");
txtName=newJTextField(12);
txtPassword=newJPasswordField(12);
txtPassword.setEchoChar('*');
btnConfirm=newJButton("登录");
btnReset=newJButton("重置");
myPanel.add(labName);
myPanel.add(txtName);
myPanel.add(labPassword);
myPanel.add(txtPassword);
myPanel.add(btnConfirm);
myPanel.add(btnReset);setVisible(true);}publicstaticvoidmain(String[] args){// TODO Auto-generated method stubnewLogin("登录");}}
2、创建图书增加界面
输入对应标签的信息,点击添加,成功增加一条图书信息
packagecom.bbm.staticview;importjava.awt.BorderLayout;importjava.awt.GridLayout;importjavax.swing.*;publicclassBookAddextendsJFrame{privateJPanel panel,bookPanel,btnPanel;privateJLabel labISBN,labType,labName,labAuthor,
labPublish,labPublishDate,labPrice;privateJTextField txtISBN,txtName,txtAuthor,
txtPublish,txtPublishDate,txtPrice;JComboBox cmbBookType;//组合框privateJButton btnAdd,btnReset,btnExit;publicBookAdd(String s){super(s);setSize(400,200);setLocationRelativeTo(null);
panel=newJPanel(newBorderLayout());setContentPane(panel);//图书面板的信息GridLayout grid1=newGridLayout(4,4);//网格布局
grid1.setHgap(5);
grid1.setVgap(5);
bookPanel=newJPanel(grid1);
labISBN=newJLabel("ISBN:");
labISBN.setHorizontalAlignment(SwingConstants.CENTER);//居中
txtISBN=newJTextField(15);
labType=newJLabel("图书类别:");
cmbBookType=newJComboBox();
cmbBookType.addItem("计算机类");
cmbBookType.addItem("外语类");
labName=newJLabel("书名:");
txtName=newJTextField(12);
labAuthor=newJLabel("作者");
txtAuthor=newJTextField(12);
labPublish=newJLabel("出版社");
txtPublish=newJTextField();
labPublishDate=newJLabel("出版日期");
txtPublishDate=newJTextField(12);
labPrice=newJLabel("价格");
txtPrice=newJTextField(12);//其余类似,作者,出版社,出版社日期,价格,课后大家补充。
bookPanel.add(labISBN);
bookPanel.add(txtISBN);
bookPanel.add(labType);
bookPanel.add(cmbBookType);
bookPanel.add(labName);
bookPanel.add(txtName);
bookPanel.add(labAuthor);
bookPanel.add(txtAuthor);
bookPanel.add(labPublish);
bookPanel.add(txtPublish);
bookPanel.add(labPublishDate);
bookPanel.add(txtPublishDate);
bookPanel.add(labPrice);
bookPanel.add(txtPrice);//将各组件加入到面板
panel.add(bookPanel,BorderLayout.CENTER);
btnPanel=newJPanel();
btnAdd=newJButton("增加");
btnReset=newJButton("重置");
btnExit=newJButton("退出");
btnPanel.add(btnAdd);
btnPanel.add(btnReset);
btnPanel.add(btnExit);
panel.add(btnPanel,BorderLayout.SOUTH);setVisible(true);}publicstaticvoidmain(String[] args){newBookAdd("图书添加");}}
3.创建图书修改与查询界面
在中间面板中显示所有图书信息,输入图书信息,可以实现删除与修改功能。
packagecom.bbm.staticview;importjava.awt.BorderLayout;importjava.awt.Component;importjava.awt.Dimension;importjava.awt.Graphics;importjava.awt.GridLayout;importjava.awt.Insets;importjavax.swing.*;importjavax.swing.border.Border;publicclassBookSelectModifyextendsJFrame{privateJPanel panel,selectConditionPane,btnPanel,
centerPanel,selectResultPane,bookPane;privateJComboBox cmbChoice,cmbType;privateJTextField txtSelect,txtISBN,txtName,txtAuthor,
txtPublish,txtPublishDate,txtPrice;privateJLabel labISBN,labType,labName,labAuthor,
labPublish,labPublishDate,labPrice;privateJButton btnSelect,btnModify,btnDelete,btnExit;privateJTable table;privateJScrollPane scrollPane;publicBookSelectModify(){setTitle("图书管理");//设置标题setSize(500,500);setLocationRelativeTo(null);
panel=newJPanel(newBorderLayout());setContentPane(panel);
selectConditionPane=newJPanel();
cmbChoice=newJComboBox();
cmbChoice.addItem("全部");
cmbChoice.addItem("书名");
txtSelect=newJTextField(20);
selectConditionPane.add(cmbChoice);
selectConditionPane.add(txtSelect);
panel.add(selectConditionPane,BorderLayout.NORTH);//中间面板
centerPanel=newJPanel();
selectResultPane=newJPanel();
table=newJTable();
scrollPane=newJScrollPane(table);
scrollPane.setPreferredSize(newDimension(400,240));//设大小
selectResultPane.add(scrollPane);
bookPane=newJPanel(newGridLayout(4,4));//4行4列,需要创建每个组件,加到bookPane中,另外6个课后完成
labISBN=newJLabel("ISBN号");
labType=newJLabel("图书类型");
labName=newJLabel("书名");
labAuthor=newJLabel("作者");
labPublish=newJLabel("出版社");
labPublishDate=newJLabel("出版日期");
labPrice=newJLabel("价格");
txtISBN=newJTextField(8);
cmbType=newJComboBox();
cmbType.addItem("计算机类");
cmbType.addItem("管理类");
txtName=newJTextField(8);
txtAuthor=newJTextField(8);
txtPublish=newJTextField(8);
txtPublishDate=newJTextField(8);
txtPrice=newJTextField(8);
bookPane.add(labISBN);
bookPane.add(txtISBN);
bookPane.add(labType);
bookPane.add(cmbType);
bookPane.add(labName);
bookPane.add(txtName);
bookPane.add(labAuthor);
bookPane.add(txtAuthor);
bookPane.add(labPublish);
bookPane.add(txtPublish);
bookPane.add(labPublishDate);
bookPane.add(txtPublishDate);
bookPane.add(labPrice);
bookPane.add(txtPrice);
centerPanel.add(selectResultPane);
centerPanel.add(bookPane);
panel.add(centerPanel,BorderLayout.CENTER);
btnPanel=newJPanel();
btnSelect=newJButton("查询");
btnModify=newJButton("修改");
btnDelete=newJButton("删除");
btnExit=newJButton("退出");
btnPanel.add(btnSelect);
btnPanel.add(btnModify);
btnPanel.add(btnDelete);
btnPanel.add(btnExit);
panel.add(btnPanel,BorderLayout.SOUTH);setVisible(true);}publicstaticvoidmain(String[] args){// TODO Auto-generated method stubnewBookSelectModify();}}
4.读者信息增加界面
输入对应的信息,点击增加,实现添加信息的功能。
packagecom.bbm.staticview;importjavax.swing.*;importjava.awt.*;publicclassReaderAddextendsJFrame{privateJPanel panel,bookPanel,btnPanel;// 标签privateJLabel labReaderID, labName,labType, labSex, labAge,
labPhone, labDept, labRegisterDate;// 文本属性privateJTextField txtReaderID,txtName, txtSex,
txtAge, txtPhone,txtDept,txtRegisterDate;JComboBox cmbType;//组合框// 组件按钮privateJButton btnAdd,btnReset,btnExit;publicReaderAdd(String s){super(s);setSize(400,200);setLocationRelativeTo(null);
panel=newJPanel(newBorderLayout());setContentPane(panel);//图书面板的信息GridLayout grid1=newGridLayout(4,4);//网格布局
grid1.setHgap(5);
grid1.setVgap(5);
bookPanel=newJPanel(grid1);
labReaderID =newJLabel("编号:");
labReaderID.setHorizontalAlignment(SwingConstants.CENTER);//居中
txtReaderID =newJTextField(15);
labName =newJLabel("姓名:");
labName.setHorizontalAlignment(SwingConstants.CENTER);
txtName=newJTextField(12);
labType =newJLabel("类别:");
labType.setHorizontalAlignment(SwingConstants.CENTER);
cmbType =newJComboBox();
cmbType.addItem("教师");
cmbType.addItem("学生");
labSex =newJLabel("性别:");
labSex.setHorizontalAlignment(SwingConstants.CENTER);
txtSex =newJTextField(12);
labAge =newJLabel("年龄:");
labAge.setHorizontalAlignment(SwingConstants.CENTER);
txtAge =newJTextField();
labPhone =newJLabel("电话:");
labPhone.setHorizontalAlignment(SwingConstants.CENTER);
txtPhone =newJTextField(12);
labDept =newJLabel("所在部门:");
labDept.setHorizontalAlignment(SwingConstants.CENTER);
txtDept =newJTextField(12);
labRegisterDate =newJLabel("注册日期:");
labRegisterDate.setHorizontalAlignment(SwingConstants.CENTER);
txtRegisterDate =newJTextField(12);// 注册日期//TODO//其余类似,作者,出版社,出版社日期,价格,课后大家补充。
bookPanel.add(labReaderID);
bookPanel.add(txtReaderID);
bookPanel.add(labName);
bookPanel.add(txtName);
bookPanel.add(labType);
bookPanel.add(cmbType);
bookPanel.add(labSex);
bookPanel.add(txtSex);
bookPanel.add(labAge);
bookPanel.add(txtAge);
bookPanel.add(labPhone);
bookPanel.add(txtPhone);
bookPanel.add(labDept);
bookPanel.add(txtDept);
bookPanel.add(labRegisterDate);
bookPanel.add(txtRegisterDate);// 注册日期//TODO//将各组件加入到面板
panel.add(bookPanel,BorderLayout.CENTER);
btnPanel=newJPanel();
btnAdd=newJButton("增加");
btnReset=newJButton("重置");
btnExit=newJButton("退出");
btnPanel.add(btnAdd);
btnPanel.add(btnReset);
btnPanel.add(btnExit);
panel.add(btnPanel,BorderLayout.SOUTH);setVisible(true);}publicstaticvoidmain(String[] args){newReaderAdd("读者信息添加");}}
5.读者信息查询与修改界面
在中间面板实现查询功能,输入对应的信息实现修改
packagecom.bbm.staticview;importjava.awt.BorderLayout;importjava.awt.Dimension;importjava.awt.GridLayout;importjavax.swing.*;publicclassReaderSelectModifyextendsJFrame{privateJPanel panel,selectConditionPane,btnPanel,
centerPanel,selectResultPane,bookPane;privateJComboBox cmbChoice,cmbType;privateJTextField txtSelect, txtReaderID, txtSex, txtAge,
txtPhone, txtDept, txtRegisterDate,txtName;privateJLabel labReaderID,labType, labSex, labAge,
labPhone, labDept, labRegisterDate,labName;privateJButton btnSelect,btnModify,btnDelete,btnExit;privateJTable table;privateJScrollPane scrollPane;publicReaderSelectModify(){setTitle("读者管理");//设置标题setSize(500,500);setLocationRelativeTo(null);
panel=newJPanel(newBorderLayout());setContentPane(panel);// 顶部的框
selectConditionPane=newJPanel();
cmbChoice=newJComboBox();
cmbChoice.addItem("全部");
cmbChoice.addItem("读者编号");// cmbChoice.addItem("读者名字");
txtSelect=newJTextField(20);
btnSelect=newJButton("查询");
selectConditionPane.add(cmbChoice);
selectConditionPane.add(txtSelect);
selectConditionPane.add(btnSelect);
panel.add(selectConditionPane,BorderLayout.NORTH);//中间面板
centerPanel=newJPanel();
selectResultPane=newJPanel();
table=newJTable();
scrollPane=newJScrollPane(table);
scrollPane.setPreferredSize(newDimension(400,240));//设大小
selectResultPane.add(scrollPane);//4行4列,需要创建每个组件,加到bookPane中,另外6个课后完成
bookPane=newJPanel(newGridLayout(4,4));
labReaderID =newJLabel("编号:");
labName =newJLabel("姓名:");
labType=newJLabel("类别:");
labSex =newJLabel("性别:");
labAge =newJLabel("年龄:");
labPhone =newJLabel("电话:");
labDept =newJLabel("所在部门:");
labRegisterDate =newJLabel("注册日期:");
txtReaderID =newJTextField(8);
cmbType=newJComboBox();
cmbType.addItem("教师");
cmbType.addItem("学生");
txtSex =newJTextField(8);
txtAge =newJTextField(8);
txtPhone =newJTextField(8);
txtDept =newJTextField(8);
txtRegisterDate =newJTextField(8);
txtName =newJTextField(8);
bookPane.add(labReaderID);
labReaderID.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtReaderID);
bookPane.add(labName);
labName.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtName);
bookPane.add(labType);
labType.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(cmbType);
bookPane.add(labSex);
labSex.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtSex);
bookPane.add(labAge);
labAge.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtAge);
bookPane.add(labPhone);
labPhone.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtPhone);
bookPane.add(labDept);
labDept.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtDept);
bookPane.add(labRegisterDate);
labRegisterDate.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtRegisterDate);
centerPanel.add(selectResultPane);
centerPanel.add(bookPane);
panel.add(centerPanel,BorderLayout.CENTER);
btnPanel=newJPanel();
btnModify=newJButton("修改");
btnExit=newJButton("退出");
btnPanel.add(btnModify);
btnPanel.add(btnExit);
panel.add(btnPanel,BorderLayout.SOUTH);setVisible(true);}publicstaticvoidmain(String[] args){// TODO Auto-generated method stubnewReaderSelectModify();}}
6.图书类别信息管理界面
根据图书类型id可以进行查询,输入对应的信息可实现类型信息的修改
packagecom.bbm.staticview;importjava.awt.BorderLayout;importjava.awt.Dimension;importjava.awt.GridLayout;importjavax.swing.*;publicclassBookTypeManageextendsJFrame{privateJPanel panel,selectConditionPane,btnPanel,
centerPanel,selectResultPane,bookPane;privateJComboBox cmbChoice,cmbType;privateJTextField txtSelect, txtBookTypeID, txtBookTypeName;privateJLabel labBookTypeID,labBookTypeName;privateJButton btnSelect,btnModify,btnDelete,btnExit,binInsert;privateJTable table;privateJScrollPane scrollPane;publicBookTypeManage(){setTitle("图书类型管理");//设置标题setSize(500,500);setLocationRelativeTo(null);
panel=newJPanel(newBorderLayout());setContentPane(panel);
selectConditionPane=newJPanel();
txtSelect=newJTextField(20);JLabel labSelect =newJLabel("图书类型");
btnSelect=newJButton("查询");
selectConditionPane.add(labSelect);
selectConditionPane.add(txtSelect);
selectConditionPane.add(btnSelect);
panel.add(selectConditionPane,BorderLayout.NORTH);//中间面板
centerPanel=newJPanel();
selectResultPane=newJPanel();
table=newJTable();
scrollPane=newJScrollPane(table);
scrollPane.setPreferredSize(newDimension(400,240));//设大小
selectResultPane.add(scrollPane);
bookPane=newJPanel(newGridLayout(2,4));
labBookTypeID =newJLabel("图书类型编号:");
labBookTypeName =newJLabel("图书类型名称:");
txtBookTypeID =newJTextField(13);
txtBookTypeName =newJTextField(13);
bookPane.add(labBookTypeID);
labBookTypeID.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtBookTypeID);
bookPane.add(labBookTypeName);
labBookTypeName.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtBookTypeName);
centerPanel.add(selectResultPane);
centerPanel.add(bookPane);
panel.add(centerPanel,BorderLayout.CENTER);
btnPanel=newJPanel();
binInsert =newJButton("添加");
btnModify=newJButton("修改");
btnDelete=newJButton("删除");
btnExit=newJButton("退出");
btnPanel.add(binInsert);
btnPanel.add(btnModify);
btnPanel.add(btnDelete);
btnPanel.add(btnExit);
panel.add(btnPanel,BorderLayout.SOUTH);setVisible(true);}publicstaticvoidmain(String[] args){// TODO Auto-generated method stubnewBookTypeManage();}}
7.读者类型管理
根据读者类型id可以进行查询,输入对应的信息可实现类型信息的修改
packagecom.bbm.staticview;importjava.awt.BorderLayout;importjava.awt.Dimension;importjava.awt.GridLayout;importjavax.swing.*;publicclassReaderTypeManageextendsJFrame{privateJPanel panel,selectConditionPane,btnPanel,
centerPanel,selectResultPane,bookPane;privateJComboBox cmbChoice,cmbType;privateJTextField txtSelect, txtTypeID, txtLimit,txtTypeName,txtMaxBorrowNum;privateJLabel labTypeID, labMaxBorrowNum, labLimit,labTypeName,labSelect;privateJButton btnSelect,btnModify,btnDelete,btnExit,binInsert;privateJTable table;privateJScrollPane scrollPane;publicReaderTypeManage(){setTitle("读者类型管理");//设置标题setSize(500,500);setLocationRelativeTo(null);
panel=newJPanel(newBorderLayout());setContentPane(panel);
selectConditionPane=newJPanel();
txtSelect=newJTextField(20);JLabel labSelect =newJLabel("读者类型");
btnSelect=newJButton("查询");
selectConditionPane.add(labSelect);
selectConditionPane.add(txtSelect);
selectConditionPane.add(btnSelect);
panel.add(selectConditionPane,BorderLayout.NORTH);//中间面板
centerPanel=newJPanel();
selectResultPane=newJPanel();
table=newJTable();
scrollPane=newJScrollPane(table);
scrollPane.setPreferredSize(newDimension(400,240));//设大小
selectResultPane.add(scrollPane);
bookPane=newJPanel(newGridLayout(2,4));
labTypeID =newJLabel("读者类型编号:");
labTypeName =newJLabel("读者类型名称:");
labMaxBorrowNum =newJLabel("可借图书数量:");
labLimit =newJLabel("可借图书期限:");
txtTypeID =newJTextField(8);
txtTypeName =newJTextField(8);
txtMaxBorrowNum =newJTextField(8);
txtLimit =newJTextField(8);
bookPane.add(labTypeID);
labTypeID.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtTypeID);
bookPane.add(labTypeName);
labTypeName.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtTypeName);
bookPane.add(labMaxBorrowNum);
labMaxBorrowNum.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtMaxBorrowNum);
bookPane.add(labLimit);
labLimit.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtLimit);
centerPanel.add(selectResultPane);
centerPanel.add(bookPane);
panel.add(centerPanel,BorderLayout.CENTER);
btnPanel=newJPanel();
binInsert =newJButton("添加");
btnModify=newJButton("修改");
btnDelete=newJButton("删除");
btnExit=newJButton("退出");
btnPanel.add(binInsert);
btnPanel.add(btnModify);
btnPanel.add(btnDelete);
btnPanel.add(btnExit);
panel.add(btnPanel,BorderLayout.SOUTH);setVisible(true);}publicstaticvoidmain(String[] args){// TODO Auto-generated method stubnewReaderTypeManage();}}
8.图书借阅界面
输入读者编号确认读者身份,输入图书ISBN确认图书身份,输入当前日期点击借阅,出现在借阅的查询面板当中
importjava.awt.BorderLayout;importjava.awt.Dimension;importjava.awt.GridLayout;importjavax.swing.*;publicclassBookBorrowextendsJFrame{privateJPanel panel,ReaderConditionPane,btnPanel,
centerPanel,selectResultPane,bookPane;privateJTextField txtReaderName,txtReaderType,txtReaderID, txtISBN, txtAuthor,txtTypeName, txtBookName,txtPublish,txtPublishdate,txtPrice ,txtBorrowDate,txtUser ;privateJLabel labISBN, labBookName, labAuthor,labTypeName, labPublish,labPublishDate,labPrice,labBorrowDate,labUser;privateJButton btnClose, binBorrow;privateJTable table;privateJScrollPane scrollPane;publicBookBorrow(){setTitle("图书借阅");//设置标题setSize(500,500);setLocationRelativeTo(null);
panel=newJPanel(newBorderLayout());setContentPane(panel);// 设置顶部面板ReaderConditionPane=newJPanel();JLabel labReaderID =newJLabel("读者编号:");
txtReaderID =newJTextField(8);ReaderConditionPane.add(labReaderID);ReaderConditionPane.add(txtReaderID);JLabel labReaderName =newJLabel("读者姓名:");
txtReaderName =newJTextField(8);ReaderConditionPane.add(labReaderName);ReaderConditionPane.add(txtReaderName);JLabel labReaderType =newJLabel("读者类别:");
txtReaderType =newJTextField(8);ReaderConditionPane.add(labReaderType);ReaderConditionPane.add(txtReaderType);
panel.add(ReaderConditionPane,BorderLayout.NORTH);//中间面板
centerPanel=newJPanel();
selectResultPane=newJPanel();
table=newJTable();
scrollPane=newJScrollPane(table);
scrollPane.setPreferredSize(newDimension(400,240));//设大小
selectResultPane.add(scrollPane);// 底部面板
bookPane=newJPanel(newGridLayout(5,2));
labISBN =newJLabel("ISBN:");
labTypeName =newJLabel("类别:");
labBookName =newJLabel("书名:");
labAuthor =newJLabel("作者:");
labPublish =newJLabel("出版社:");
labPublishDate =newJLabel("出版日期:");
labPrice =newJLabel("单价:");
labBorrowDate =newJLabel("当前日期:");
labUser =newJLabel("操作用户:");
txtISBN =newJTextField(8);
txtTypeName =newJTextField(8);
txtBookName =newJTextField(8);
txtAuthor =newJTextField(8);
txtPublish =newJTextField(8);
txtPublishdate =newJTextField(8);
txtPrice =newJTextField(8);
txtBorrowDate =newJTextField(8);
txtUser =newJTextField(8);
bookPane.add(labISBN);
labISBN.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtISBN);
bookPane.add(labTypeName);
labTypeName.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtTypeName);
bookPane.add(labBookName);
labBookName.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtBookName);
bookPane.add(labAuthor);
labAuthor.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtAuthor);
bookPane.add(labPublish);
labPublish.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtPublish);
bookPane.add(labPublishDate);
labPublishDate.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtPublishdate);
bookPane.add(labPrice);
labPrice.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtPrice);
bookPane.add(labBorrowDate);
labBorrowDate.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtBorrowDate);
bookPane.add(labUser);
labUser.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtUser);
centerPanel.add(selectResultPane);
centerPanel.add(bookPane);
panel.add(centerPanel,BorderLayout.CENTER);
btnPanel=newJPanel();
binBorrow =newJButton("借阅");
btnClose =newJButton("关闭");
btnPanel.add(binBorrow);
btnPanel.add(btnClose);
panel.add(btnPanel,BorderLayout.SOUTH);setVisible(true);}publicstaticvoidmain(String[] args){// TODO Auto-generated method stubnewBookBorrow();}}
9.图书归还界面
输入图书的ISBN点击归还图书从借阅表中删除
packagecom.bbm.staticview;importjava.awt.BorderLayout;importjava.awt.Dimension;importjava.awt.GridLayout;importjavax.swing.*;publicclassBookReturnextendsJFrame{privateJPanel panel,ReaderConditionPane,btnPanel,
centerPanel,selectResultPane,bookPane;privateJTextField txtReaderName,txtReaderType,txtReaderID,
txtISBN, txtAuthor,txtTypeName, txtBookName,txtPublish,
txtPublishdate,txtPrice ,txtBorrowDate,txtUser,txtReturnDate,txtFine ;privateJLabel labISBN, labBookName, labAuthor,labTypeName, labPublish,
labPublishDate,labPrice,labBorrowDate,labUser,labReturnDate,labFine;privateJButton btnClose, btnReturn;privateJTable table;privateJScrollPane scrollPane;publicBookReturn(){setTitle("图书归还");//设置标题setSize(500,500);setLocationRelativeTo(null);
panel=newJPanel(newBorderLayout());setContentPane(panel);// 设置顶部面板ReaderConditionPane=newJPanel();JLabel labReaderID =newJLabel("读者编号:");
txtReaderID =newJTextField(8);ReaderConditionPane.add(labReaderID);ReaderConditionPane.add(txtReaderID);JLabel labReaderName =newJLabel("读者姓名:");
txtReaderName =newJTextField(8);ReaderConditionPane.add(labReaderName);ReaderConditionPane.add(txtReaderName);JLabel labReaderType =newJLabel("读者类别:");
txtReaderType =newJTextField(8);ReaderConditionPane.add(labReaderType);ReaderConditionPane.add(txtReaderType);
panel.add(ReaderConditionPane,BorderLayout.NORTH);//中间面板
centerPanel=newJPanel();
selectResultPane=newJPanel();
table=newJTable();
scrollPane=newJScrollPane(table);
scrollPane.setPreferredSize(newDimension(400,240));//设大小
selectResultPane.add(scrollPane);// 底部面板
bookPane=newJPanel(newGridLayout(6,2));
labISBN =newJLabel("ISBN:");
labTypeName =newJLabel("类别:");
labBookName =newJLabel("书名:");
labAuthor =newJLabel("作者:");
labPublish =newJLabel("出版社:");
labPublishDate =newJLabel("出版日期:");
labPrice =newJLabel("单价:");
labBorrowDate =newJLabel("当前日期:");
labUser =newJLabel("操作用户:");
labReturnDate =newJLabel("归还日期:");
labFine =newJLabel("罚金:");
txtISBN =newJTextField(8);
txtTypeName =newJTextField(8);
txtBookName =newJTextField(8);
txtAuthor =newJTextField(8);
txtPublish =newJTextField(8);
txtPublishdate =newJTextField(8);
txtPrice =newJTextField(8);
txtBorrowDate =newJTextField(8);
txtUser =newJTextField(8);
txtReturnDate =newJTextField(8);
txtFine =newJTextField(8);
bookPane.add(labISBN);
labISBN.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtISBN);
bookPane.add(labTypeName);
labTypeName.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtTypeName);
bookPane.add(labBookName);
labBookName.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtBookName);
bookPane.add(labAuthor);
labAuthor.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtAuthor);
bookPane.add(labPublish);
labPublish.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtPublish);
bookPane.add(labPublishDate);
labPublishDate.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtPublishdate);
bookPane.add(labPrice);
labPrice.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtPrice);
bookPane.add(labBorrowDate);
labBorrowDate.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtBorrowDate);//TODO
bookPane.add(labReturnDate);
labReturnDate.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtReturnDate);//TODO
bookPane.add(labFine);
labFine.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtFine);
bookPane.add(labUser);
labUser.setHorizontalAlignment(SwingConstants.CENTER);
bookPane.add(txtUser);
centerPanel.add(selectResultPane);
centerPanel.add(bookPane);
panel.add(centerPanel,BorderLayout.CENTER);
btnPanel=newJPanel();
btnReturn =newJButton("归还");
btnClose =newJButton("关闭");
btnPanel.add(btnReturn);
btnPanel.add(btnClose);
panel.add(btnPanel,BorderLayout.SOUTH);setVisible(true);}publicstaticvoidmain(String[] args){// TODO Auto-generated method stubnewBookReturn();}}
10.用户密码修改界面
输入用户名和原密码得对应,新密码与确认新密码得一致
packagecom.bbm.staticview;importjavax.swing.*;publicclassUpdatePasswordextendsJFrame{privateJPanel myPanel;privateJLabel labName,labPassword,labNewPassword,labConfirmPassword;privateJTextField txtName;privateJPasswordField txtPassword,txtNewPassword,txtConfirmPassword;privateJButton btnConfirm, btnCancel;publicUpdatePassword(String name){super(name);//框架类设标题setSize(250,250);setLocationRelativeTo(null);
myPanel=newJPanel();setContentPane(myPanel);// 定义标签
labName=newJLabel("用户名:");
labName.setHorizontalAlignment(SwingConstants.CENTER);
labPassword=newJLabel("原密码:");
labPassword.setHorizontalAlignment(SwingConstants.CENTER);
labNewPassword =newJLabel("新密码");
labNewPassword.setHorizontalAlignment(SwingConstants.CENTER);
labConfirmPassword =newJLabel("确认新密码");
labConfirmPassword.setHorizontalAlignment(SwingConstants.CENTER);// 原用户名
txtName=newJTextField(12);// 原密码
txtPassword=newJPasswordField(12);
txtPassword.setEchoChar('*');// 新密码
txtNewPassword =newJPasswordField(12);
txtPassword.setEchoChar('*');//确认新密码
txtConfirmPassword =newJPasswordField(12);
txtConfirmPassword.setEchoChar('*');
btnConfirm=newJButton("确认");
btnCancel =newJButton("取消");// 面板添加组件
myPanel.add(labName);
myPanel.add(txtName);
myPanel.add(labPassword);
myPanel.add(txtPassword);
myPanel.add(labNewPassword);
myPanel.add(txtNewPassword);
myPanel.add(labConfirmPassword);
myPanel.add(txtConfirmPassword);
myPanel.add(btnConfirm);
myPanel.add(btnCancel);setVisible(true);}publicstaticvoidmain(String[] args){// TODO Auto-generated method stubnewUpdatePassword("修改密码");}}
11.用户信息删除界面
输入用户名点击删除,实现删除用户
packagecom.bbm.staticview;importjava.awt.BorderLayout;importjava.awt.Dimension;importjava.awt.GridLayout;importjavax.swing.*;publicclassUserDeleteextendsJFrame{privateJPanel panel,btnPanel,
centerPanel,selectResultPane,bookPane;privateJButton btnDelete,btnExit;privateJTable table;privateJScrollPane scrollPane;publicUserDelete(){setTitle("删除用户");//设置标题setSize(500,400);setLocationRelativeTo(null);
panel=newJPanel(newBorderLayout());setContentPane(panel);//中间面板
centerPanel=newJPanel();
selectResultPane=newJPanel();// 查询面板
table=newJTable();// 表单
scrollPane=newJScrollPane(table);// 把表单加入查询面板
scrollPane.setPreferredSize(newDimension(400,300));//设查询面板的大小
selectResultPane.add(scrollPane);// 给下面的按钮布局
bookPane=newJPanel(newGridLayout(1,2));
centerPanel.add(selectResultPane);
centerPanel.add(bookPane);
panel.add(centerPanel,BorderLayout.CENTER);
btnPanel=newJPanel();
btnDelete=newJButton("删除");
btnExit=newJButton("退出");
btnPanel.add(btnDelete);
btnPanel.add(btnExit);
panel.add(btnPanel,BorderLayout.SOUTH);setVisible(true);}publicstaticvoidmain(String[] args){// TODO Auto-generated method stubnewUserDelete();}}
12.用户信息增加界面
这是一个注册界面,用户名与密码不能为空,用户名不能和存在过的一致。输入用户名和密码后点击添加实现注册功能。
packagecom.bbm.staticview;importjavax.swing.*;publicclassUserAddextendsJFrame{privateJPanel myPanel;privateJLabel labName,labPassword;privateJTextField txtName;privateJPasswordField txtPassword;privateJButton btnAdd, btnCancel;publicUserAdd(String name){super(name);//框架类设标题setSize(250,150);setLocationRelativeTo(null);
myPanel=newJPanel();setContentPane(myPanel);
labName=newJLabel("用户名:");
labPassword=newJLabel("密 码:");
txtName=newJTextField(12);
txtPassword=newJPasswordField(12);
txtPassword.setEchoChar('*');
btnAdd =newJButton("添加");
btnCancel =newJButton("取消");
myPanel.add(labName);
myPanel.add(txtName);
myPanel.add(labPassword);
myPanel.add(txtPassword);
myPanel.add(btnAdd);
myPanel.add(btnCancel);setVisible(true);}publicstaticvoidmain(String[] args){// TODO Auto-generated method stubnewUserAdd("添加用户");}}
13.图书系统主界面
这是登陆成功之后进入的主界面,有几大功能模块。
packagecom.bbm.staticview;importjavax.swing.*;publicclassLibraryextendsJFrame{privateJMenuBar bar;//菜单条privateJMenu menuBook,menuReader,menuType,menuUser,menuBorrowBook;//菜单privateJMenuItem itemBookAdd,itemBookSelect,itemReaderAdd,itemReaderSelect,
itemBookTypeManage,itemReaderTypeManage,itemUserAdd,
itemUserDelete,itemUserUpdate,itemBookBorrow,itemBookReturn;//菜单项publicLibrary(String s){super(s);setSize(1000,800);setLocationRelativeTo(null);
bar=newJMenuBar();setJMenuBar(bar);// 图书信息管理模块
menuBook=newJMenu("图书信息管理");//菜单
itemBookAdd=newJMenuItem("图书增加");//菜单项
itemBookSelect=newJMenuItem("图书查询与修改");
menuBook.add(itemBookAdd);
menuBook.add(itemBookSelect);// 读者信息管理模块
menuReader =newJMenu("读者信息管理");
itemReaderAdd =newJMenuItem("读者添加");
itemReaderSelect =newJMenuItem("读者查询与修改");
menuReader.add(itemReaderAdd);
menuReader.add(itemReaderSelect);// 类型管理
menuType =newJMenu("类型管理");
itemBookTypeManage =newJMenuItem("图书类型管理");
itemReaderTypeManage =newJMenuItem("读者类型管理");
menuType.add(itemBookTypeManage);
menuType.add(itemReaderTypeManage);// 用户管理
menuUser =newJMenu("用户管理");
itemUserAdd =newJMenuItem("注册用户");
itemUserDelete =newJMenuItem("删除用户");
itemUserUpdate =newJMenuItem("修改密码");
menuUser.add(itemUserAdd);
menuUser.add(itemUserDelete);
menuUser.add(itemUserUpdate);// 借阅管理
menuBorrowBook =newJMenu("借阅管理");
itemBookBorrow =newJMenuItem("图书借阅");
itemBookReturn =newJMenuItem("图书归还");
menuBorrowBook.add(itemBookBorrow);
menuBorrowBook.add(itemBookReturn);
bar.add(menuBook);
bar.add(menuReader);
bar.add(menuType);
bar.add(menuUser);
bar.add(menuBorrowBook);setVisible(true);}publicstaticvoidmain(String[] args){// TODO Auto-generated method stubnewLibrary("图书借阅系统");}
子项目:图书借阅系统数据访问方法
(1)Dao类连接数据库
获取数据库实例(线程安全),获取数据库连接,关闭资源
packagecom.bbm.db;importcom.mysql.cj.jdbc.MysqlDataSource;importjavax.sql.DataSource;importjava.sql.*;publicclassDao{privatestaticfinalString URL ="jdbc:mysql://127.0.0.1:3306/bookSystem?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true";privatestaticfinalString USERNAME ="root";privatestaticfinalString PASSWORD ="123456";// 获取数据库连接privatestaticvolatileDataSource dataSource =null;// 单例模式获得数据库实例privatestaticDataSourcegetDataSource(){if(dataSource==null){synchronized(Dao.class){if(dataSource==null){
dataSource =newMysqlDataSource();((MysqlDataSource)dataSource).setURL(URL);((MysqlDataSource)dataSource).setUser(USERNAME);((MysqlDataSource)dataSource).setPassword(PASSWORD);}}}return dataSource;}// 获得数据库连接publicstaticConnectiongetConnection(){try{returngetDataSource().getConnection();}catch(SQLException throwables){
throwables.printStackTrace();}returnnull;}//回收资源publicstaticvoidclose(ResultSet resultSet,PreparedStatement statement ,Connection connection){if(resultSet!=null){try{
resultSet.close();}catch(SQLException throwables){
throwables.printStackTrace();}}if(statement!=null){try{
statement.close();}catch(SQLException throwables){
throwables.printStackTrace();}}if(connection!=null){try{
connection.close();}catch(SQLException throwables){
throwables.printStackTrace();}}}}
(2)BookDao 类实现操作数据库中的book表
packagecom.bbm.db;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.util.*;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;importcom.bbm.model.Book;publicclassBookDao{//根据ISBN号删除图书信息publicstaticintdeleteBook(String ISBN){// 先定义数据库连接,预处理Connection connection =null;PreparedStatement statement =null;int ret =0;try{//1.获取到数据库连接
connection =Dao.getConnection();//2.拼装sql语句String sql="delete from book where ISBN='"+ISBN+"'";
statement = connection.prepareStatement(sql);
ret = statement.executeUpdate();}catch(SQLException throwables){
throwables.printStackTrace();}finally{Dao.close(null,statement,connection);}return ret;}//增加图书信息publicstaticintinsertBook(Book b,String typeName){//稍微复杂:图书表中包括的是类型编号,界面设计时是类型的名称,//所以,在增加之前,需要先将类型名称转换成类型编号//根据类型名查找到相应的类型编号,涉及到图书类型表Connection connection =Dao.getConnection();PreparedStatement statement =null;ResultSet resultSet =null;int ret =0;// 根据图书的类型名找到图书编号try{// 拼接sql语句String sql1="select typeid from booktype where typename='"+typeName+"'";
statement = connection.prepareStatement(sql1);
resultSet = statement.executeQuery();int typeID =-1;if(resultSet.next()){
typeID = resultSet.getInt("typeid");}// 根据类型名拿到图书类型的id了String sql2="insert into Book(ISBN,bookname,author,publish,publishdate,price,typeid,typename)"+"values('"+b.getISBN()+"','"+b.getBookName()+"','"+b.getAuthor()+"','"+b.getPublish()+"','"+b.getPublishDate()+"',"+b.getPrice()+","+typeID+",'"+typeName+"'"+")";System.out.println(sql2);
statement = connection.prepareStatement(sql2);
ret = statement.executeUpdate(sql2);}catch(SQLException throwables){
throwables.printStackTrace();}finally{Dao.close(resultSet,statement,connection);}return ret;}//查询功能publicstaticList<Book>selectBook(String s1,String s2){//根据下拉框的选择 进行查询// 第一种 下拉框是全部,查询全部// 第二种 下拉框是书名,文本框输入具体的值,根据这两个条件进行查询Connection connection =null;PreparedStatement statement =null;ResultSet resultSet =null;List<Book> listBook =newArrayList<Book>();try{//1.连接数据库
connection =Dao.getConnection();// 2.拼接sql语句String sql ="SELECT ISBN,bookname,author,publish,publishDate,price,book.typeid,book.typename from book JOIN booktype "+"on book.typeid=booktype.typeid";if(s1.equals("书名"))
sql = sql +" where bookname='"+ s2 +"'";//3.执行sql查询语句
statement = connection.prepareStatement(sql);
resultSet = statement.executeQuery();//可以包括多类的查询条件,根据前面的界面来完善。while(resultSet.next()){Book b1 =newBook();
b1.setISBN(resultSet.getString("ISBN"));
b1.setBookName(resultSet.getString("bookname"));
b1.setPublish(resultSet.getString("publish"));
b1.setAuthor(resultSet.getString("author"));
b1.setPublishDate(resultSet.getString("publishdate"));
b1.setPrice(resultSet.getDouble("price"));
b1.setTypeID(resultSet.getInt("typeid"));
b1.setTypeName(resultSet.getString("typename"));
listBook.add(b1);}return listBook;}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(resultSet,statement,connection);}returnnull;}//修改publicstaticintupdateBook(Book b){Connection connection =Dao.getConnection();PreparedStatement statement =null;ResultSet resultSet =null;int ret =0;try{// 拼接sql语句String sql1="select typeid from booktype where typename='"+b.getTypeName()+"'";
statement = connection.prepareStatement(sql1);
resultSet = statement.executeQuery();int typeID =-1;if(resultSet.next()){
typeID = resultSet.getInt("typeid");}//update book set bookname='计算机网络',author='肖朝晖',//publish='北京理工大学出版社',price=34,//typeid=1,publishdate='20180101' where isbn='003'// 拼接sql 修改语句String sqlUpdat="update book set bookname='"+b.getBookName()+"',author='"+b.getAuthor()+"',publish='"+b.getPublish()+"',price="+b.getPrice()+",typeid="+typeID+",publishdate='"+b.getPublishDate()+"' where isbn='"+b.getISBN()+"'";
statement = connection.prepareStatement(sqlUpdat);
ret = statement.executeUpdate();}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(resultSet,statement,connection);}return ret;}publicstaticvoidmain(String[] args){BookDao.selectBook("","");}}
(3)ReaderDao 类实现操作数据库中的reader表
packagecom.bbm.db;importcom.bbm.model.Book;importcom.bbm.model.Reader;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.List;publicclassReaderDao{//增删改查// 增publicstaticintinsertReader(Reader reader,String typeName){Connection connection =Dao.getConnection();PreparedStatement statement =null;ResultSet resultSet =null;int ret =0;// 读者表中 typeid 与 读者类型表中 typeid 相联系// 根据读者的类型名 typename 找到读者类型编号 typeidtry{// 拼接sql语句 从读者类型表 readertype 中根据 typename查找 typeidString sql1="select typeid from readertype where typename=?";
statement = connection.prepareStatement(sql1);// 占位符替换
statement.setString(1,typeName);// 执行sql查询语句
resultSet = statement.executeQuery();int typeID =-1;if(resultSet.next()){
typeID = resultSet.getInt("typeid");}// 根据类型名拿到读者类型的id了System.out.println(typeID);String sql2="insert into reader values (?,?,?,?,?,?,?,?,?)";// 占位符替换
statement = connection.prepareStatement(sql2);
statement.setString(1,reader.getReaderid());
statement.setString(2,reader.getName());
statement.setString(3,reader.getSex());
statement.setInt(4,reader.getAge());
statement.setString(5,reader.getPhone());
statement.setString(6,reader.getDept());
statement.setString(7,reader.getRegdate());
statement.setInt(8,typeID);
statement.setString(9,typeName);// System.out.println(sql2);// 执行sql增加语句
ret = statement.executeUpdate();}catch(SQLException throwables){
throwables.printStackTrace();}finally{Dao.close(resultSet,statement,connection);}return ret;}// 删 根据读者的编号进行删除操作publicstaticintdeleteReader(String readerid){// 先定义数据库连接,预处理Connection connection =null;PreparedStatement statement =null;int ret =0;try{//1.获取到数据库连接
connection =Dao.getConnection();//2.拼装sql语句String sql="delete from reader where readerid = ?";
statement = connection.prepareStatement(sql);// 占位符替换
statement.setString(1,readerid);// 3.执行sql语句
ret = statement.executeUpdate();}catch(SQLException throwables){
throwables.printStackTrace();}finally{Dao.close(null,statement,connection);}return ret;}// 改publicstaticintupdateReader(Reader reader){Connection connection =Dao.getConnection();PreparedStatement statement =null;ResultSet resultSet =null;int ret =0;try{// 拼接sql语句 从读者类型表 readertype 中根据 typename查找 readeridString sql1="select typeid from readertype where typename= ?";
statement = connection.prepareStatement(sql1);// 占位符替换
statement.setString(1,reader.getTypename());System.out.println(reader.getTypename());// 执行sql查询语句
resultSet = statement.executeQuery();int typeID =-1;if(resultSet.next()){
typeID = resultSet.getInt("typeid");}System.out.println(typeID);// 根据类型名拿到读者类型的id了//update book set bookname='计算机网络',author='肖朝晖',//publish='北京理工大学出版社',price=34,//typeid=1,publishdate='20180101' where isbn='003'// 拼接sql 修改语句String sqlUpdat="update reader set name=?,sex=?,age=?,phone=?,dept=?,regdate=?,typeid=? ,typename=? where readerid=?";
statement = connection.prepareStatement(sqlUpdat);// 占位符替换
statement.setString(1,reader.getName());
statement.setString(2,reader.getSex());
statement.setInt(3,reader.getAge());
statement.setString(4,reader.getPhone());
statement.setString(5,reader.getDept());
statement.setString(6,reader.getRegdate());
statement.setInt(7,typeID);
statement.setString(8,reader.getTypename());
statement.setString(9,reader.getReaderid());// 执行sql语句
ret = statement.executeUpdate();}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(resultSet,statement,connection);}return ret;}// 查publicstaticList<Reader>selectReader(String s1,String s2){//一个是下拉框中选中的字符串,一个是Connection connection =null;PreparedStatement statement =null;ResultSet resultSet =null;List<Reader> list =newArrayList<Reader>();try{//1.连接数据库
connection =Dao.getConnection();// 2.拼接sql语句String sql ="select readerid ,name,sex,age,phone,dept,regdate,reader.typeid,readertype.typename from reader JOIN readertype on reader.typeid=readertype.typeid";// System.out.println("执行到了if的前一行");if(s1.equals("读者编号")){// System.out.println("执行了if判断");
sql = sql+" where readerid='"+ s2 +"'";}// System.out.println("执行了if判断之后的条件");System.out.println(sql);//3.执行sql查询语句
statement = connection.prepareStatement(sql);
resultSet = statement.executeQuery();//可以包括多类的查询条件,根据前面的界面来完善。while(resultSet.next()){Reader reader =newReader();
reader.setReaderid(resultSet.getString("readerid"));
reader.setName(resultSet.getString("name"));
reader.setSex(resultSet.getString("sex"));
reader.setAge(resultSet.getInt("age"));
reader.setPhone(resultSet.getString("phone"));
reader.setDept(resultSet.getString("dept"));
reader.setRegdate(resultSet.getString("regdate"));
reader.setTypename(resultSet.getString("typename"));
list.add(reader);}return list;}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(resultSet,statement,connection);}returnnull;}}
(4)BookTypeDao 类实现操作数据库中的bookType表
packagecom.bbm.db;importcom.bbm.model.Book;importcom.bbm.model.BookType;importcom.bbm.model.ReaderType;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.List;publicclassBookTypeDao{//增删改查// 增publicstaticintinsertBookType(BookType bookType){Connection connection =null;PreparedStatement statement =null;int ret =0;try{//1.先拿到数据库的连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="insert into booktype values (?,?)";
statement = connection.prepareStatement(sql);// 占位符防止sql注入,最好不要直接拼接到sql语句中
statement.setInt(1, bookType.getTypeid());
statement.setString(2,bookType.getTypename());//3.执行sql语句
ret = statement.executeUpdate();}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}return ret;}// 删 因为书籍类型编号是主键,所以是唯一的,所以就根据主键来删除记录publicstaticintdeleteBookType(int typeid){int ret =0;Connection connection =null;PreparedStatement statement =null;try{//1.拿到数据库连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="delete from booktype where typeid =?";
statement = connection.prepareStatement(sql);// 占位符替换
statement.setInt(1, typeid);// 3.执行sql语句
ret = statement.executeUpdate();}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}return ret;}// 改 因为主键是唯一的,所以根据主键id进行修改读者类型信息publicstaticintupdateBookType(BookType bookType){Connection connection =null;PreparedStatement statement =null;int ret =0;try{//1.先拿到数据库的连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="update booktype set typename=? where typeid= ?";
statement = connection.prepareStatement(sql);// 占位符防止sql注入,最好不要直接拼接到sql语句中
statement.setString(1, bookType.getTypename());
statement.setInt(2, bookType.getTypeid());//3.执行sql语句
ret = statement.executeUpdate();}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}return ret;}// 查 查找所有的读者类型publicstaticList<BookType>selectBookType(){List<BookType> list =newArrayList<BookType>();Connection connection =null;PreparedStatement statement =null;ResultSet resultSet =null;try{//1.先拿到数据库的连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="select * from booktype";
statement = connection.prepareStatement(sql);//3.执行sql语句
resultSet = statement.executeQuery();while(resultSet.next()){BookType bookType =newBookType();
bookType.setTypeid(resultSet.getInt("typeid"));
bookType.setTypename(resultSet.getString("typename"));
list.add(bookType);}return list;}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}returnnull;}// 查 按照指定的 读者编号进行查找读者类型publicstaticList<BookType>selectBookTypeById(int typeid){List<BookType> list =newArrayList<BookType>();Connection connection =null;PreparedStatement statement =null;ResultSet resultSet =null;BookType bookType =newBookType();try{//1.先拿到数据库的连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="select * from booktype where typeid =?";
statement = connection.prepareStatement(sql);
statement.setInt(1,typeid);//3.执行sql语句
resultSet = statement.executeQuery();if(resultSet.next()){
bookType.setTypeid(resultSet.getInt("typeid"));
bookType.setTypename(resultSet.getString("typename"));
list.add(bookType);}return list;}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}returnnull;}}
(5)ReaderTypeDao 类实现操作数据库中的readerType表
packagecom.bbm.db;importcom.bbm.model.Reader;importcom.bbm.model.ReaderType;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.List;publicclassReaderTypeDao{//增删改查// 增publicstaticintinsertReaderType(ReaderType readerType){Connection connection =null;PreparedStatement statement =null;int ret =0;try{//1.先拿到数据库的连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="insert into readertype values (?,?,?,?)";
statement = connection.prepareStatement(sql);// 占位符防止sql注入,最好不要直接拼接到sql语句中
statement.setInt(1,readerType.getTypeid());
statement.setString(2, readerType.getTypename());
statement.setInt(3, readerType.getMaxborrownum());
statement.setInt(4, readerType.getLimit());//3.执行sql语句
ret = statement.executeUpdate();}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}return ret;}// 删 因为读者类型编号是主键,所以是唯一的,所以就根据主键来删除记录publicstaticintdeleteReaderType(int typeid){int ret =0;Connection connection =null;PreparedStatement statement =null;try{//1.拿到数据库连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="delete from readertype where typeid =?";
statement = connection.prepareStatement(sql);// 占位符替换
statement.setInt(1, typeid);// 3.执行sql语句
ret = statement.executeUpdate();}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}return ret;}// 改 因为主键是唯一的,所以根据主键id进行修改读者类型信息publicstaticintupdateReaderType(ReaderType readerType,int typeid){Connection connection =null;PreparedStatement statement =null;int ret =0;try{//1.先拿到数据库的连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="update readertype set typename=?,maxborrownum=?,`limit`=? where typeid= ?";
statement = connection.prepareStatement(sql);// 占位符防止sql注入,最好不要直接拼接到sql语句中
statement.setString(1, readerType.getTypename());
statement.setInt(2, readerType.getMaxborrownum());
statement.setInt(3, readerType.getLimit());
statement.setInt(4, typeid);//3.执行sql语句
ret = statement.executeUpdate();}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}return ret;}// 查 查找所有的读者类型publicstaticList<ReaderType>selectReaderType(){List<ReaderType> list =newArrayList<ReaderType>();Connection connection =null;PreparedStatement statement =null;ResultSet resultSet =null;try{//1.先拿到数据库的连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="select * from readertype";
statement = connection.prepareStatement(sql);//3.执行sql语句
resultSet = statement.executeQuery();while(resultSet.next()){ReaderType readerType =newReaderType();
readerType.setTypeid(resultSet.getInt("typeid"));
readerType.setTypename(resultSet.getString("typename"));
readerType.setMaxborrownum(resultSet.getInt("maxborrownum"));
readerType.setLimit(resultSet.getInt("limit"));
list.add(readerType);}return list;}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}returnnull;}// 查 按照指定的 读者编号进行查找读者类型publicstaticList<ReaderType>selectReaderTypeById(int typeid){Connection connection =null;PreparedStatement statement =null;ResultSet resultSet =null;List<ReaderType> list =newArrayList<ReaderType>();try{//1.先拿到数据库的连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="select * from readertype where typeid =?";
statement = connection.prepareStatement(sql);
statement.setInt(1,typeid);//3.执行sql语句
resultSet = statement.executeQuery();if(resultSet.next()){ReaderType readerType =newReaderType();
readerType.setTypeid(resultSet.getInt("typeid"));
readerType.setTypename(resultSet.getString("typename"));
readerType.setMaxborrownum(resultSet.getInt("maxborrownum"));
readerType.setLimit(resultSet.getInt("limit"));
list.add(readerType);}return list;}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}returnnull;}}
(6)BookBorrowDao 类实现操作数据库中的borrowBook表
packagecom.bbm.db;importcom.bbm.model.Book;importcom.bbm.model.BorrowBook;importcom.bbm.model.Reader;importnetscape.security.UserTarget;importjava.sql.*;importjava.util.ArrayList;importjava.util.List;publicclassBorrowBookDao{// BorrowBook 表中 放的都是 借走的书,没借走的书都不在这里// 这个涉及到 图书借阅 与 归还// 有点儿搞不懂功能需求//增删改查// 增 就相当于 借阅publicstaticintborrowBook(String readerid,String ISBN,String borrowDate){// 借阅需要知道 借书人的信息、书的信息// 根据图书借阅表的标签和文本框,我们往bookBorrow表中插入信息Connection connection =null;PreparedStatement statement =null;int ret =0;try{//1. 获取数据库连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="insert into borrowbook(readerid,ISBN,borrowdate) values(?,?,?)";
statement = connection.prepareStatement(sql);// 占位符替换
statement.setString(1,readerid);
statement.setString(2,ISBN);
statement.setString(3,borrowDate);//3.执行sql语句
ret = statement.executeUpdate();return ret;}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null,statement,connection);}return0;}// TODO// 删 就相当于 归还 , 根据ISBN进行删除 //publicstaticintreturnBook(String ISBN){// 将借的书信息 从 表中删除Connection connection =null;PreparedStatement statement =null;int ret =0;try{//1. 获取数据库连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="delete from borrowbook where ISBN = ?";
statement = connection.prepareStatement(sql);// 占位符替换
statement.setString(1,ISBN);//3.执行sql语句
ret = statement.executeUpdate();return ret;}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null,statement,connection);}return0;}// 改 改变图书的借阅状态,跟增删差不多// 但是前端页面中并没有这个功能publicstaticintupdateBookState(){return0;}// 查 只显示被借走的书publicstaticList<BorrowBook>selectBorrowBook(){// 这个查询功能只 查三个东西 (ISBN,bookname,借书日期)// borrowbook 里面没有bookname属性,后来我自己又添加了,否则没办法接收 联表查询的结果Connection connection =null;PreparedStatement statement =null;ResultSet resultSet =null;List<BorrowBook> list =newArrayList<BorrowBook>();try{//1.获取数据库连接
connection =Dao.getConnection();//2. 拼接sql语句String sql ="select book.ISBN,book.bookname,borrowbook.borrowdate from book join borrowbook on borrowbook.ISBN = book.ISBN";//3. 执行sql语句
statement = connection.prepareStatement(sql);
resultSet = statement.executeQuery();while(resultSet.next()){BorrowBook borrowBook =newBorrowBook();
borrowBook.setISBN(resultSet.getString("ISBN"));
borrowBook.setBookname(resultSet.getString("bookname"));
borrowBook.setBorrowdate(resultSet.getString("borrowdate"));
list.add(borrowBook);}return list;}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(resultSet,statement,connection);}returnnull;}}
(7)UserDao 类实现操作数据库中的user表
packagecom.bbm.db;importcom.bbm.model.ReaderType;importcom.bbm.model.User;importjava.net.UnknownServiceException;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.List;publicclassUserDao{//增删改查// 增 前端界面写入user的所有信息,封装成一个user对象插入publicstaticintinsertUser(User user){Connection connection =null;PreparedStatement statement =null;int ret =0;try{//1.先拿到数据库的连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="insert into user values (null,?,?)";
statement = connection.prepareStatement(sql);// 占位符防止sql注入,最好不要直接拼接到sql语句中
statement.setString(1,user.getName());
statement.setString(2,user.getPassword());//3.执行sql语句
ret = statement.executeUpdate();}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}return ret;}// 删 因为用户id是自增主键所以 删除根据id删除publicstaticintdeleteUser(String name){int ret =0;Connection connection =null;PreparedStatement statement =null;try{//1.拿到数据库连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="delete from user where name =?";
statement = connection.prepareStatement(sql);// 占位符替换
statement.setString(1,name);// 3.执行sql语句
ret = statement.executeUpdate();}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}return ret;}// 改 前端页面只显示指定用户名的情况下,修改密码publicstaticintupdateUser(String name,String password){Connection connection =null;PreparedStatement statement =null;int ret =0;try{//1.先拿到数据库的连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="update user set password=? where name= ?";
statement = connection.prepareStatement(sql);// 占位符防止sql注入,最好不要直接拼接到sql语句中
statement.setString(1, password);
statement.setString(2, name);//3.执行sql语句
ret = statement.executeUpdate();}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}return ret;}// 查 前端页面会在删除具体用户的时候 展示所有用户信息,所以直接查询所有信息即可publicstaticList<User>selectUser(){List<User> list =newArrayList<User>();Connection connection =null;PreparedStatement statement =null;ResultSet resultSet =null;try{//1.先拿到数据库的连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="select * from user";
statement = connection.prepareStatement(sql);//3.执行sql语句
resultSet = statement.executeQuery();while(resultSet.next()){User user =newUser();
user.setId(resultSet.getInt("id"));
user.setName(resultSet.getString("name"));
user.setPassword(resultSet.getString("password"));
list.add(user);}return list;}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}returnnull;}publicstaticUserselectUserByName(String name){User user =newUser();Connection connection =null;PreparedStatement statement =null;ResultSet resultSet =null;try{//1.先拿到数据库的连接
connection =Dao.getConnection();//2.拼接sql语句String sql ="select * from user where name=?";
statement = connection.prepareStatement(sql);// 占位符替换
statement.setString(1,name);//3.执行sql语句
resultSet = statement.executeQuery();if(resultSet.next()){
user.setId(resultSet.getInt("id"));
user.setName(resultSet.getString("name"));
user.setPassword(resultSet.getString("password"));}return user ;}catch(SQLException e){
e.printStackTrace();}finally{Dao.close(null, statement, connection);}returnnull;}}
子项目:图书借阅系统功能设计与实现
1.登陆界面功能实现
点击登陆进入主界面,点击重置文本框清空
2.主界面功能实现
点击主页面具体模块的下拉选项,会出现对应的页面
3.图书增加功能实现
点击增加,给book表中增加一条数据,点击重置设置文本框为空,点击退出正常退出。
4.图书查询与修改功能实现
点击查询,如果上面的下拉框是全部,那么查询所有图书信息,并显示到面板中,如果下拉框是书名,那么根据书名进行查询并把结果显示到中间面板中。
点击修改,输入对应的内容,修改对应图书的信息
点击删除,输入ISBN,删除表中对应的图书信息
点击退出,正常退出界面
5.读者增加功能实现
点击增加,给reader表中增加一条数据,点击重置设置文本框为空,点击退出正常退出。
6.读者查询与修改功能实现
点击查询,如果上面的下拉框是全部,那么查询所有图书信息,并显示到面板中,如果下拉框是书名,那么根据书名进行查询并把结果显示到中间面板中.点击修改,输入对应的内容,修改对应图书的信息.点击删除,输入ISBN,删除表中对应的图书信息。点击退出,正常退出界面
7.读者类型管理功能实现
8.图书类型管理功能实现
在表单显示所有的类型信息,点击添加,给booktype表中添加数据,点击修改,修改对应类型编号的数据的相关信息。点击删除,删除指定类型编号的图书类型信息,点击退出,正常退出界面。
9.图书借阅功能实现
在表单中显示所有已经被借走的书籍信息,点击借阅,将借阅的信息进行增加到bookBorrow的表中。点击关闭页面正常退出。
10.图书归还功能实现
在表单中显示所有已经被借走的书籍信息,点击归还,将借阅的信息进行删除。点击关闭页面正常退出。
11.用户增加功能实现
在文本框中输入用户名和密码,点击添加,将对应信息放到user类中,在插入到user表中。 用户名都是唯一的,不能输入已经存在过的用户名。
12.用户删除功能实现
在文本框中输入用户名,点击删除按钮,在user表中对数据进行删除
13.修改密码功能实现,如图36所示
设置非空校验。输入用户名,查询user表看是否存在,如果存在,那么输入密码,查询user表,查看原密码与用户名是否匹配,如果匹配,输入新密码与确认新密码,如果不一致那么返回,如果一致,那么修改密码成功。
总结
项目总结
这个swing的项目感觉总体上逻辑并不难,可能是我之前学习过后端知识的原因,很容易实现就是繁琐简单的代码得一直重复写,举个例子,jdbc所有的dao都是增删改查操作,都是按照固定套路写,以前我就感觉到了,所以我特别想把jdbc全换成mybatis实现,写个接口在加个xml配置文件搞定,很方便。老师可能考虑大家初学Java的原因不敢讲深,不过我在这个项目中该注意到点到的都有,单例模式+双重校验锁获取数据库唯一实例且线程安全,sql语句用占位符替换不用字符串拼接以防sql注入等等。还可以写一些优化代码的操作,例如可以引入lombook,实体类加注解实现getter、setter等等。
我的收获
以前我就学了Java相关的知识,目前已经到后端框架学习了,所以做这个swing项目感觉还不是太难,但是还是有收获的,在我以前看来swing已经是非常淘汰的东西了,GUI企业根本不会考察,所以我就压根没接触过,经过这个项目的完工,发现对swing的代码不能说掌握,起码算认识了,也能修修改改完成界面的布置,swing可视化图形界面还是挺有趣的。
课程建议
这个项目对初学者感觉不太友好,咱们同学刚接触java语法,可能基础还不太会,然后又接触数据库、jdbc,可能进度开的有点快。建议同学们课下一定要多多的自学才能跟得上。
原版的程序和代码及报告文档放到百度网盘
链接:https://pan.baidu.com/s/1MpDt0gw7z5shH75V6hDhHQ
提取码:rain
版权归原作者 RAIN 7 所有, 如有侵权,请联系我们删除。