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

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

 Vector titilevector = null;
 Vector studentvector = null;

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


当时错误的写法

哇,代码写错了!!!!在表格的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";
            }

查询所有结果:



按字段查询结果:


查询这块差不多了,可能有点缺陷的就是没有建立多个查询条件进行查询,像我同学说的,搞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的一行记录:



比如要进行删除的话,就先通过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了,明天下午要做报告了!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • SQL语言基础 本章,我们将会重点探讨SQL语言基础,学习用SQL进行数据库的基本数据查询操作。另外请注意本章的S...
    厲铆兄阅读 5,299评论 2 46
  • 参加自控力训练营一个月了,前半个月很积极,每次写简书认真对待,选图,排版,还期待排名,偶尔排名进入前十后还小激动,...
    盖小伍呀阅读 239评论 6 8
  • 浪矢爷爷曾经和他的儿子说,“很多时候,每一个来咨询的人心里已经有了答案,来咨询只是想确认自己的决定是对的。”这就像...
    鱼耗子阅读 174评论 0 0
  • 天气真的是越来越冷了,有点懒床早晨真不爱起来。真想在被窝多待会,唉╯﹏╰孩子要上学今天礼拜一还是很不情愿的起来了。...
    翔翔要努力阅读 152评论 0 0
  • 读企业的历史,懂你想懂的投资密码! 企业历史中的投资密码(二):毛利率 文/疆又予 利润表的第一大项是营业总收入(...
    疆又予观世阅读 752评论 2 5