Java实现简易图书借阅系统

在简单学习Java的基础知识点后,动手做了一个十分简陋的图书馆借阅系统,作为对所学知识的综合应用,有不足的地方希望大家多多评论,会积极进行改正。
1.先附上总的效果 一开始的登录界面
Java实现简易图书借阅系统
文章图片

登录界面
Java实现简易图书借阅系统
文章图片

注册界面
Java实现简易图书借阅系统
文章图片

登录进去后的个人主页
(本来想在上方插入一张图片,但是刚学swing部分,搞不懂图片的插入方式,搞了很久还是没懂,就暂时放下了)
Java实现简易图书借阅系统
文章图片

借书页面
Java实现简易图书借阅系统
文章图片

输入关键词后搜索的结果
Java实现简易图书借阅系统
文章图片

还书界面,点击自动显示未还书籍
Java实现简易图书借阅系统
文章图片

查询未还书籍的具体信息
Java实现简易图书借阅系统
文章图片

2.贴上源代码 1).这里简单说一下与数据库的操作,注册用户时在表person_information插入个人信息,注册的同时创建专属个人的 账号+密码_no_book_information 表记录未还书籍 ,还有 账号+密码_already_book_information 表记录已还书籍的信息记录,在借书时将书籍的信息插入账号+密码_no_book_information 表,在还书时在
账号+密码_already_book_information 表插入已还书籍的信息,删除账号+密码_no_book_information 表中对应的借阅记录。
2).首先做了一个初始化连接数据库的类,方便在需要时调用。
(涉及数据库方面只是简单的增删查改,本人也是刚学,不做过多的说明)

