Java实现简易图书借阅系统
在简单学习Java的基础知识点后,动手做了一个十分简陋的图书馆借阅系统,作为对所学知识的综合应用,有不足的地方希望大家多多评论,会积极进行改正。
1.先附上总的效果
一开始的登录界面
登录界面
注册界面
登录进去后的个人主页
(本来想在上方插入一张图片,但是刚学swing部分,搞不懂图片的插入方式,搞了很久还是没懂,就暂时放下了)
借书页面
输入关键词后搜索的结果
还书界面,点击自动显示未还书籍
查询未还书籍的具体信息
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() { @Override public void actionPerformed(ActionEvent e) { new dengLu(); } }); JButton button1=new JButton("注册"); button1.addActionListener(new ActionListener() { @Override public 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); } //事件处理 @Override public 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," + "归还时间 datetime not 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); } @Override public 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("无此账号!"); //查询数据库发现无此账号记录 } else if(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() { @Override public void actionPerformed(ActionEvent arg0) { new selectBook(); } }); JButton button1=new JButton("还书"); button1.setBounds(450,650,150,50); button1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { new returnBook(); } }); JButton button2=new JButton("查询"); button2.setBounds(450,750,150,50); button2.addActionListener(new ActionListener() { @Override public 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<String> list; //显示搜索结果的文本列表 private Vector<String> 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<String>(); JButton button=new JButton("搜索"); //搜索按钮 button.addActionListener(new ActionListener() { @Override public 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<String>(); //显示搜索得到的相关书籍 list.setPreferredSize(new Dimension(200, 100)); list.setFont(font); list.setListData(bookSelect); list.addListSelectionListener(new ListSelectionListener() { @Override public 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() { @Override public 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<tempt.length;++i) //将用户输入的关键词做数据库的模糊查询处理 { if(!tempt[i].equals(" ")) { name=name+tempt[i]+"%"; } } try ( Statement statement=jdbcConnection.getConnection().createStatement(); ) //连接数据,搜索数据库返回搜索结果 { String sql="select * from book_information where 书名 like '"+name+"';"; ResultSet set=statement.executeQuery(sql); while(set.next()) { bookSelect.add(set.getString("书名")); } for(int i=0;i<bookSelect.size();++i) //控制台显示模糊查询的结果,优化时可以作为文件储存 { System.out.println(bookSelect.get(i)); } if(bookSelect==null) { bookSelect.add("暂无该书籍!"); } } catch(SQLException e) { System.out.println("根据关键字模糊查询时出错!"); e.printStackTrace(); System.exit(0); } } //点击借阅按钮后更新数据库的信息 /* * 先将图书馆中对应的书籍数量减一 * 再将借阅的记录更新至个人的借阅未还记录表中 */ private void updateInformation() { try ( Statement statement=jdbcConnection.getConnection().createStatement(); ) { String sql="select * from book_information where 书名='"+bookName+"';"; ResultSet set=statement.executeQuery(sql); if(set.next()) //搜索不到这种书的信息,退出系统 { Integer number=set.getInt("数量")-1; String sql1="update book_information set 数量="+number+" where 书名='"+bookName+"';"; statement.execute(sql1); System.out.println(sql1); } else { System.out.println("没有这种书的记录!"); System.exit(0); } String sql2="insert into "+zhuYe.zh+zhuYe.pw+"_no_book_information values('"+bookName+"',now(),"+borrowDay+",now()+interval "+borrowDay+" day);"; System.out.println(sql2); statement.execute(sql2); } catch(SQLException e) { System.out.println("借阅更新书籍时出错!"); e.printStackTrace(); System.exit(0); } } }
还书部分
自动查询该账户未还书籍显示在列表框中,可以点击对应书籍还书。
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 returnBook extends JFrame { private String bookName; //书名 private String borrowTime; //借阅天数 private JList<String> list; //未还书籍的列表 private Vector<String> bookSelect; //未还书籍列表,作为JList的参数 //窗口界面初始化 public returnBook() { super(); bookSelect=new Vector<String>(); findBook(zhuYe.zh,zhuYe.pw); //初始化bookSelect作为JList的内容参数 Font font=new Font("宋体",0,20); list=new JList<String>(); list.setPreferredSize(new Dimension(200, 100)); list.setListData(bookSelect); list.setFont(font); list.addListSelectionListener(new ListSelectionListener() { @Override public 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() { @Override public 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_information where 书名='"+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<Vector<String>> rowData; public findNoReturnBook() { super(); rowData=new Vector<Vector<String>>(); Vector<String> columnNames=new Vector<String>(); columnNames.add("书名"); columnNames.add("借书时间"); columnNames.add("借阅天数"); columnNames.add("应还时间"); findBook(); //初始化rowData JTable 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<String> tempt=new Vector<String>(); tempt.add(result.getString("书名")); tempt.add(result.getString("借书时间")); tempt.add(result.getString("借阅天数")); tempt.add(result.getString("应还时间")); if(tempt!=null) rowData.add(tempt); } if(rowData==null) { Vector<String> tempt=new Vector<String>(); tempt.add("暂无借阅数据"); rowData.add(tempt); } } catch(SQLException |NullPointerException a) { System.out.println("查询数据出错!"); a.printStackTrace(); System.exit(0); } } }
总结:
1).swing的界面设计很不熟练。(个人也觉得用这个工具包设计界面很是麻烦)
2).做项目的过程将界面和功能的实现混在一起,不利于后期的修改。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
Feign调用服务时丢失Cookie和Header信息的解决方案
这篇文章主要介绍了Feign调用服务时丢失Cookie和Header信息的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-03-03java.lang.IllegalArgumentException:Invalid character&nb
本文介绍了java.lang.IllegalArgumentException: Invalid character found异常的解决,方法包括检查代码中的方法名,使用合适的HTTP请求方法常量,使用第三方HTTP库,检查请求URL以及使用调试和日志工具,通过这些方法,我们可以解决异常并确保网络应用程序的正常运行2023-10-10
最新评论