0


Java Swing 期末大作业-----图书借阅管理系统

文章目录

项目:图书借阅系统

子项目:需求分析

在这里插入图片描述

  图书借阅系统有以下四大模块:读者信息管理、图书信息管理、图书借阅管理、用户信息管理、类型信息管理,我们接下来对每一模块的具体功能进行分析需求。

第一模块:图书信息管理

在这里插入图片描述

  图书信息管理是图书借阅系统最核心的功能,因为图书是最关键的要素, 在系统中有着所有图书的相关信息。

图书增、删、改、查功能

  首先我们得能知道系统中有什么书,这本书的相关信息,知道了图书的信息这样我们才能根据读者的需求借书,所以这一模块就需要一个图书查询功能。查询要能查询所有书籍的关键信息,同时也能在知道了书名或者书的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

标签: java

本文转载自: https://blog.csdn.net/rain67/article/details/125219492
版权归原作者 RAIN 7 所有, 如有侵权,请联系我们删除。

“Java Swing 期末大作业-----图书借阅管理系统”的评论:

还没有评论