package booksystem; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /* * 用于初始化连接数据库 */public class jdbcConnection {public static Connection getConnection()throws SQLException{try{Class.forName("com.mysql.jdbc.Driver"); }catch(ClassNotFoundException e){e.printStackTrace(); System.exit(0); }return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/book_system?characterEncoding=UTF-8","root","123456789"); }}

登录界面
主要思路:
登录时在数据库中搜索是否存在该账户,存在进入主页,不存在则提示错误,注册时在数据库的用户列表插入新用户的信息。
package booksystem; import javax.swing.*; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /* * 图书馆登录界面的设计 * 包括 登录和注册两部分 * */@SuppressWarnings("serial")public class jieMian extends JFrame//总页面{public jieMian(){super(); JLabel label=new JLabel("欢迎来到图书馆借阅系统"); label.setFont(new Font("宋体", 0,25)); label.setBounds(100,50,300,150); JButton button=new JButton("登录"); button.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {new dengLu(); }}); JButton button1=new JButton("注册"); button1.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {new zhuCe(); }}); Box box=Box.createVerticalBox(); box.add(button); box.add(Box.createVerticalStrut(50)); box.add(button1); box.setBounds(200,250,100,150); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setSize(500,500); setResizable(false); setLocation(700,200); setVisible(true); setLayout(null); add(label); add(box); }//注册页面class zhuCe extends JFrame implements ActionListener{private JTextField zhangHao2; private JPasswordField password2; public zhuCe(){super(); Box box=Box.createHorizontalBox(); zhangHao2=new JTextField(15); box.add(new JLabel("账号:")); box.add(Box.createHorizontalStrut(10)); box.add(zhangHao2); Box box1=Box.createHorizontalBox(); password2=new JPasswordField(15); box1.add(new JLabel("密码:")); box1.add(Box.createHorizontalStrut(10)); box1.add(password2); JButton button=new JButton("确认"); button.addActionListener(this); JButton button1=new JButton("重置"); button1.addActionListener(this); Box box2=Box.createHorizontalBox(); box2.add(Box.createHorizontalStrut(30)); box2.add(button); box2.add(Box.createHorizontalStrut(70)); box2.add(button1); Box box3=Box.createVerticalBox(); box3.add(box); box3.add(Box.createVerticalStrut(10)); box3.add(box1); box3.add(Box.createVerticalStrut(10)); box3.add(box2); box3.setBounds(100,50,250,100); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setSize(500,250); setLayout(null); setVisible(true); setLocation(700,300); add(box3); }//事件处理@Overridepublic void actionPerformed(ActionEvent e){String ret=e.getActionCommand(); if(ret.equals("确认")){//需要插入一个检验数据合理性并更新数据库的操作String insertzh=zhangHao2.getText(); String insertpw=new String(password2.getPassword()); insert(insertzh,insertpw); //点击确认后插入数据自动关闭this.dispose(); }else{zhangHao2.setText(""); password2.setText(""); }}//处理注册账号密码并插入数据库//这里只是简单地将账号密码插入数据库,没有考虑若账号不能与之前的用户相同还有不能用空格注册。//处理空格的方法:提取原始账号密码,用trim()除去前后空格比较长度做第一轮筛选,再逐个字符进行比较private void insert(String zh,String pw){try(Statement statement=jdbcConnection.getConnection().createStatement(); ){String sqlsentence="insert into person_information values('"+zh+"','"+pw+"',now()); "; statement.execute(sqlsentence); String sqlsentence1="create table "+zh+pw+"_no_book_information(书名 varchar(20) not null,"//建立一个个人的借书未还表+ "借书时间datetime not null,"+ "借阅天数int unsigned not null,"+ "应还时间datetime not null); "; statement.execute(sqlsentence1); //建立已还书籍记录String sqlsentence2="create table "+zh+pw+"_already_book_information(书名 varchar(20) not null,"//建立一个个人的借书未还表+ "借书时间datetime not null,"+ "借阅天数int unsigned not null,"+ "应还时间datetime not null,"+ "归还时间datetimenot null); "; statement.execute(sqlsentence2); }catch(SQLException e){System.out.println("注册账号更新数据库时出错!"); e.printStackTrace(); System.exit(0); }}}//登录界面class dengLu extends JFrame implements ActionListener{private JTextField zhangHao1; private JPasswordField password1; public dengLu(){super(); Box box=Box.createHorizontalBox(); zhangHao1=new JTextField(15); box.add(new JLabel("账号:")); box.add(Box.createHorizontalStrut(10)); box.add(zhangHao1); Box box1=Box.createHorizontalBox(); password1=new JPasswordField(15); box1.add(new JLabel("密码:")); box1.add(Box.createHorizontalStrut(10)); box1.add(password1); JButton button=new JButton("确认"); button.addActionListener(this); Box box2=Box.createHorizontalBox(); box2.add(Box.createHorizontalStrut(30)); box2.add(button); Box box3=Box.createVerticalBox(); box3.add(box); box3.add(Box.createVerticalStrut(10)); box3.add(box1); box3.add(Box.createVerticalStrut(10)); box3.add(box2); box3.setBounds(100,50,250,100); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setSize(500,250); setLayout(null); setVisible(true); setLocation(700,300); add(box3); }@Overridepublic void actionPerformed(ActionEvent e) {//需要插入一个检验数据合理性并更新数据库的操作String select=zhangHao1.getText(); String select1=new String(password1.getPassword()); //注意getPassword方法返回的时char数组select(select,select1); //处理事件 }private void select(String zh1,String pw1){try(Statement statement1=jdbcConnection.getConnection().createStatement(); ){String sqlsentence1="select * from person_information where账号='"+zh1+"'; "; System.out.println(sqlsentence1); ResultSet set=statement1.executeQuery(sqlsentence1); if(!set.next()){zhangHao1.setText("无此账号!"); //查询数据库发现无此账号记录}elseif(set.getString("密码").equals(pw1)){new zhuYe(zh1,pw1); //这里应该新建一个账号主页this.dispose(); //若输入正确的账号密码,则次登录窗口消失,进入账号主页}else{zhangHao1.setText("密码错误!"); //显示密码错误}}catch(SQLException e){System.out.println("注册账号更新数据库时出错!"); e.printStackTrace(); System.exit(0); }}}}

主页部分
主要思路:
主要包括三个按钮对应三个功能块
package booksystem; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /* * 个人主页 * */@SuppressWarnings("serial")public class zhuYe extends JFrame {static String zh; static String pw; public zhuYe(String zh,String pw){super(zh+"的主页"); zhuYe.zh=zh; zhuYe.pw=pw; JButton button=new JButton("借书"); button.setBounds(450,550,150,50); button.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent arg0) {new selectBook(); }}); JButton button1=new JButton("还书"); button1.setBounds(450,650,150,50); button1.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent arg0) {new returnBook(); }}); JButton button2=new JButton("查询"); button2.setBounds(450,750,150,50); button2.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent arg0) {new findNoReturnBook(); }}); add(button); add(button1); add(button2); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setSize(1000,1000); setLocation(400,30); setLayout(null); setVisible(true); }}

