1、系统框架
Java jdk+ eclipse + mysql数据库
2、系统结构图
3、各模块详细设计
由于这次我们的项目主要是用来熟悉软件工程的流程,所以难度不大。主要模块介绍如下:
1、帐号
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.edu.sau.model; public class User { private int id; private String userName; private String userPassword; private int role = 0; //默认为0->读者 、 1->图书管理员 private String pname; public User(){ this.id = -1; } public User(int id, String userName) { super(); this.id = id; this.userName = userName; } public User(String userName, String userPassword) { super(); this.userName = userName; this.userPassword = userPassword; } public User(int id,String userName, String userPassword, int role,String pname) { super(); this.id = id; this.userName = userName; this.userPassword = userPassword; this.role = role; this.pname = pname; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } public int getRole() { return role; } public void setRole(int role) { this.role = role; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } }
User类实现了对帐号的抽象描述,主要包括用户名,密码,帐号角色以及账号所有人名称。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package cn.edu.sau.dao; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 7 import cn.edu.sau.model.User; 8 9 public class UserDao { 10 public User login(Connection con,User user) throws Exception{ 11 User returnUser = null; 12 String sql = "select * from t_user where userName=? and password=?"; 13 PreparedStatement pstmt = con.prepareStatement(sql); 14 pstmt.setString(1, user.getUserName()); 15 pstmt.setString(2, user.getUserPassword()); 16 ResultSet rs = pstmt.executeQuery(); 17 if(rs.next()){ 18 returnUser = new User(rs.getString("userName"),rs.getString("password"),rs.getInt("role")); 19 } 20 return returnUser; 21 } 22 }
UserDao提供帐号验证的方法并返回帐号对象,为空则帐号不存在。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.edu.sau.view; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.SQLException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; import cn.edu.sau.dao.UserDao; import cn.edu.sau.model.User; import cn.edu.sau.util.DbUtil; import cn.edu.sau.util.StringUtil; import javax.swing.ImageIcon; public class LogonFrm extends JFrame { private JPanel contentPane; private JTextField userNameTxt; private JPasswordField userPasswordTxt; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { LogonFrm frame = new LogonFrm(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public LogonFrm() { setTitle("\u56FE\u4E66\u7BA1\u7406\u7CFB\u7EDF"); UserDao userDao = new UserDao(); DbUtil dbUtil = new DbUtil(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); //设置frame居中 this.setLocationRelativeTo(null); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); init(); } private void reset(){ userNameTxt.setText(""); userPasswordTxt.setText(""); } private void init() { DbUtil dbUtil = new DbUtil(); UserDao userDao = new UserDao(); JLabel lb_userName = new JLabel("\u7528\u6237\u540D\uFF1A"); lb_userName.setBounds(102, 75, 54, 15); contentPane.add(lb_userName); userNameTxt = new JTextField(); userNameTxt.setBounds(166, 72, 152, 21); contentPane.add(userNameTxt); userNameTxt.setColumns(10); JLabel lb_userPassword = new JLabel("\u5BC6 \u7801\uFF1A"); lb_userPassword.setBounds(102, 129, 54, 15); contentPane.add(lb_userPassword); JButton jb_login = new JButton("\u767B\u5F55"); jb_login.setIcon(new ImageIcon("D:\\java\\MyBookManager\\image\\login.png")); jb_login.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String userName = userNameTxt.getText(); String userPassword = new String(userPasswordTxt.getPassword()); if(StringUtil.isEmpty(userName)){ JOptionPane.showMessageDialog(null, "用户名不能为空"); return; } if(StringUtil.isEmpty(userPassword)){ JOptionPane.showMessageDialog(null, "密码不能为空"); return; } User user = new User(userName,userPassword); Connection con = null; try { con = dbUtil.getCon(); User reUser = userDao.login(con, user); if(reUser != null){ dispose();//销毁登录框 if(1 == reUser.getRole()){ new MainFrm().setVisible(true);//创建管理员主界面Firme } else if(0 == reUser.getRole()){ new UserMainFrm(reUser).setVisible(true); } }else{ JOptionPane.showMessageDialog(null, "用户名或密码不正确"); } } catch (Exception e1) { JOptionPane.showMessageDialog(null, "登录失败"); e1.printStackTrace(); } finally{ try { con.close(); } catch (SQLException e1) { e1.printStackTrace(); } } } }); jb_login.setBounds(102, 191, 93, 23); contentPane.add(jb_login); JButton jb_reset = new JButton("\u91CD\u7F6E"); jb_reset.setIcon(new ImageIcon("D:\\java\\MyBookManager\\image\\reset.png")); jb_reset.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { reset(); } }); jb_reset.setBounds(225, 191, 93, 23); contentPane.add(jb_reset); userPasswordTxt = new JPasswordField(); userPasswordTxt.setBounds(166, 126, 152, 21); contentPane.add(userPasswordTxt); JLabel lblNewLabel = new JLabel(" "); lblNewLabel.setIcon(new ImageIcon("D:\\java\\MyBookManager\\image\\logo.png")); lblNewLabel.setBounds(182, 10, 99, 52); contentPane.add(lblNewLabel); } }
登录框界面通过验证逻辑层返回的帐号数据判断帐号是否存在,以及判断帐号权限,打开新的界面。
2、图书类别维护
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.edu.sau.model; public class BookType { private int id; private String bookTypeName; private String bookTypeDesc; public BookType() { super(); } public BookType(String bookTypeName, String bookTypeDesc) { super(); this.bookTypeName = bookTypeName; this.bookTypeDesc = bookTypeDesc; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getBookTypeName() { return bookTypeName; } public void setBookTypeName(String bookTypeName) { this.bookTypeName = bookTypeName; } public String getBookTypeDesc() { return bookTypeDesc; } public void setBookTypeDesc(String bookTypeDesc) { this.bookTypeDesc = bookTypeDesc; } @Override public String toString() { return this.getBookTypeName(); } }
BookType类实现了对图书类别的对象描述,主要有图书类别名称以及图书类别的描述。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.edu.sau.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import cn.edu.sau.model.BookType; import cn.edu.sau.util.StringUtil; public class BookTypeDao { public int bookTypeAdd(Connection con, BookType bookType) throws Exception{ String sql = "insert into t_booktype values(null,?,?)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1,bookType.getBookTypeName()); pstmt.setString(2,bookType.getBookTypeDesc()); return pstmt.executeUpdate(); } public ResultSet bookTypeList(Connection con , BookType bookType) throws Exception{ StringBuffer sb = new StringBuffer("select * from t_booktype"); String bookTypeName = bookType.getBookTypeName(); if(!StringUtil.isEmpty(bookTypeName)){ sb.append(" and bookTypeName like '%"+bookType.getBookTypeName()+"%'"); } PreparedStatement pstmt = con.prepareStatement(sb.toString().replaceAll("and", "where")); return pstmt.executeQuery(); } public int bookTypeModify(Connection con,BookType bookType) throws Exception{ String sql = "update t_bookType set booktypename=? , booktypedesc=? where id=?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, bookType.getBookTypeName()); pstmt.setString(2, bookType.getBookTypeDesc()); pstmt.setInt(3, bookType.getId()); return pstmt.executeUpdate(); } public int bookTypeDelete(Connection con,String id) throws Exception{ String sql = "delete from t_bookType where id=?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1,id); return pstmt.executeUpdate(); } }
BookTypeDao类提供了添加图书类别,获取图书类别列表,更改图书类别以及删除图书类别方法。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
String bookTypeName = bookTypeNameTxt.getText(); String bookTypeDesc = bookTypeDescTxt.getText(); if(StringUtil.isEmpty(bookTypeName)){ JOptionPane.showMessageDialog(null,"图书类别名称不能为空"); }else{ Connection con = null; try { con = dbUtil.getCon(); BookType bookType = new BookType(bookTypeName,bookTypeDesc); int ret = bookTypeDao.bookTypeAdd(con, bookType); if(1 == ret){ JOptionPane.showMessageDialog(null, "图书类别添加成功"); reset(); }else{ JOptionPane.showMessageDialog(null, "图书类别添加失败"); } } catch (Exception e1) { JOptionPane.showMessageDialog(null, "图书类别添加失败"); e1.printStackTrace(); } } }
图书类别添加界面获取用户输入,进行图书类别的添加。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
private void fillTable(BookType bookType){ DefaultTableModel dtm = (DefaultTableModel)bookTypeTable.getModel(); dtm.setRowCount(0); Connection con = null; try { con = dbUtil.getCon(); ResultSet res = bookTypeDao.bookTypeList(con, bookType); while(res.next()){ Vector v = new Vector(); v.add(res.getString("id")); v.add(res.getString("bookTypeName")); v.add(res.getString("bookTypeDesc")); dtm.addRow(v); } } catch (Exception e) { e.printStackTrace(); } finally{ try { dbUtil.closeCon(con); } catch (Exception e) { e.printStackTrace(); } } } //鼠标点击表格填充内容至相应位置 bookTypeTable.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { int row = bookTypeTable.getSelectedRow(); idTxt.setText((String)bookTypeTable.getValueAt(row, 0)); bookTypeNameTxt.setText((String)bookTypeTable.getValueAt(row, 1)); bookTypeDescTxt.setText((String)bookTypeTable.getValueAt(row, 2)); } }); //修改图书类别函数体 String bookTypeName = bookTypeNameTxt.getText(); String bookTypeDesc = bookTypeDescTxt.getText(); if(StringUtil.isEmpty(bookTypeName)){ JOptionPane.showMessageDialog(null, "图书类别名称不能为空"); } BookType bookType = new BookType(bookTypeName,bookTypeDesc); bookType.setId(Integer.parseInt(idTxt.getText())); Connection con = null; try { con = dbUtil.getCon(); int re = bookTypeDao.bookTypeModify(con, bookType); if(1 == re){ JOptionPane.showMessageDialog(null, "修改成功"); fillTable(new BookType("","")); reset(); }else{ JOptionPane.showMessageDialog(null, "修改失败"); } } catch (Exception e1) { JOptionPane.showMessageDialog(null, "修改失败"); e1.printStackTrace(); }finally{ try { dbUtil.closeCon(con); } catch (Exception e1) { e1.printStackTrace(); } } //删除图书类别函数体 String id = idTxt.getText(); Connection con = null; try { con = dbUtil.getCon(); int re = bookTypeDao.bookTypeDelete(con, id); if(1 == re){ JOptionPane.showMessageDialog(null, "删除成功"); fillTable(new BookType("","")); reset(); }else{ JOptionPane.showMessageDialog(null, "删除失败"); } } catch (Exception e1) { JOptionPane.showMessageDialog(null, "删除失败"); e1.printStackTrace(); } finally{ try { dbUtil.closeCon(con); } catch (Exception e1) { e1.printStackTrace(); } }
fillTable为图书类别管理界面函数,填充界面表格元素的内容。其余函数在代码中有注释,分别为表格的点击自动填充、修改图书类别、删除图书类别代码实现
3、图书维护
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.edu.sau.model; /** * 图书类 * */ public class Book { private int id; private String bookName; private String bookAuthor; private float bookPrice; private String bookDesc; private int bookTypeId; private String bookTypeName; public Book() { super(); this.id = -1; this.bookName = ""; this.bookAuthor = ""; this.bookPrice = 0; this.bookDesc = ""; this.bookTypeId = -1; } public Book(int id, String bookName) { super(); this.id = id; this.bookName = bookName; } public Book(int id, String bookName, String bookAuthor, float bookPrice, String bookDesc, int bookTypeId) { super(); this.id = id; this.bookName = bookName; this.bookAuthor = bookAuthor; this.bookPrice = bookPrice; this.bookDesc = bookDesc; this.bookTypeId = bookTypeId; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public String getBookAuthor() { return bookAuthor; } public void setBookAuthor(String bookAuthor) { this.bookAuthor = bookAuthor; } public float getBookPrice() { return bookPrice; } public void setBookPrice(float bookPrice) { this.bookPrice = bookPrice; } public String getBookDesc() { return bookDesc; } public void setBookDesc(String bookDesc) { this.bookDesc = bookDesc; } public int getBookTypeId() { return bookTypeId; } public void setBookTypeId(int bookTypeId) { this.bookTypeId = bookTypeId; } public String getBookTypeName() { return bookTypeName; } public void setBookTypeName(String bookTypeName) { this.bookTypeName = bookTypeName; } }
该类为图书的抽象类,完成了对图书的抽象描述。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.edu.sau.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import cn.edu.sau.model.Book; import cn.edu.sau.model.BookType; import cn.edu.sau.util.StringUtil; public class BookDao { public static int bookAdd(Connection con , Book book) throws Exception{ String sql = "insert into t_book values(null,?,?,?,?,?)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1,book.getBookName()); pstmt.setString(2,book.getBookAuthor()); pstmt.setFloat(3,book.getBookPrice()); pstmt.setString(4,book.getBookDesc()); pstmt.setInt(5,book.getBookTypeId()); return pstmt.executeUpdate(); } public ResultSet bookList(Connection con,Book book)throws Exception{ StringBuffer sb=new StringBuffer("select * from t_book b,t_bookType bt where b.bookTypeId=bt.id"); if(StringUtil.isNotEmpty(book.getBookName())){ sb.append(" and b.bookName like '%"+book.getBookName()+"%'"); } if(StringUtil.isNotEmpty(book.getBookAuthor())){ sb.append(" and b.author like '%"+book.getBookAuthor()+"%'"); } if(book.getBookTypeId()!=-1){ sb.append(" and b.bookTypeId = "+book.getBookTypeId()); } PreparedStatement pstmt=con.prepareStatement(sb.toString()); return pstmt.executeQuery(); } public int bookDelete(Connection con,String id)throws Exception{ String sql="delete from t_book where id=?"; PreparedStatement pstmt=con.prepareStatement(sql); pstmt.setString(1, id); return pstmt.executeUpdate(); } public int bookModify(Connection con,Book book) throws Exception{ String sql="update t_book set bookName=?,author=?,price=?,bookDesc=?,bookTypeId=? where id=?"; PreparedStatement pstmt=con.prepareStatement(sql); pstmt.setString(1, book.getBookName()); pstmt.setString(2, book.getBookAuthor()); pstmt.setFloat(3, book.getBookPrice()); pstmt.setString(4, book.getBookDesc()); pstmt.setInt(5, book.getBookTypeId()); pstmt.setInt(6, book.getId()); return pstmt.executeUpdate(); } public boolean getBookByBookTypeId(Connection con,String bookTypeId)throws Exception{ String sql="select * from t_book where bookTypeId=?"; PreparedStatement pstmt=con.prepareStatement(sql); pstmt.setString(1, bookTypeId); ResultSet rs=pstmt.executeQuery(); return rs.next(); } }
该类和图书类别维护的Dao层类相似,实现了图书添加,图书类别,图书修改以及图书删除的方法。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.edu.sau.view; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextArea; import javax.swing.JTextField; import cn.edu.sau.dao.BookDao; import cn.edu.sau.dao.BookTypeDao; import cn.edu.sau.model.Book; import cn.edu.sau.model.BookType; import cn.edu.sau.util.DbUtil; import cn.edu.sau.util.StringUtil; import javax.swing.ImageIcon; public class BookAddInterFrm extends JInternalFrame { DbUtil dbUtil = new DbUtil(); BookTypeDao bookTypeDao = new BookTypeDao(); BookDao bookDao = new BookDao(); private JTextField bookNameTxt; private JTextField bookAuthorTxt; private JTextField bookPriceTxt; private JComboBox jcb_bookType; private JTextArea bookDescTxt; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { BookAddInterFrm frame = new BookAddInterFrm(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public BookAddInterFrm() { setClosable(true); setIconifiable(true); setTitle("\u56FE\u4E66\u6DFB\u52A0"); setBounds(100, 100, 474, 443); setLocation(500, 100); getContentPane().setLayout(null); init(); fillBookType(); } private void init() { JLabel lb_bookName = new JLabel("\u56FE\u4E66\u540D\u79F0\uFF1A"); lb_bookName.setBounds(29, 39, 72, 15); getContentPane().add(lb_bookName); bookNameTxt = new JTextField(); bookNameTxt.setBounds(112, 36, 106, 21); getContentPane().add(bookNameTxt); bookNameTxt.setColumns(10); JLabel lb_bookAuthor = new JLabel("\u56FE\u4E66\u4F5C\u8005\uFF1A"); lb_bookAuthor.setBounds(236, 39, 72, 15); getContentPane().add(lb_bookAuthor); bookAuthorTxt = new JTextField(); bookAuthorTxt.setBounds(304, 36, 101, 21); getContentPane().add(bookAuthorTxt); bookAuthorTxt.setColumns(10); JLabel lb_bookPrice = new JLabel("\u56FE\u4E66\u4EF7\u683C\uFF1A"); lb_bookPrice.setBounds(29, 100, 72, 15); getContentPane().add(lb_bookPrice); bookPriceTxt = new JTextField(); bookPriceTxt.setBounds(112, 97, 106, 21); getContentPane().add(bookPriceTxt); bookPriceTxt.setColumns(10); JLabel lb_bookType = new JLabel("\u56FE\u4E66\u7C7B\u522B\uFF1A"); lb_bookType.setBounds(236, 100, 74, 15); getContentPane().add(lb_bookType); jcb_bookType = new JComboBox(); jcb_bookType.setBounds(304, 97, 101, 21); getContentPane().add(jcb_bookType); JLabel lb_bookDesc = new JLabel("\u56FE\u4E66\u7B80\u4ECB\uFF1A"); lb_bookDesc.setBounds(28, 176, 73, 15); getContentPane().add(lb_bookDesc); bookDescTxt = new JTextArea(); bookDescTxt.setBounds(112, 172, 297, 127); getContentPane().add(bookDescTxt); JButton jb_bookAdd = new JButton("\u6DFB\u52A0"); jb_bookAdd.setIcon(new ImageIcon("D:\\java\\MyBookManager\\image\\add.png")); jb_bookAdd.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String bookName = bookNameTxt.getText(); String bookAuthor = bookAuthorTxt.getText(); String bookPrice = bookPriceTxt.getText(); String bookDesc = bookDescTxt.getText(); if(StringUtil.isEmpty(bookName)){ JOptionPane.showMessageDialog(null, "图书名称不能为空"); return; } if(StringUtil.isEmpty(bookAuthor)){ JOptionPane.showMessageDialog(null, "图书作者不能为空"); return; } if(StringUtil.isEmpty(bookPrice)){ JOptionPane.showMessageDialog(null, "图书价格不能为空"); return; } BookType bookType = (BookType)jcb_bookType.getSelectedItem(); int bookTypeId = bookType.getId(); Book book = new Book(-1,bookName,bookAuthor,Float.parseFloat(bookPrice),bookDesc,bookTypeId); Connection con = null; try{ con = dbUtil.getCon(); int addNum = BookDao.bookAdd(con,book); if(1 == addNum){ JOptionPane.showMessageDialog(null, "添加成功"); resetValue(); }else{ JOptionPane.showMessageDialog(null, "添加失败"); } }catch(Exception ex){ ex.printStackTrace(); JOptionPane.showMessageDialog(null, "添加失败"); }finally{ try { con.close(); } catch (SQLException e1) { e1.printStackTrace(); } } } }); jb_bookAdd.setBounds(115, 339, 93, 23); getContentPane().add(jb_bookAdd); JButton jb_bookReset = new JButton("\u91CD\u7F6E"); jb_bookReset.setIcon(new ImageIcon("D:\\java\\MyBookManager\\image\\reset.png")); jb_bookReset.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { resetValue(); } }); jb_bookReset.setBounds(264, 339, 93, 23); getContentPane().add(jb_bookReset); } private void fillBookType(){ Connection con = null; BookType bookType = null; try{ con = dbUtil.getCon(); ResultSet rs = bookTypeDao.bookTypeList(con, new BookType("","")); while(rs.next()){ bookType = new BookType(); bookType.setId(rs.getInt("id")); bookType.setBookTypeName(rs.getString("bookTypeName")); jcb_bookType.addItem(bookType); } }catch(Exception ex){ ex.printStackTrace(); }finally{ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } private void resetValue(){ bookNameTxt.setText(""); bookAuthorTxt.setText(""); bookPriceTxt.setText(""); jcb_bookType.setSelectedIndex(0); bookDescTxt.setText(""); } }
界面中提供了添加图书的具体实现,以及其中将图书类别添加进下拉框的方法。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.edu.sau.view; import java.awt.Component; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.ResultSet; import java.util.Vector; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import javax.swing.table.DefaultTableModel; import org.eclipse.wb.swing.FocusTraversalOnArray; import cn.edu.sau.dao.BookDao; import cn.edu.sau.dao.BookTypeDao; import cn.edu.sau.model.Book; import cn.edu.sau.model.BookType; import cn.edu.sau.util.DbUtil; import cn.edu.sau.util.StringUtil; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; public class BookManageInterFrm extends JInternalFrame { DbUtil dbUtil = new DbUtil(); BookTypeDao bookTypeDao = new BookTypeDao(); BookDao bookDao = new BookDao(); private JTextField s_bookNameTxt; private JTextField s_bookAuthorTxt; private JTable bookTable; private JTextField idTxt; private JTextField bookNameTxt; private JTextField bookAuthorTxt; private JTextField bookPriceTxt; private JTextArea bookDescTxt; private JScrollPane scrollPane; private JComboBox<BookType> s_jcbBookType; private JComboBox<BookType> jcb_bookType; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { BookManageInterFrm frame = new BookManageInterFrm(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public BookManageInterFrm() { setClosable(true); setIconifiable(true); setTitle("\u56FE\u4E66\u7BA1\u7406"); setBounds(100, 100, 812, 618); setLocation(300, 20); getContentPane().setLayout(null); init(); fillTable(new Book()); this.fillBookType("search"); this.fillBookType("modify"); } private void fillBookType(String type) { Connection con = null; BookType bookType = null; try { con = dbUtil.getCon(); ResultSet rs = bookTypeDao.bookTypeList(con, new BookType()); if ("search".equals(type)) { bookType = new BookType(); bookType.setBookTypeName("请选择..."); bookType.setId(-1); this.s_jcbBookType.addItem(bookType); } while (rs.next()) { bookType = new BookType(); bookType.setId(rs.getInt("id")); bookType.setBookTypeName(rs.getString("bookTypeName")); if ("search".equals(type)) { this.s_jcbBookType.addItem(bookType); } else if ("modify".equals(type)) { this.jcb_bookType.addItem(bookType); } } } catch (Exception e) { e.printStackTrace(); } finally { try { dbUtil.closeCon(con); } catch (Exception e) { e.printStackTrace(); } } } private void fillTable(Book book) { DefaultTableModel dtm = (DefaultTableModel)bookTable.getModel(); dtm.setRowCount(0); Connection con = null; try { con = dbUtil.getCon(); ResultSet rs = bookDao.bookList(con, book); while (rs.next()) { Vector v = new Vector(); v.add(rs.getInt("id")); v.add(rs.getString("bookName")); v.add(rs.getString("author")); v.add(rs.getFloat("price")); v.add(rs.getString("bookDesc")); v.add(rs.getString("bookTypeName")); dtm.addRow(v); } } catch (Exception e) { e.printStackTrace(); } finally { try { dbUtil.closeCon(con); } catch (Exception e) { e.printStackTrace(); } } } private void init() { scrollPane = new JScrollPane(); scrollPane.setToolTipText(""); scrollPane.setBounds(30, 91, 732, 178); getContentPane().add(scrollPane); bookTable = new JTable(); bookTable.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { int row = bookTable.getSelectedRow(); idTxt.setText((Integer)bookTable.getValueAt(row, 0)+""); bookNameTxt.setText((String) bookTable.getValueAt(row, 1)); bookAuthorTxt.setText((String) bookTable.getValueAt(row, 2)); bookPriceTxt.setText((Float) bookTable.getValueAt(row, 3) + ""); bookDescTxt.setText(bookTable.getValueAt(row, 4) + ""); String bookTypeName = (String) bookTable.getValueAt(row, 5); int n = jcb_bookType.getItemCount(); for (int i = 0; i < n; i++) { BookType item = (BookType) jcb_bookType.getItemAt(i); if (item.getBookTypeName().equals(bookTypeName)) { jcb_bookType.setSelectedIndex(i); } } } }); bookTable.setToolTipText("\u56FE\u4E66"); bookTable.setSurrendersFocusOnKeystroke(true); bookTable.setModel(new DefaultTableModel( new Object[][] { {null, null, null, null, null, null}, }, new String[] { "\u56FE\u4E66\u7F16\u53F7", "\u56FE\u4E66\u540D\u79F0", "\u56FE\u4E66\u4F5C\u8005", "\u56FE\u4E66\u4EF7\u683C", "\u56FE\u4E66\u63CF\u8FF0", "\u56FE\u4E66\u7C7B\u522B" } ) { boolean[] columnEditables = new boolean[] { true, false, false, false, false, false }; public boolean isCellEditable(int row, int column) { return columnEditables[column]; } }); bookTable.getColumnModel().getColumn(1).setPreferredWidth(100); bookTable.getColumnModel().getColumn(2).setPreferredWidth(92); bookTable.getColumnModel().getColumn(3).setPreferredWidth(94); bookTable.getColumnModel().getColumn(4).setPreferredWidth(164); bookTable.getColumnModel().getColumn(5).setPreferredWidth(97); scrollPane.setViewportView(bookTable); JPanel panel = new JPanel(); panel.setBorder(new TitledBorder(null, "\u641C\u7D22\u6761\u4EF6", TitledBorder.LEADING, TitledBorder.TOP, null, null)); panel.setToolTipText("\u641C\u7D22\u6761\u4EF6"); panel.setBounds(31, 14, 732, 68); getContentPane().add(panel); panel.setLayout(null); JLabel label = new JLabel("\u56FE\u4E66\u7C7B\u522B\uFF1A\r\n"); label.setBounds(410, 29, 72, 15); panel.add(label); JLabel lblNewLabel_1 = new JLabel("\u56FE\u4E66\u4F5C\u8005\uFF1A"); lblNewLabel_1.setBounds(209, 29, 72, 15); panel.add(lblNewLabel_1); JLabel lblNewLabel = new JLabel("\u56FE\u4E66\u540D\u79F0\uFF1A"); lblNewLabel.setBounds(10, 29, 67, 15); panel.add(lblNewLabel); s_bookNameTxt = new JTextField(); s_bookNameTxt.setBounds(84, 26, 114, 21); panel.add(s_bookNameTxt); s_bookNameTxt.setColumns(10); s_bookAuthorTxt = new JTextField(); s_bookAuthorTxt.setBounds(285, 26, 114, 21); panel.add(s_bookAuthorTxt); s_bookAuthorTxt.setColumns(10); JButton jb_search = new JButton("\u67E5\u8BE2"); jb_search.setIcon(new ImageIcon("D:\\java\\MyBookManager\\image\\search.png")); jb_search.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Book book = new Book(); String bookName = s_bookNameTxt.getText(); String bookAuthor = s_bookAuthorTxt.getText(); BookType bookType = (BookType)s_jcbBookType.getSelectedItem(); int bookTypeId = bookType.getId(); book.setBookName(bookName); book.setBookAuthor(bookAuthor); book.setBookTypeId(bookTypeId); fillTable(book); } }); jb_search.setBounds(629, 25, 93, 23); panel.add(jb_search); s_jcbBookType = new JComboBox<BookType>(); s_jcbBookType.setBounds(472, 26, 131, 21); panel.add(s_jcbBookType); panel.setFocusTraversalPolicy(new FocusTraversalOnArray(new Component[]{label, lblNewLabel_1, lblNewLabel, s_bookNameTxt, s_bookAuthorTxt, jb_search, s_jcbBookType})); JPanel panel_1 = new JPanel(); panel_1.setBorder(new TitledBorder(null, "\u8868\u5355\u64CD\u4F5C", TitledBorder.LEADING, TitledBorder.TOP, null, null)); panel_1.setToolTipText("\u8868\u5355\u64CD\u4F5C"); panel_1.setBounds(32, 283, 732, 274); getContentPane().add(panel_1); panel_1.setLayout(null); JLabel label_1 = new JLabel("\u7F16\u53F7\uFF1A"); label_1.setBounds(10, 41, 57, 15); panel_1.add(label_1); idTxt = new JTextField(); idTxt.setEditable(false); idTxt.setBounds(96, 38, 118, 21); panel_1.add(idTxt); idTxt.setColumns(10); JLabel label_2 = new JLabel("\u56FE\u4E66\u540D\u79F0\uFF1A"); label_2.setBounds(10, 81, 76, 15); panel_1.add(label_2); bookNameTxt = new JTextField(); bookNameTxt.setBounds(96, 78, 118, 21); panel_1.add(bookNameTxt); bookNameTxt.setColumns(10); JLabel label_3 = new JLabel("\u56FE\u4E66\u4F5C\u8005\uFF1A"); label_3.setBounds(224, 81, 65, 15); panel_1.add(label_3); bookAuthorTxt = new JTextField(); bookAuthorTxt.setColumns(10); bookAuthorTxt.setBounds(299, 78, 118, 21); panel_1.add(bookAuthorTxt); JLabel label_4 = new JLabel("\u56FE\u4E66\u4EF7\u683C\uFF1A"); label_4.setBounds(10, 160, 76, 15); panel_1.add(label_4); bookPriceTxt = new JTextField(); bookPriceTxt.setBounds(96, 157, 117, 21); panel_1.add(bookPriceTxt); bookPriceTxt.setColumns(10); JLabel label_5 = new JLabel("\u56FE\u4E66\u7C7B\u522B\uFF1A"); label_5.setBounds(224, 160, 65, 15); panel_1.add(label_5); jcb_bookType = new JComboBox<BookType>(); jcb_bookType.setBounds(299, 157, 118, 21); panel_1.add(jcb_bookType); JLabel label_6 = new JLabel("\u56FE\u4E66\u63CF\u8FF0\uFF1A"); label_6.setBounds(439, 81, 65, 15); panel_1.add(label_6); bookDescTxt = new JTextArea(); bookDescTxt.setBounds(514, 77, 208, 98); panel_1.add(bookDescTxt); JButton jb_modify = new JButton("\u4FEE\u6539"); jb_modify.setIcon(new ImageIcon("D:\\java\\MyBookManager\\image\\modify.png")); jb_modify.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String id = idTxt.getText(); if (StringUtil.isEmpty(id)) { JOptionPane.showMessageDialog(null, "请选择要修改的记录!"); return; } String bookName=bookNameTxt.getText(); String author=bookAuthorTxt.getText(); String price=bookPriceTxt.getText(); String bookDesc=bookDescTxt.getText(); if(StringUtil.isEmpty(bookName)){ JOptionPane.showMessageDialog(null, "图书名称不能为空!"); return; } if(StringUtil.isEmpty(author)){ JOptionPane.showMessageDialog(null, "图书作者不能为空!"); return; } if(StringUtil.isEmpty(price)){ JOptionPane.showMessageDialog(null, "图书价格不能为空!"); return; } BookType bookType=(BookType) jcb_bookType.getSelectedItem(); int bookTypeId=bookType.getId(); Book book=new Book(Integer.parseInt(id),bookName,author,Float.parseFloat(price), bookDesc, bookTypeId); Connection con = null; try { con = dbUtil.getCon(); int modifyNum = bookDao.bookModify(con, book); if (modifyNum == 1) { JOptionPane.showMessageDialog(null, "修改成功"); resetValue(); fillTable(new Book()); } else { JOptionPane.showMessageDialog(null, "修改失败"); } } catch (Exception ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(null, "修改失败"); } finally { try { dbUtil.closeCon(con); } catch (Exception ec) { ec.printStackTrace(); } } } }); jb_modify.setBounds(66, 225, 93, 23); panel_1.add(jb_modify); JButton jb_delete = new JButton("\u5220\u9664"); jb_delete.setIcon(new ImageIcon("D:\\java\\MyBookManager\\image\\delete.png")); jb_delete.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String id = idTxt.getText(); if (StringUtil.isEmpty(id)) { JOptionPane.showMessageDialog(null, "请选择要删除的记录!"); return; } int n = JOptionPane.showConfirmDialog(null, "确定要删除这条记录吗?"); if (n == 0) { Connection con=null; try { con = dbUtil.getCon(); int re = bookDao.bookDelete(con, id); if(1 == re){ JOptionPane.showMessageDialog(null, "删除成功"); resetValue(); fillTable(new Book()); }else JOptionPane.showMessageDialog(null, "删除失败"); } catch (Exception e1) { JOptionPane.showMessageDialog(null, "删除失败"); e1.printStackTrace(); } } } }); jb_delete.setBounds(257, 225, 93, 23); panel_1.add(jb_delete); } private void resetValue() { this.idTxt.setText(""); this.bookNameTxt.setText(""); this.bookAuthorTxt.setText(""); this.bookPriceTxt.setText(""); this.bookDescTxt.setText(""); if (jcb_bookType.getItemCount() > 0) { jcb_bookType.setSelectedIndex(0); } } }
提供图书管理功能,主要功能和图书类别管理类似,这里不再赘述。
4、读者借阅图书
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.edu.sau.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import cn.edu.sau.model.Book; import cn.edu.sau.model.User; import cn.edu.sau.util.StringUtil; public class UserDao { public User login(Connection con, User user) throws Exception { User returnUser = null; String sql = "select * from t_user where userName=? and password=?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, user.getUserName()); pstmt.setString(2, user.getUserPassword()); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { returnUser = new User(rs.getInt("id"), rs.getString("userName"), rs.getString("password"), rs.getInt("role"), rs.getString("pname")); } return returnUser; } // 借书 public int lendBook(Connection con, int userId, int bookId) throws Exception { String sql = "insert into t_lendbook values(null,?,?)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setInt(1, userId); pstmt.setInt(2, bookId); return pstmt.executeUpdate(); } // 还书 public int returnBook(Connection con, String id) throws Exception { String sql = "delete from t_lendbook where id=?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, id); return pstmt.executeUpdate(); } public ResultSet lendBookList(Connection con, User user, Book book) throws Exception { StringBuffer sb = new StringBuffer("select * from t_lendbook "); if(user!=null && user.getId()!= -1){ sb.append(" and userid = "+user.getId()); } if(book!=null && book.getId()!=-1){ sb.append(" and bookid ="+book.getId()); } PreparedStatement pstmt = con.prepareStatement(sb.toString().replaceFirst("and", "where")); return pstmt.executeQuery(); } public String getPnameById(Connection con, int userId) throws Exception { String sql = "select * from t_user where id=?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setInt(1, userId); ResultSet rs = pstmt.executeQuery(); if (rs.next()) return rs.getString("pname"); else return null; } }
提供借书,还书,读取借书类别清单,以及辅助函数(根据用户id获取用户姓名)等方法。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.edu.sau.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.sql.Connection; import java.sql.ResultSet; import java.util.Vector; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; import javax.swing.border.TitledBorder; import javax.swing.table.DefaultTableModel; import cn.edu.sau.dao.BookDao; import cn.edu.sau.dao.BookTypeDao; import cn.edu.sau.dao.UserDao; import cn.edu.sau.model.Book; import cn.edu.sau.model.BookType; import cn.edu.sau.model.User; import cn.edu.sau.util.DbUtil; import java.awt.Window.Type; import javax.swing.ImageIcon; public class UserMainFrm extends JFrame { private User user; DbUtil dbUtil = new DbUtil(); BookDao bookDao = new BookDao(); BookTypeDao bookTypeDao = new BookTypeDao(); UserDao userDao = new UserDao(); private JPanel contentPane; private JPanel panel; private JTextField bookNameTxt; private JTextField bookAuthorTxt; private JComboBox<BookType> jcb_bookType; private JButton jb_search; private JTable table; private JTextField s_idTxt; private JButton jb_lendBook; private JTextField s_bookNameTxt; /** * Launch the application. */ /*public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { UserMainFrm frame = new UserMainFrm(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); }*/ /** * Create the frame. */ public UserMainFrm(User user) { setTitle("\u501F\u9605\u7CFB\u7EDF"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 835, 445); this.user = user; JOptionPane.showMessageDialog(null, "欢迎"+user.getPname()+"使用我们的系统"); init(); fillTable(new Book()); this.fillBookType("search"); this.fillBookType("modify"); } private void fillBookType(String type) { Connection con = null; BookType bookType = null; try { con = dbUtil.getCon(); ResultSet rs = bookTypeDao.bookTypeList(con, new BookType()); if ("search".equals(type)) { bookType = new BookType(); bookType.setBookTypeName("请选择..."); bookType.setId(-1); this.jcb_bookType.addItem(bookType); } while (rs.next()) { bookType = new BookType(); bookType.setId(rs.getInt("id")); bookType.setBookTypeName(rs.getString("bookTypeName")); if ("search".equals(type)) { this.jcb_bookType.addItem(bookType); } else if ("modify".equals(type)) { this.jcb_bookType.addItem(bookType); } } } catch (Exception e) { e.printStackTrace(); } finally { try { dbUtil.closeCon(con); } catch (Exception e) { e.printStackTrace(); } } } private void fillTable(Book book) { DefaultTableModel dtm = (DefaultTableModel)table.getModel(); dtm.setRowCount(0); Connection con = null; try { con = dbUtil.getCon(); ResultSet rs = bookDao.bookList(con, book); while (rs.next()) { Vector v = new Vector(); v.add(rs.getInt("id")); v.add(rs.getString("bookName")); v.add(rs.getString("author")); v.add(rs.getFloat("price")); v.add(rs.getString("bookDesc")); v.add(rs.getString("bookTypeName")); String state = rs.getInt("state")==1?"借阅中":"正常"; v.add(state); dtm.addRow(v); } } catch (Exception e) { e.printStackTrace(); } finally { try { dbUtil.closeCon(con); } catch (Exception e) { e.printStackTrace(); } } } private void init() { contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); panel = new JPanel(); panel.setLayout(null); panel.setToolTipText("\u641C\u7D22\u6761\u4EF6"); panel.setBorder(new TitledBorder(null, "\u641C\u7D22\u6761\u4EF6", TitledBorder.LEADING, TitledBorder.TOP, null, null)); panel.setBounds(43, 28, 732, 68); contentPane.add(panel); JLabel label = new JLabel("\u56FE\u4E66\u7C7B\u522B\uFF1A\r\n"); label.setBounds(410, 29, 72, 15); panel.add(label); JLabel label_1 = new JLabel("\u56FE\u4E66\u4F5C\u8005\uFF1A"); label_1.setBounds(209, 29, 72, 15); panel.add(label_1); JLabel label_2 = new JLabel("\u56FE\u4E66\u540D\u79F0\uFF1A"); label_2.setBounds(10, 29, 67, 15); panel.add(label_2); bookNameTxt = new JTextField(); bookNameTxt.setColumns(10); bookNameTxt.setBounds(84, 26, 114, 21); panel.add(bookNameTxt); bookAuthorTxt = new JTextField(); bookAuthorTxt.setColumns(10); bookAuthorTxt.setBounds(285, 26, 114, 21); panel.add(bookAuthorTxt); jb_search = new JButton("\u67E5\u8BE2"); jb_search.setIcon(new ImageIcon("D:\\java\\MyBookManager\\image\\search.png")); jb_search.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Book book = new Book(); String bookName = bookNameTxt.getText(); String bookAuthor = bookAuthorTxt.getText(); BookType bookType = (BookType)jcb_bookType.getSelectedItem(); int bookTypeId = bookType.getId(); book.setBookName(bookName); book.setBookAuthor(bookAuthor); book.setBookTypeId(bookTypeId); fillTable(book); } }); jb_search.setBounds(629, 25, 93, 23); panel.add(jb_search); jcb_bookType = new JComboBox<BookType>(); jcb_bookType.setBounds(472, 26, 131, 21); panel.add(jcb_bookType); JScrollPane scrollPane = new JScrollPane(); scrollPane.setToolTipText(""); scrollPane.setBounds(43, 120, 732, 178); contentPane.add(scrollPane); table = new JTable(); table.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { int row = table.getSelectedRow(); s_idTxt.setText((Integer)table.getValueAt(row, 0)+""); s_bookNameTxt.setText(table.getValueAt(row, 1)+""); } }); table.setModel(new DefaultTableModel( new Object[][] { {null, null, null, null, null, null, null}, }, new String[] { "\u56FE\u4E66\u7F16\u53F7", "\u56FE\u4E66\u540D\u79F0", "\u56FE\u4E66\u4F5C\u8005", "\u56FE\u4E66\u4EF7\u683C", "\u56FE\u4E66\u63CF\u8FF0", "\u56FE\u4E66\u7C7B\u522B", "\u56FE\u4E66\u72B6\u6001" } )); table.setToolTipText("\u56FE\u4E66"); table.setSurrendersFocusOnKeystroke(true); scrollPane.setViewportView(table); jb_lendBook = new JButton("\u501F\u4E66"); jb_lendBook.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int row = table.getSelectedRow(); String state = table.getValueAt(row,6)+""; if("借阅中".equals(state)){ JOptionPane.showMessageDialog(null, "该书已经被借走,请选择其他书籍"); }else{ Connection con=null; try { con = dbUtil.getCon(); int bookId = (Integer)table.getValueAt(row,0); int ret = userDao.lendBook(con, user.getId(), bookId); if(1 == ret){ fillTable(new Book()); JOptionPane.showMessageDialog(null, "借阅成功"); bookDao.bookLend(con, bookId); } else JOptionPane.showMessageDialog(null, "借阅失败"); } catch (Exception e1) { JOptionPane.showMessageDialog(null, "借阅失败"); e1.printStackTrace(); } finally{ try { dbUtil.closeCon(con); } catch (Exception e1) { e1.printStackTrace(); } } } } }); jb_lendBook.setBounds(615, 322, 160, 23); contentPane.add(jb_lendBook); JLabel label_3 = new JLabel("\u56FE\u4E66\u7F16\u53F7\uFF1A"); label_3.setBounds(43, 326, 66, 15); contentPane.add(label_3); s_idTxt = new JTextField(); s_idTxt.setEnabled(false); s_idTxt.setBounds(119, 323, 135, 21); contentPane.add(s_idTxt); s_idTxt.setColumns(10); JLabel label_4 = new JLabel("\u56FE\u4E66\u540D\u79F0\uFF1A"); label_4.setBounds(340, 326, 66, 15); contentPane.add(label_4); s_bookNameTxt = new JTextField(); s_bookNameTxt.setEnabled(false); s_bookNameTxt.setColumns(10); s_bookNameTxt.setBounds(427, 323, 135, 21); contentPane.add(s_bookNameTxt); } }
这里书的状态主要由book表的state字段决定,为0正常,为1表示被借走。
5、管理员借阅情况管理
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.edu.sau.view; import java.awt.Color; import java.awt.Component; import java.awt.EventQueue; import java.sql.Connection; import java.sql.ResultSet; import java.util.Vector; import javax.swing.JButton; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.border.TitledBorder; import javax.swing.table.DefaultTableModel; import org.eclipse.wb.swing.FocusTraversalOnArray; import cn.edu.sau.dao.BookDao; import cn.edu.sau.dao.UserDao; import cn.edu.sau.model.Book; import cn.edu.sau.model.User; import cn.edu.sau.util.DbUtil; import cn.edu.sau.util.StringUtil; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class LendBookManageInterFrm extends JInternalFrame { DbUtil dbUtil = new DbUtil(); UserDao userDao = new UserDao(); BookDao bookDao = new BookDao(); private JTextField userIdTxt; private JTextField bookIdTxt; private JTable table; private JTextField s_idTxt; private JTextField s_userNameTxt; private JTextField s_bookNameTxt; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { LendBookManageInterFrm frame = new LendBookManageInterFrm(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public LendBookManageInterFrm() { setIconifiable(true); setClosable(true); setTitle("\u56FE\u4E66\u501F\u9605\u7BA1\u7406"); setBounds(100, 100, 691, 448); getContentPane().setLayout(null); init(); fillTable(null,null); } //填充借书记录表格 private void fillTable(User user,Book book){ DefaultTableModel dtm = (DefaultTableModel)table.getModel(); dtm.setRowCount(0); Connection con = null; try { con = dbUtil.getCon(); ResultSet rs = userDao.lendBookList(con, user, book); while (rs.next()) { Vector v = new Vector(); v.add(rs.getInt("id")); v.add(userDao.getPnameById(con, rs.getInt("userid"))+"("+rs.getInt("userid")+")"); v.add(bookDao.getBookNameById(con, rs.getInt("bookid"))+"("+rs.getInt("bookid")+")"); dtm.addRow(v); } } catch (Exception e) { e.printStackTrace(); } finally { try { dbUtil.closeCon(con); } catch (Exception e) { e.printStackTrace(); } } } private void init() { JPanel panel = new JPanel(); panel.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "\u641C\u7D22\u6761\u4EF6", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0))); panel.setToolTipText("\u641C\u7D22\u6761\u4EF6"); panel.setBounds(10, 24, 655, 58); getContentPane().add(panel); panel.setLayout(null); JLabel lblid = new JLabel("\u7528\u6237Id\uFF1A"); lblid.setBounds(10, 20, 70, 15); panel.add(lblid); userIdTxt = new JTextField(); userIdTxt.setBounds(78, 17, 150, 21); panel.add(userIdTxt); userIdTxt.setColumns(10); JLabel lblid_1 = new JLabel("\u56FE\u4E66Id\r\n\uFF1A"); lblid_1.setBounds(238, 20, 70, 15); panel.add(lblid_1); bookIdTxt = new JTextField(); bookIdTxt.setBounds(318, 17, 155, 21); panel.add(bookIdTxt); bookIdTxt.setColumns(10); //搜索按钮 JButton jb_search = new JButton("\u641C\u7D22"); jb_search.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Connection con=null; try { con = dbUtil.getCon(); String userId = userIdTxt.getText(); String bookId = bookIdTxt.getText(); Book book = new Book(); User user = new User(); if(StringUtil.isNotEmpty(bookId)){ book.setId(Integer.parseInt(bookId)); } if(StringUtil.isNotEmpty(userId)) user.setId(Integer.parseInt(userId)); fillTable(user,book); } catch (Exception e1) { e1.printStackTrace(); }finally{ try { dbUtil.closeCon(con); } catch (Exception e1) { e1.printStackTrace(); } } } }); jb_search.setBounds(510, 16, 93, 23); panel.add(jb_search); panel.setFocusTraversalPolicy(new FocusTraversalOnArray(new Component[]{lblid, userIdTxt, lblid_1, bookIdTxt, jb_search})); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(10, 92, 655, 174); getContentPane().add(scrollPane); //借书记录表格 table = new JTable(); table.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { int row = table.getSelectedRow(); s_idTxt.setText(table.getValueAt(row, 0)+""); String userName = table.getValueAt(row, 1)+""; s_userNameTxt.setText(userName.replaceAll("\\(\\d*\\)", "")); String bookName = table.getValueAt(row, 2)+""; s_bookNameTxt.setText(bookName.replaceAll("\\(\\d*\\)", "")); } }); table.setModel(new DefaultTableModel( new Object[][] { {null, null, null}, }, new String[] { "\u7F16\u53F7", "\u501F\u9605\u4EBA", "\u501F\u9605\u56FE\u4E66" } )); table.getColumnModel().getColumn(0).setPreferredWidth(83); table.getColumnModel().getColumn(1).setPreferredWidth(162); table.getColumnModel().getColumn(2).setPreferredWidth(187); scrollPane.setViewportView(table); JPanel panel_1 = new JPanel(); panel_1.setBorder(new TitledBorder(null, "\u8868\u5355\u64CD\u4F5C", TitledBorder.LEADING, TitledBorder.TOP, null, null)); panel_1.setBounds(10, 276, 655, 101); getContentPane().add(panel_1); panel_1.setLayout(null); JLabel label_2 = new JLabel("\u7F16\u53F7\uFF1A"); label_2.setBounds(10, 33, 60, 15); panel_1.add(label_2); s_idTxt = new JTextField(); s_idTxt.setBounds(91, 30, 66, 21); panel_1.add(s_idTxt); s_idTxt.setColumns(10); JLabel label_3 = new JLabel("\u501F\u9605\u4EBA\uFF1A"); label_3.setBounds(195, 33, 65, 15); panel_1.add(label_3); s_userNameTxt = new JTextField(); s_userNameTxt.setBounds(270, 30, 132, 21); panel_1.add(s_userNameTxt); s_userNameTxt.setColumns(10); JLabel label_4 = new JLabel("\u56FE\u4E66\u540D\u79F0\uFF1A"); label_4.setBounds(432, 33, 71, 15); panel_1.add(label_4); s_bookNameTxt = new JTextField(); s_bookNameTxt.setBounds(513, 30, 132, 21); panel_1.add(s_bookNameTxt); s_bookNameTxt.setColumns(10); //还书按钮 JButton jb_return = new JButton("\u5F52\u8FD8"); jb_return.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Connection con = null; try { con = dbUtil.getCon(); String id = s_idTxt.getText(); String bookName = s_bookNameTxt.getText(); if(StringUtil.isEmpty(bookName)){ JOptionPane.showMessageDialog(null, "请选择要归还书籍记录"); return ; } userDao.returnBook(con, id); bookDao.bookReturn(con, bookName); fillTable(null, null); } catch (Exception e1) { e1.printStackTrace(); } finally{ try { dbUtil.closeCon(con); } catch (Exception e1) { e1.printStackTrace(); } } } }); jb_return.setBounds(10, 68, 635, 23); panel_1.add(jb_return); } }
界面提供了多级连表查询以及还书接口。
6、数据库设计
1)user表
2)booktype表
3)book表
4)lendbook表
根据数据库所学知识,我们将数据库分为4张表,user表中记录用户信息;booktype表中记录图书分类信息;book表中记录图书信息,同时将book表中的booktypeId关联到booktype表的id上;lendbook为借书信息,其中userid和bookid为两个外键,分别对应user表的id和book表的id。这里应该感谢这学期的数据库课程,让我们在设计表结构的时候免去了不少的麻烦。
注:代码注释不是很详细,传至coding时会添加完整注释内容以及数据库文件等(虽然我现在不知道这种工程应该怎么传送到coding T T )。
Conding地址:https://coding.net/u/2013040101068/p/alarm-work/git