swing·图书管理系统项目回顾(终章)

swing图书管理系统项目视频来自这里 

一.图书类别维护功能   

  1)查询

  思路:获取查询条件---->封装BookType对象---->发送给数据库,执行匹配查询---->返回操作结果

  1.BookType类

 1 package com.java1234.model;
 2 
 3 public class BookType {
 4     private int id;
 5     private String bookTypeName;
 6     private String bookTypeDesc;
 7     
 8     public BookType() {
 9         super();
10         // TODO Auto-generated constructor stub
11     }
12     public int getId() {
13         return id;
14     }
15     public void setId(int id) {
16         this.id = id;
17     }
18     public BookType(int id, String bookTypeName, String bookTypeDesc) {
19         super();
20         this.id = id;
21         this.bookTypeName = bookTypeName;
22         this.bookTypeDesc = bookTypeDesc;
23     }
24     public BookType(String bookTypeName, String bookTypeDesc) {
25         super();
26         this.bookTypeName = bookTypeName;
27         this.bookTypeDesc = bookTypeDesc;
28     }
29     public String getBookTypeName() {
30         return bookTypeName;
31     }
32     public void setBookTypeName(String bookTypeName) {
33         this.bookTypeName = bookTypeName;
34     }
35     public String getBookTypeDesc() {
36         return bookTypeDesc;
37     }
38     public void setBookTypeDesc(String bookTypeDesc) {
39         this.bookTypeDesc = bookTypeDesc;
40     }
41     @Override
42     public String toString() {
43         return this.getBookTypeName();
44     }
45     
46     
47 }

  维护界面用到JTable控件,JTable 用来显示和编辑常规二维单元表。

  编写fillTable()方法初始化JTable二维单元表

 1 public void fillTable(BookType bookType) {
 2 
 3         /**
 4          * 表格全都是二维的
 5          * Vector 类可以实现可增长的对象数组,Vector 的大小可以根据需要增大或缩小
 6          *Vector是一个集合,逻辑上表示一行
 7          *vector.add()每一次调用都是添加一个列值
 8          */
 9 
10         /**
11          * JTable 用来显示和编辑常规二维单元表
12          * 设计使用 JTable 的应用程序时,务必要注意用来表示表数据的数据结构。
13          * public class DefaultTableModel extends AbstractTableModel implements Serializable
14          * DefaultTableModel 是 TableModel 的一个模型实现,它使用一个 Vector 来存储所有单元格的值,
15          * 该 Vector 由包含多个 Object 的 Vector 组成,也即每个单元格为一整行。
16          */
17 
18         /** DefaultTableModel类中
19          *public void addRow(Vector rowData) 
20          *添加一行到模型的结尾。
22          */
23 
24         /**
25          *TableModel getModel()
26          * 返回提供此 JTable 所显示数据的 TableModel 
27          */
28 
29         DefaultTableModel dtm = (DefaultTableModel) this.bookTypeTable.getModel();
31         dtm.setRowCount(0);
32         Connection conn = null;
33         try {
34             conn = dbUtil.getCon();
35             ResultSet rs = bookTypeDao.bookTypeList(conn, bookType);
36             while (rs.next()) {
37 
38                 /**
39                  *public boolean add(E e)
40                  *将指定元素添加到此向量的末尾
41                  */
42 
43                 Vector vector = new Vector();
44                 vector.add(rs.getString("id"));
45                 vector.add(rs.getString("bookTypeName"));
46                 vector.add(rs.getString("bookTypeDesc"));
47                 dtm.addRow(vector);
48             }
49 
50         } catch (Exception e) {
51             // TODO Auto-generated catch block
52             e.printStackTrace();
53         } finally {
54             try {
55                 dbUtil.conClose(conn);
56             } catch (Exception e) {
57                 // TODO Auto-generated catch block
58                 e.printStackTrace();
59             }
60         }
61 
62     }

  BookDao中的bookTypeList方法

 1 public boolean getBookList(Connection conn, int bookTypeId) throws Exception{
 2         String sql = "select * from t_book where bookTypeId=?";
 3         PreparedStatement  pst = conn.prepareStatement(sql);
 4         pst.setInt(1, bookTypeId);
 5         if(pst.executeQuery().next()){
 6             return true;
 7         }else{
 8             return false;
 9         }
10     }

  简单说下,我们将BookType的属性和成员方法封装到一块,这是因为BookType的属性较多,查询修改删除时不可能像user类那样简单传递两个参数来完成,而且查询和初始化JTable时需要算法来判断条件是否有效,因此封装到一块可以使得代码编写维护起来更为方便,后面的book类亦是如此。

  3.获取输入数据,封装BookType对象

  查询  按钮事件监听:

