zoukankan      html  css  js  c++  java
  • 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.代码重复利用:通过参数列表重复利用方法,通过封装方法减少重复代码。

       

  • 相关阅读:
    Python Redis 五大数据类型
    Python 魔法方法
    Python 静态方法,类方法,属性方法
    Python 反射
    Python 中 封装,继承,多态
    Redis 事务
    Redis 哨兵集群
    装饰器,迭代器,生成器
    Flume与kafka集成
    hbase 可视化工具 HBaseXplorer---HbaseGUI
  • 原文地址:https://www.cnblogs.com/ligui989/p/3137903.html
Copyright © 2011-2022 走看看