【问题标题】:How to select different category data from in one colum?如何从一列中选择不同的类别数据?
【发布时间】:2015-12-04 19:43:56
【问题描述】:

我的数据库中有一个名为product 的表,列有namepricecategory,有6 个项目与2 个主要类别相关。比方说:

+----------+-------+-----------+
|  name    | price |  category |
+----------+-------+-----------+
|  mango   |  $58  |  fruits   |
|  avocado |  $74  |  fruits   |
|  apple   |  $20  |  fruits   |
|  carrot  |  $35  | vegetable |
|  onions  |  $40  | vegetable |
+----------+-------+-----------+

我想做2个JComboBox,先选择一个类别,再选择一个JComboBox来加载所有相关的名称(如果我选择fruit,那么其他JComboBox会显示所有的水果项目)。

这是我的代码,它从数据库中选择所有 name 并将其加载到组合框。

  ArrayList<String> list = new ArrayList<String>();

        try {
            DBconnector db =  new DBconnector();
            con=  db.connect();
            String qr = "SELECT name FROM product";
            PreparedStatement stm = con.prepareStatement(qr);
            ResultSet rs = stm.executeQuery(qr);

            while(rs.next()){
                String name = rs.getString("name");
                //add group list to the arraylist
                list.add(name);
            }
            rs.close();

            //Populate the comboBox
            if(!list.isEmpty()){
            DefaultComboBoxModel model = new DefaultComboBoxModel(list.toArray());
            combItems.setModel(model);
            }else{
                System.out.println("List is empty...");
            }
        } catch (SQLException ex) {
            System.out.println("Data not retrieved");
            ex.printStackTrace();

        }
        return list;

有人可以帮帮我吗?

【问题讨论】:

  • select name from product where category = ???您可能想将问题缩小到您遇到问题的部分。使用组合框;编写查询;别的东西……

标签: java mysql swing jdbc


【解决方案1】:

您有 2 个主要选项:在用户选择类别后,使用所选类别运行带有 where 子句的查询;或创建一个从类别到名称列表的映射,然后使用它来创建您的第二个组合框。

第二个选项看起来像:

Map<String, List<String>> categoryMap = new HashMap<>();
while(rs.next()){
    List<String> namesForCategory = categoryMap.getOrDefault(rs.getString("category"), new ArrayList<>());
    namesForCategory.add(rs.getString("name"));
    categoryMap.put(rs.getString("category"), namesForCategory);
}

现在选择类别后,您可以使用categoryMap.get(name) 获取名称列表。

【讨论】:

    【解决方案2】:

    这使用 where 子句选项和 distinct 并显示如何将两个组合框与项目侦听器连接:

                JFrame frm = new JFrame();
                JComboBox catBox = new JComboBox();
                final Connection con = DriverManager.getConnection("jdbc:derby://localhost:1527/sample","app","app");
                String getcatsQuery = "SELECT DISTINCT category from PRODUCT";
                PreparedStatement getcatsStatement = con.prepareStatement(getcatsQuery);
                ResultSet rs = getcatsStatement.executeQuery();
                List<String> list = new ArrayList<>();
                while (rs.next()) {
                    String cat = rs.getString("category");
                    //add group list to the arraylist
                    list.add(cat);
                }
                rs.close();
                System.out.println("list = " + list);
                DefaultComboBoxModel catsModel = new DefaultComboBoxModel(list.toArray());
                catBox.setModel(catsModel);
                final JComboBox prodBox = new JComboBox();
                prodBox.addItem("             ");
                catBox.addItemListener(e -> {
                    try {
                        String getprodsQuery = "SELECT name from PRODUCT where category=?";
                        PreparedStatement getprodsStatement = con.prepareStatement(getprodsQuery);
                        getprodsStatement.setString(1, catBox.getSelectedItem().toString());
                        ResultSet rs2 = getprodsStatement.executeQuery();
                        List<String> list2 = new ArrayList<>();
                        while (rs2.next()) {
                            String name = rs2.getString("name");
                            //add group list to the arraylist
                            list2.add(name);
                        }
                        rs.close();
                        DefaultComboBoxModel prodsModel = new DefaultComboBoxModel(list2.toArray());
                        prodBox.setModel(prodsModel);
    
                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                });
                catBox.setSelectedIndex(0);
                frm.setLayout(new FlowLayout());
                frm.add(catBox);
                frm.add(prodBox);
                frm.pack();
                frm.setVisible(true);
    

    【讨论】:

    • 伟大的工作兄弟它的工作Thnkx很多
    【解决方案3】:

    你可能想使用这个query

    String qr = "SELECT * FROM table_name WHERE category";
    

    我认为你在这方面遇到了麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 2020-06-16
      • 2016-08-30
      相关资源
      最近更新 更多