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方法,重写之可自定义显示[打印]内容
项目到目前为止,也只掌握了其中的百分之七八十而已 ,有很多的项目技巧和功能实现思路看代码想的话能够理解想透彻,但自己动起手来往往会抓耳挠腮半天。以后会多看这个项目的代码多多的回顾,项目经验和技巧真的很重要。。。