项目结构总结:
dao包作用于数据库,实现实体类的增加、删除、修改等功能;
model包用来存放实体,实体类的个成员与表中字段对应;
util包用来封装数据连接,重复使用的代码;
view包存放客户端界面,并通过按钮将客户端与服务端连接起来。
数据库里面存放三张表:
登陆界面:
输入用户名和密码后,点击登录按钮,程序会调用...ActionPerformed方法:
在方法中,判断输入符合条件,则连接数据局,调用...Dao里面的相应方法来操作数据库。最后关闭数据库连接,否则会很浪费资源。
用户登录成功后,进入图书管理系统主界面:
基本数据维护里面包括:图书类别管理、图书管理、退出系统。
图书类别管理包括:图书类别添加和图书类别维护;
图书管理包括:图书添加和图书维护。
...添加包括:添加和重置功能。
...维护包括:查询、修改、删除。
添加与修改的实现:在点击按钮后,获取对应的值并判断没有空值后,调用...Dao中相应的方法,操作完成之后 返回相应信息。
查询的实现:在点击按钮后,调用...Dao中相应的方法,该方法返回一个ResultSet结果集。因为查询条件的不确定 性,我们将sql语句定义成StringBuffer类型,通过append,replaceFirst方法来灵活改变sql语句。其代 码如下:

public ResultSet bookTypeList(Connection con, BookType bookType) throws SQLException{ StringBuffer sb = new StringBuffer("select * from t_bookType"); if(StringUtil.isNotEmpty(bookType.getBookTypeName())){ sb.append(" and bookTypeName like '%"+bookType.getBookTypeName()+"'"); } PreparedStatement pstmt = con.prepareStatement(sb.toString().replaceFirst("and","where")); return pstmt.executeQuery(); }
通过fill...方法将查询集中的数据依次放到表格里面,其代码为

ResultSet rs = bookTypeDao.bookTypeList(con, bookType); while (rs.next()) { Vector v = new Vector(); v.add(rs.getString("id")); v.add(rs.getString("bookTypeName")); v.add(rs.getString("bookTypeDesc")); dtm.addRow(v);

1 public ResultSet bookList(Connection con, Book book) throws Exception{ 2 StringBuffer sb = new StringBuffer("select * from t_book b , t_bookType bt where b.bookTypeId = bt.id"); 3 if(StringUtil.isNotEmpty(book.getBookName())){ 4 sb.append(" and b.bookName like '%"+book.getBookName()+"%'"); 5 } 6 if(StringUtil.isNotEmpty(book.getAuthor())){ 7 sb.append(" and b.author like '%"+book.getAuthor()+"%'"); 8 } 9 if(book.getSex() != "--"){ 10 sb.append(" and b.sex = '"+book.getSex()+"'"); 11 } 12 if(book.getBookTypeId()!= -1){ 13 sb.append(" and b.bookTypeId = "+book.getBookTypeId()); 14 } 15 PreparedStatement pstmt = con.prepareStatement(sb.toString()); 16 17 return pstmt.executeQuery(); 18 }
再弄个mousePressed事件,当鼠标点到某行时,该条记录就显示到表单中。通过表单,就可以修改成 员的值了。
删除的实现:
图书删除:确定删除后直接操作数据库。
图书类别删除:确定删除后,要判断是否有该类别的图书。因为在t_book表里面的bookTypeId是外键,来自于 t_bookType表里的id。其代码实现为:

boolean flag = bookDao.getBookByBookTypeId(con, id); if (flag) { JOptionPane.showMessageDialog(null, "当前图书类别下有图书,不能删除!"); } else { int deleteNum = bookTypeDao.bookTypeDelete(con, id); if (deleteNum == 1) { JOptionPane.showMessageDialog(null, "删除成功!"); this.resetValues(); this.fillTable(new BookType()); } else { JOptionPane.showMessageDialog(null, "删除失败!"); }

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(); }
退出系统:通过jmiExitActionPerformed来实现

private void jmiExitActionPerformed(java.awt.event.ActionEvent evt) { int result = JOptionPane.showConfirmDialog(null, "是否退出系统"); if (result == 0) { this.dispose(); } }
知识点总结:
1.debug的使用:F6下一步;F8跳到下一个断点;F5跳到方法内;Ctrl+shift+i查看返回值。
2.查询小算法:使用StringBuffer类。
3.主外键级联删除问题:删除父表中的一条记录时要判断该条记录关联的字表是否为空,只有为空时父表才能实现删除。
4.Myeclipse快捷键:...
5.小图标下载网址:http://www.easyicon.net/小图标的像素不能超过20*20,一般是16*16。
6.构造方法重载:在实体类中根据需要自动添加构造方法,这样在视图中就可以直接使用了。
7.代码重复利用:通过参数列表重复利用方法,通过封装方法减少重复代码。