Swing之图书管理系统

项目结构总结:

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();
    }
View Code

            通过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);
View Code          
 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     }
View Code

            再弄个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, "删除失败!");
                    
                }
View Code
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();
    }
View Code

  退出系统:通过jmiExitActionPerformed来实现

private void jmiExitActionPerformed(java.awt.event.ActionEvent evt) {
        int result = JOptionPane.showConfirmDialog(null, "是否退出系统");
        if (result == 0) {
            this.dispose();
        }
    }
View Code

知识点总结:

1.debug的使用:F6下一步;F8跳到下一个断点;F5跳到方法内;Ctrl+shift+i查看返回值。

2.查询小算法:使用StringBuffer类。

3.主外键级联删除问题:删除父表中的一条记录时要判断该条记录关联的字表是否为空,只有为空时父表才能实现删除。

4.Myeclipse快捷键:...

5.小图标下载网址:http://www.easyicon.net/小图标的像素不能超过20*20,一般是16*16。

6.构造方法重载:在实体类中根据需要自动添加构造方法,这样在视图中就可以直接使用了。

7.代码重复利用:通过参数列表重复利用方法,通过封装方法减少重复代码。

   

原文地址:https://www.cnblogs.com/ligui989/p/3137903.html