在简单学习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).做项目的过程将界面和功能的实现混在一起,不利于后期的修改。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。