1 private void bt_searchActionPerformed(java.awt.event.ActionEvent evt) {
2         String bookTypeName = this.s_bookTypeNameTxt.getText();
3         BookType bookType = new BookType();
4         bookType.setBookTypeName(bookTypeName);
5         fillTable(bookType);
6     }

  4.查询[从视频中copy出来的查询小算法]

 1 public ResultSet bookTypeList(Connection conn, BookType bookType) throws Exception{
 2         StringBuffer sb = new StringBuffer("select * from t_bookType");
 3         if(StrUtil.isNotEmpty(bookType.getBookTypeName())){
 4             
 5             /**
 6              * public StringBuffer append(StringBuffer sb)
 7              * 将指定的 StringBuffer 追加到此序列中
 8              */
 9 
10             sb.append(" and bookTypeName like '%"+bookType.getBookTypeName()+"%'");
11         }

    //查询小算法 12 // select * from t_bookType where bookTypeName like '%计算机'% 13 PreparedStatement pst = conn.prepareStatement(sb.toString().replaceFirst("and", "where")); 14 return pst.executeQuery(); 15 }

  2)表单操作,即修改删除

  1.针对上面的JTable 添加鼠标单击事件,单击某一行时,表单操作框显示对应的信息

1 private void bookTypeTableMousePressed(java.awt.event.MouseEvent evt) {
2         int row = this.bookTypeTable.getSelectedRow();
3         idTxt.setText((String) bookTypeTable.getValueAt(row, 0));
4         bookTypeNameTxt.setText((String) bookTypeTable.getValueAt(row, 1));
5         bookTypeDescTxt.setText((String) bookTypeTable.getValueAt(row, 2));
6     }

  2.修改

  选择可修改的数据列表---->获取修改后的数据---->封装---->数据库执行修改操作--->更新结果显示

  按钮事件监听

 1 private void jb_modfiyActionPerformed(java.awt.event.ActionEvent evt) {
 2         //通过插件搞的swing组件默认都是当前类容器的属性对象,都可以通过this.来调用
 3         String id = idTxt.getText();
 4         String bookTypeName = bookTypeNameTxt.getText();
 5         String bookTypeDesc = bookTypeDescTxt.getText();
 6         if (StrUtil.isEmpty(id)) {
 7             JOptionPane.showMessageDialog(null, "请选择您要修改的图书类别");
 8             return;
 9         }
10         BookType bookType = new BookType(Integer.parseInt(id), bookTypeName,
11                 bookTypeDesc);
12         Connection conn = null;
13         try {
14             conn = dbUtil.getCon();
15             
16             int modifyNum = bookTypeDao.bookTypeModify(conn, bookType);
17             if (modifyNum == 1) {
18                 JOptionPane.showMessageDialog(null, "修改成功");
19                 resertValues();
20                 fillTable(new BookType());
21             }else{
22                 JOptionPane.showMessageDialog(null, "修改失败");
23             }
24         } catch (Exception e) {
25             // TODO Auto-generated catch block
26             e.printStackTrace();
27             JOptionPane.showMessageDialog(null, "修改失败");
28         } finally {
29             try {
30                 dbUtil.conClose(conn);
31             } catch (Exception e) {
32                 // TODO Auto-generated catch block
33                 e.printStackTrace();
34             }
35         }
36     }

  数据库执行修改