借书部分
输入关键词,搜索数据库的图书列表,将相关的书籍显示于列表框上,借阅天数默认为10天。
package booksystem; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Vector; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; @SuppressWarnings("serial")public class selectBook extends JFrame {private JTextField textSelect; //用户输入关键词搜索的文本框private JTextField textDay; //用户输入借阅天数的文本框private JList list; //显示搜索结果的文本列表private Vector bookSelect; //根据关键字在数据库中搜寻得到的书列表,作为JList的参数private String bookName; //在输入关键字查询列表中被选中的书名private String borrowDay="10"; //借阅天数默认为10天public selectBook(){super(); textSelect=new JTextField(); textSelect.setPreferredSize(new Dimension(500,30)); bookSelect=new Vector(); JButton button=new JButton("搜索"); //搜索按钮button.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent arg0) {String keyBookName=textSelect.getText().trim(); //获取用户输入关键词,然后对关键词去除前后空格selectBookName(keyBookName); //调用函数list.setListData(bookSelect); //添加搜索的数据list.repaint(); //重绘列表}}); Box box=Box.createHorizontalBox(); box.add(textSelect); box.add(Box.createHorizontalStrut(30)); box.add(button); box.setBounds(180,100,600,30); add(box); Font font=new Font("宋体",0,20); list=new JList(); //显示搜索得到的相关书籍list.setPreferredSize(new Dimension(200, 100)); list.setFont(font); list.setListData(bookSelect); list.addListSelectionListener(new ListSelectionListener(){@Overridepublic void valueChanged(ListSelectionEvent arg0) {bookName=list.getSelectedValue(); //bookName为用户点击可能借阅的书名}}); //添加滚动条JScrollPane scroll=new JScrollPane(list,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS ,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scroll.setBounds(100,150,800,500); add(scroll); JLabel label=new JLabel("天数:"); label.setBounds(350,650,100,50); add(label); textDay=new JTextField(); textDay.setBounds(400,665,50,20); add(textDay); JButton button1=new JButton("借阅"); button1.setBounds(380,700,70,35); button1.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent arg0) {if(bookName!=null)//调用更新数据库的信息{String tempt=textDay.getText(); //判断用户是否有输入借阅天数,没有默认为10天if(!tempt.equals("")){borrowDay=tempt; }System.out.println(tempt); updateInformation(); }else{System.out.println("还未确定借阅的书籍!"); }}}); add(button1); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setSize(1000,800); setLocation(400,200); setLayout(null); setVisible(true); }//连接数据库private void selectBookName(String name){String[] tempt=name.split(""); //对用户输入的关键字进行简单的除去空格处理name="%"; for(int i=0; i
还书部分
自动查询该账户未还书籍显示在列表框中,可以点击对应书籍还书。
package booksystem; import java.sql.SQLException; import java.sql.Statement; import java.util.Vector; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.ResultSet; import javax.swing.*; /* * 还书 * * 当界面做好后,在还书时若没有查询到书本的信息说明书名输入错误,这里直接退出程序,可以优化为提示输入错误并重新输入书名 */import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /* * 还书 * */@SuppressWarnings("serial")public class returnBookextends JFrame{private String bookName; //书名private String borrowTime; //借阅天数private JList list; //未还书籍的列表private Vector bookSelect; //未还书籍列表,作为JList的参数//窗口界面初始化public returnBook(){super(); bookSelect=new Vector(); findBook(zhuYe.zh,zhuYe.pw); //初始化bookSelect作为JList的内容参数Font font=new Font("宋体",0,20); list=new JList(); list.setPreferredSize(new Dimension(200, 100)); list.setListData(bookSelect); list.setFont(font); list.addListSelectionListener(new ListSelectionListener(){@Overridepublic void valueChanged(ListSelectionEvent arg0) {String[] tempt=list.getSelectedValue().split(">>"); //将用户选中的书名和借书时间分开存放if(tempt[0]!=null)//判断字符串处理是否有异常,有异常则退出程序{bookName=tempt[0]; }else{System.out.println("书名为空!"); System.exit(0); }if(tempt[1]!=null){borrowTime=tempt[1]; }else{System.out.println("借书时间为空!"); System.exit(0); }System.out.println(bookName+borrowTime); }}); JScrollPane scroll=new JScrollPane(list,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS ,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scroll.setBounds(100,150,800,500); JButton button1=new JButton("归还"); //点击按钮,归还书籍button1.setBounds(400,670,70,35); button1.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent arg0) {if(bookName!=null)updateNumber(); //list.repaint(); //想要再归还书籍后刷新页面,不成功}}); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setSize(1000,800); setLocation(400,200); setLayout(null); setVisible(true); add(scroll); add(button1); }/** 在图书馆总图书目录中更新书籍的数量* 然后在个人借阅未还记录中删除记录,再在个人已还记录中插入记录* */private void updateNumber(){try(Statement statement=jdbcConnection.getConnection().createStatement(); //直接调用函数连接数据库){String sql1="select * from book_information where 书名='"+bookName+"'; "; //这里的数量和书名有待检查修改System.out.println(sql1); ResultSet set=statement.executeQuery(sql1); if(set.next())//搜索不到这种书的信息,退出系统{Integer number=set.getInt("数量")+1; String sql2="update book_information set 数量="+number+"where 书名='"+bookName+"'; "; statement.execute(sql2); System.out.println(sql2); }else{System.out.println("没有这种书的记录!"); System.exit(0); }String sql="select * from "+zhuYe.zh+zhuYe.pw+"_no_book_informationwhere 书名='"+bookName+"' and 借书时间='"+borrowTime+"'; "; ResultSet set1=statement.executeQuery(sql); if(set1.next()){String sql3="insert into "+zhuYe.zh+zhuYe.pw+"_already_book_information values('"+set1.getString("书名")+"','"+set1.getString("借书时间")+"',"+set1.getString("借阅天数")+",'"+set1.getString("应还时间")+"',"+"now()); "; System.out.println(sql3); statement.execute(sql3); String sql4="delete from "+zhuYe.zh+zhuYe.pw+"_no_book_information where 书名='"+bookName+"' and 借书时间='"+borrowTime+"'; "; System.out.println(sql4); statement.execute(sql4); }else{System.out.println(zhuYe.zh+"没有这种书的借阅记录!"); System.exit(0); }}catch(SQLException g){System.out.println("更新数据时出错!"); g.printStackTrace(); System.exit(0); }}private void findBook(String zh,String pw) //从数据库中搜索表返回未归还书名初始化bookSelect{try(Statement statement1=jdbcConnection.getConnection().createStatement(); ){String sql5="select * from "+zh+pw+"_no_book_information; "; ResultSet returnSet=statement1.executeQuery(sql5); while(returnSet.next()){String name=returnSet.getString("书名")+">>"+returnSet.getString("借书时间"); //显示书名和借书时间,这样允许不同时间借同一本书bookSelect.add(name); }if(bookSelect.size()==0)//如果没有借阅记录{bookSelect.add("暂无借阅记录!"); }}catch(SQLException e){System.out.println("还书搜索未还书籍出错!"); e.printStackTrace(); System.exit(0); }}}

查询部分
查询个人账号的未还书籍具体信息,显示在表格中。
package booksystem; import java.awt.*; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Vector; import javax.swing.*; /* * * 查询还未归还的书籍 */@SuppressWarnings("serial")public class findNoReturnBook extends JFrame{private Vector rowData; public findNoReturnBook(){super(); rowData=https://www.it610.com/article/new Vector(); Vector columnNames=new Vector(); columnNames.add("书名"); columnNames.add("借书时间"); columnNames.add("借阅天数"); columnNames.add("应还时间"); findBook(); //初始化rowDataJTable table=new JTable(rowData,columnNames); JScrollPane pane=new JScrollPane(table); table.setPreferredScrollableViewportSize(new Dimension(400, 300)); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setSize(800,600); setLayout(new BorderLayout()); add(pane,BorderLayout.CENTER); setLocation(500,200); setVisible(true); }private void findBook()//查询数据,并用容器收集起来{try(Statement statement=jdbcConnection.getConnection().createStatement(); ){String sql="select * from "+zhuYe.zh+zhuYe.pw+"_no_book_information; "; ResultSet result=statement.executeQuery(sql); while(result.next()){Vector tempt=new Vector(); tempt.add(result.getString("书名")); tempt.add(result.getString("借书时间")); tempt.add(result.getString("借阅天数")); tempt.add(result.getString("应还时间")); if(tempt!=null)rowData.add(tempt); }if(rowData=https://www.it610.com/article/=null){Vector tempt=new Vector(); tempt.add("暂无借阅数据"); rowData.add(tempt); }}catch(SQLException |NullPointerException a){System.out.println("查询数据出错!"); a.printStackTrace(); System.exit(0); }}}

总结:
【Java实现简易图书借阅系统】1).swing的界面设计很不熟练。(个人也觉得用这个工具包设计界面很是麻烦)
2).做项目的过程将界面和功能的实现混在一起,不利于后期的修改。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读