[数据库课设进行时]第四天 终于完工了!表格的查询是重点

这两天遇到最困难的地方应该就是JTable部分,如何从数据库中导出数据并在表格中显示,使用的是两个向量,titlevector和studentvector. 刚开始的时候,我用的是字符串数组,结果要考虑两个字符串的对应顺序,非常繁杂.又后来,没有注意到表格的组成结构,没有把参数作为全局变量,而导致后期删除元素等操作频频出错!意识到这个问题后,昨天晚上迷迷糊糊中我想着,明天要把两个向量作为全局变量,作为面板的属性.

 Vector titilevector = null;
 Vector studentvector = null;

其中titilevector作为表格的标题,studentvector作为表格主体,其中它的元素是学生记录向量!,一定要特别注意这一点,我的同学也出现这个问题了,当然我也遇到了,如下面


当时错误的写法
[数据库课设进行时]第四天 终于完工了!表格的查询是重点_第1张图片

哇,代码写错了!!!!在表格的studentvector中的元素应该是一条学生记录向量,而不是学号字符串,名字字符串等一波字符串!应该先创建一个向量,把这些查出来的一条学生记录信息放到向量中,在把这个向量放到studentvector中

正确的写法:

studentvector.clear();
        try {
            while(rs.next()) {
                Vector stu = new Vector();
                stu.add(rs.getString(1));
                stu.add(rs.getString(2));
                stu.add(rs.getString(3));
                stu.add(rs.getString(4));
                stu.add(rs.getString(5));
                stu.add(rs.getString(6));
                stu.add(rs.getString(7));
                studentvector.add(stu);

                //System.out.println(rs.getString(1));System.out.println(rs.getString(1));
            }
            table.updateUI();

参考资料:
java.lang.String cannot be cast to java.util.Vector
======================我是分割线========================
弄好了这两个向量,学会从数据库中导出数据并添加到studentvector中。解决这关键的一点.其余要做的就是与数据库建立连接,并执行不同的sql语句。例如下面的查询,第一天就在搞有关数据库的操作了,其中也有查询的部分,不过那个查询是范围的查询,这里要做的是按照字段的查询,有点区别的,多了【多表连接查询】部分。要用到【多表连接查询 】,是因为学生表中有关班级、院系的数据是外键,分别是班级表、院系表的主键。
【多表连接查询 】:
student.class = class.Id AND student.department = department.Id
示例代码:

String sql = "select studentID ,student.name,sex,class.name,department.name,birthday,native_place from student ,class,department where student.class = class.Id AND student.department =  department.Id";
        String item = jCBSelectQueryFieldTransfer(SelectQueryFieldStr); //得到属性列
        sql+= " and " + item;
        sql +=" = " + "'" + sQueryField + "'";
        dbProcess.connect();
        ResultSet rs = dbProcess.executeQuery(sql);

关键的地方:

  • jCBSelectQueryFieldTransfer(SelectQueryFieldStr): 由于从表中属性列得到是中文字符串,需要转换为数据库属性列的英文字符串。
    这里执行的sql语句里面的班级代码(classid)是从班级表中通过班级名得到的,同样的,院系代码(departmentid)是从院系代码表中通过院系名得到的。这样也很好的符合:查询文本框里的内容是中文字符串的情况,避免无谓的转换(以前我是用一个function进行中文和英文代码的转换)
    把outputstr = class 该为 outputstr = class.name 还有outputstr = department 该为outputStr = department.name。各个表的属性列如下:
    student表:


    学生表

    class表:


    班级表

    department表:
    院系表

代码如下:

public String jCBSelectQueryFieldTransfer(String InputStr)
    {
        String outputStr = "";
        System.out.println("jCBSelectQueryFieldTransfer(). InputStr = " + InputStr);
        
        if(InputStr.equals("学号")){
            outputStr = "studentID";
        }else if(InputStr.equals("姓名")){
            outputStr = "student.name";
        }else if(InputStr.equals("性别")){
            outputStr = "sex";
        }else if(InputStr.equals("班级")){
            outputStr = "class.name";
        }else if(InputStr.equals("院系")){
            outputStr = "department.name";
            }

查询所有结果:


[数据库课设进行时]第四天 终于完工了!表格的查询是重点_第2张图片

按字段查询结果:


[数据库课设进行时]第四天 终于完工了!表格的查询是重点_第3张图片

查询这块差不多了,可能有点缺陷的就是没有建立多个查询条件进行查询,像我同学说的,搞6个查询文本框,进行多条件查询,他遇到sql语句的建立问题:当有多个条件的时候,需要用and进行连接,如果是第一个条件语句,那么and就多余了,我说用一个标志位flag,初始为false,当第一个条件语句建立的时候,不加and,并且flag变为true,后面的条件的建立都加and。

还有更新、删除操作。
这些操作需要先确定一条记录,这里是通过为表格添加监听器来确定的:

table.addMouseListener(new MouseAdapter()
        { 
            public void mouseClicked(MouseEvent e) 
            { 
                int row = ((JTable) e.getSource()).rowAtPoint(e.getPoint()); // 获得行位置
                System.out.println("mouseClicked(). row = " + row);
                Vector v = new Vector();
                v = (Vector) studentvector.get(row);

                studentIDtextField.setText((String) v.get(0));// 学号
                nametextField.setText((String) v.get(1));// 姓名
                sextextField.setText((String) v.get(2));// 性别
                classtextField.setText((String)v.get(3));// 班级
                departmenttextField.setText((String) v.get(4));// 院系
                birthdaytextField_4.setText((String) v.get(5));// 出生年月
                placetextField_3.setText((String) v.get(6));
            }
        });

这里鼠标点击事件设置了每个文本框的内容,点击每行都会确定一条信息。包括学号,姓名,班级,院系,出生年月等。例如下面点击学号为2的一行记录:


[数据库课设进行时]第四天 终于完工了!表格的查询是重点_第4张图片

比如要进行删除的话,就先通过String sNo = studentIDtextField.getText().trim();确定学号,然后进行删除。删除代码如下:

// 建立删除条件
        String sql = "delete from student where studentID = '" + sNo + "';";
        System.out.println("deleteCurrentRecordProcess(). sql = " + sql);
        try{
            if (dbProcess.executeUpdate(sql) < 1) {
                System.out.println("deleteCurrentRecordProcess(). delete database failed.");
            }
        }catch(Exception e){
            System.out.println("e = " + e);
            JOptionPane.showMessageDialog(null,
                "数据操作错误","错误",JOptionPane.ERROR_MESSAGE);
        }

其中 dbProcess.executeUpdate(sql) < 1 中具体方法如下,它返回的是一个整数,表示有多少条信息受影响。通过这个方法,我们不仅可以执行删除操作,还可以执行其他的修改操作,增加操作。只是传过的sql语句参数不同罢了。

//执行增、删、改语句的方法
    public int executeUpdate(String sql) {
        int count = 0;
        connect();
        try {
            Statement stmt = connection.createStatement();
            count = stmt.executeUpdate(sql);
        } 
        catch(SQLException ex) { 
            System.err.println(ex.getMessage());        
        }
        disconnect();
        return count;
    }

后文:

看了隔壁班的情况,我去,他们都在搞界面优化了。我反正是很苦逼的敲代码,基本上很多逻辑功能是自己实现的,虽然有的地方可能界面不是很好看,但是一点一点都是自己敲下来的。遇到问题,解决问题,反复思考,以至于同学出现错误了,很多时候都知道我知道怎么解决。后期工作就是优化界面,优化代码,精益求精吧。然后参考别人“专业”的代码,好好总结一番。这都是下周的事情了!
今晚上得准备ppt了,明天下午要做报告了!

你可能感兴趣的:([数据库课设进行时]第四天 终于完工了!表格的查询是重点)