1 public int bookTypeModify(Connection conn, BookType bookType) throws Exception{
2         String sql = "update t_bookType set bookTypeName=?,bookTypeDesc=? where id=?";
3         PreparedStatement  pst = conn.prepareStatement(sql);
4         pst.setString(1, bookType.getBookTypeName());
5         pst.setString(2, bookType.getBookTypeDesc());
6         pst.setInt(3, bookType.getId());
7         
8         return pst.executeUpdate();
9     }

  3.删除

  获取选中要删除的数据行各列数据,封装---->数据库执行删除操作---->返回操作信息

  删除 事件监听

 1 private void jb_deleteActionPerformed(java.awt.event.ActionEvent evt) {
 2         String id = idTxt.getText();
 3         if (StrUtil.isEmpty(id)) {
 4             JOptionPane.showMessageDialog(null, "请选择您要删除的图书类别");
 5             return;
 6         }
 7         Connection conn = null;
 8         try {
 9             conn = dbUtil.getCon();
10             if(bookDao.getBookList(conn, Integer.parseInt(id))){
11                 JOptionPane.showMessageDialog(null, "该图书类下包含有图书,不能删除");
12                 return;
13             }
14             int deleteNum = bookTypeDao.bookTypeDelete(conn, id);
15             if (deleteNum == 1) {
16                 JOptionPane.showMessageDialog(null, "删除成功");
17                 resertValues();
18                 fillTable(new BookType());
19             }else{
20                 JOptionPane.showMessageDialog(null, "删除失败");
21             }
22         } catch (Exception e) {
23             // TODO Auto-generated catch block
24             e.printStackTrace();
25             JOptionPane.showMessageDialog(null, "删除成功");
26         } finally {
27             try {
28                 dbUtil.conClose(conn);
29             } catch (Exception e) {
30                 // TODO Auto-generated catch block
31                 e.printStackTrace();
32             }
33         }
34     }

  数据库执行删除操作

1 public int bookTypeDelete(Connection conn, String id) throws Exception{
2         String sql = "delete from t_bookType where id=?";
3         PreparedStatement  pst = conn.prepareStatement(sql);
4         pst.setString(1, id);
5         
6         return pst.executeUpdate();
7     }

  3.重置

  每一次删除或修改或查询,成功时都应该更新显示信息

1 public void resertValues() {
2         idTxt.setText("");
3         bookTypeNameTxt.setText("");
4         bookTypeDescTxt.setText("");
5     }

 图书的添加和维护同图书类别的功能类似,不再赘述。

应该注意

  删除图书类别时该类别时候含有图书数据的判断,防止删除类别后图书的bookTypeId为-1

  初始化添加图书界面时如果没有图书类别信息可供选择,应提示用户先执行图书类别信息添加操作

  “男”“女”单选最好用下拉框,初始化时可以男女选择状态都为false,本项目依旧使用的是Radio Button,为达到相同效果在初始化时把两者的是否选中状态都设置为false

 

再次回顾本次项目的时候,根据师傅的指点应该注意的有以下几点:

  1)debug的使用(重要)

      牢记常用的快捷方式,以及掌握如何通过debug排错

  2)JDBC数据库编程原理(重要)

      数据库的连接,关闭,增删改查的操作(方法,相应的数据库命令语句)

  3)项目编写思想,也就是每个功能实现的思路(重要)

      添加,删除,修改,重置,查询等每个对应的事件监听器的编写,以及JTable控件和JComboBox的初始化和鼠标点击事件

  4)关于美化

    字体的美化    

 1 //改变系统默认字体
 2         Font font = new Font("Dialog", Font.PLAIN, 12);
 3         java.util.Enumeration keys = UIManager.getDefaults().keys();
 4         while (keys.hasMoreElements()) {
 5             Object key = keys.nextElement();
 6             Object value = UIManager.get(key);
 7             if (value instanceof javax.swing.plaf.FontUIResource) {
 8                 UIManager.put(key, font);
 9             }
10         }

 

    按钮标签的美化,icon添加图片实现

   5)每个实例对象都默认拥有一个toString方法,重写之可自定义显示[打印]内容 

  

  项目到目前为止,也只掌握了其中的百分之七八十而已 ,有很多的项目技巧和功能实现思路看代码想的话能够理解想透彻,但自己动起手来往往会抓耳挠腮半天。以后会多看这个项目的代码多多的回顾,项目经验和技巧真的很重要。。。

 

 

posted @ 2013-06-01 13:33  Hipk  阅读(306)  评论(0编辑  收藏  举报