【问题标题】:How to show all records in database to JTable?如何将数据库中的所有记录显示到 JTable?
【发布时间】:2015-07-20 23:59:32
【问题描述】:

对不起。我想在 JTable 中显示所有记录。但我很困惑,因为我的编码只显示 1 条记录。当我再次单击它时,它只会显示相同的记录。 您能帮我如何获取所有记录吗?

try {

            Statement stmt;
            stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM menu");

            if (rs.next()) {
                String menu_id = rs.getString("menu_id");
                String menu_type = rs.getString("menu_type");
                String menu_cat = rs.getString("menu_cat");
                String menu_name = rs.getString("menu_name");
                String menu_price = rs.getString("menu_price");

                DefaultTableModel model = (DefaultTableModel) tblMenu.getModel();
                model.addRow(new Object[]{menu_id, menu_type, menu_cat, menu_name, menu_price});
            }

        } catch (Exception e) {
            System.out.println("Failed " + e);
        }

我不知道如何编码。谢谢

【问题讨论】:

  • "但是我很困惑,因为我的编码只显示了 1 条记录" 你为什么认为你的代码应该将所有记录放在表中?您认为代码的哪一部分应该确保这一点?
  • 因为我要显示菜单,所以必须全部显示。因此,收银员将变得更容易做到这一点。 @Pshemo

标签: java mysql swing jtable


【解决方案1】:

您使用过if(rs.next()),您知道如果条件检查是truefalse

rs.next()

将游标从数据库中移到结果集的下一行,如果有行则返回真,否则返回假。结合 if 语句(而不是 while),这意味着您只期望一行。很简单,

rs.next()

检查下一行是否存在 if 条件通过并执行代码块并从块中退出运行其余代码。

关于遍历数据库表并将所有内容添加到jTable的具体问题。 您只需更改一个关键字

ifwhile

当您使用while 关键字而不是if 关键字时会发生什么情况是rs.next() 检查下一行,如果为真,则while 的条件为真循环并遍历代码块,当块完成时再次检查下一行。同样遍历表中的所有行,最后一行之后条件将失败。

【讨论】:

    【解决方案2】:

    试试这个

            String[] cols={"id","type","cat","name","price"};
            ArrayList<String[]> list = new ArrayList<String[]>();
            while (rs.next()) {
                String menu_id = rs.getString("menu_id");
                String menu_type = rs.getString("menu_type");
                String menu_cat = rs.getString("menu_cat");
                String menu_name = rs.getString("menu_name");
                String menu_price = rs.getString("menu_price");
                list.add(new String[]{menu_id, menu_type, menu_cat, menu_name, menu_price});
            }
    
            String[][] elts= new String[list.size()][];
            elts = list.toArray(elts);
            JTable table = new JTable(elts,cols);
            JScrollPane pane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,  JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            frame.getContentPane().add(pane);
    

    【讨论】:

    • 我必须对数据库做同样的事情,这就是我所做的。主要优点是可以在表格顶部看到列名
    【解决方案3】:

    改变

    if (rs.next())
    

    while (rs.next())
    

    不仅要运行到代码块一次,还要运行到ResultSet 的末尾。

    实际上应该是这样的

    DefaultTableModel model = (DefaultTableModel) tblMenu.getModel();
    while (rs.next()) {
        String menu_id = rs.getString("menu_id");
        String menu_type = rs.getString("menu_type");
        String menu_cat = rs.getString("menu_cat");
        String menu_name = rs.getString("menu_name");
        String menu_price = rs.getString("menu_price");
    
        model.addRow(new Object[]{menu_id, menu_type, menu_cat, menu_name, menu_price});
    }
    

    【讨论】:

    • 并且不要使用while 循环创建新的DefaultTableModel
    • 如果我删除它,代码会要求我创建字段/类“模型”@MadProgrammer
    • @enjeru 是的,但您不需要在循环的每次迭代中创建一个新的DefaultTableModel,如果您只是简单地将if 替换为`while`,就会发生这种情况。答案的更新说明了正确的想法
    • 啊。我知道了。对不起,我忘了我是否把它放在循环语句中-_- @MadProgrammer
    猜你喜欢
    • 2011-12-31
    • 2013-01-19
    • 2012-08-28
    • 2019-03-16
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多