将数据库中的值解析为ComboBox

时间:2017-07-17 17:29:43

标签: java sql eclipse swing combobox

好吧,我需要从数据库中获取值,然后将它们插入组合框进行选择。

听起来很容易,只使用2个类, UI类实体类,其中包含所有SQL查询(与数据库有关,它&#39) ; s在那里):

//This is the UI class

public void fillComboBox(){

    Entity et = new Entity();

    try{
       //call out dbConnector method from Entity class
        conn = et.dbConnector();
        String query="select distinct Name from DbTable order by Name";
        PreparedStatement pst = conn.prepareStatement(query);
        ResultSet rs = pst.executeQuery();

        while(rs.next()){
           //shows topic data in combobox
            comboBoxName.addItem(rs.getString("Name"));
        }
    }
    catch(Exception e){
        e.printStackTrace();
    }
}
     //runs method
      fillComboBox();

现在,上面的输出工作正常,没有故障。在我的表单中,组合框显示从我指定列中的数据库中获取的唯一值。

在其中实施另一层时会出现问题。

简而言之,我现在有三节课。

第1类:用户界面 - >这个类纯粹处理UI

第2类:控制器 - >这个类纯粹运行方法

第3类:实体 - >这个类纯粹运行任何与sql数据库查询有关的东西

我做的是将上述代码修改为:

这是UI类:

//Declare Variables
JComboBox comboBoxName = new JComboBox();
Controller ct = new Controller();

comboBoxName.addItem(ct.fillComboBox());

Controller类中的某个方法:

//Declare Variables
Entity et = new Entity();

public String fillComboBox(){
    return et.takeNames();
}

最后,我的Entity类,其中包含所有sql查询。

//Declare all variables first
Connection conn = null;
String task = null, names = null;
String query;

//This method connects to database
//There's nothing wrong with this method, I just placed it here to give a general overview of what this method exactly is for you to understand, as I will be calling it out later. Yes, I removed off the **URL** portion intentionally.
public static Connection dbConnector(){     
    try{
        Class.forName("org.sqlite.JDBC");
        Connection conn = DriverManager.getConnection("jdbc:sqlite:URL");
        JOptionPane.showMessageDialog(null, "Connected!");
        return conn;
    }

    catch(Exception ex){
        JOptionPane.showMessageDialog(null, ex);
        return null;
    }
}

public String takeNames(){

        try{
            conn = dbConnector();
            query = "select distinct Name from DbTable order by Name";
            PreparedStatement pst = conn.prepareStatement(query);
            ResultSet rs = pst.executeQuery();

            while(rs.next()){
                //shows Name data in combobox
                 names = rs.getString("Name");
            }               
            pst.close();                
        }

        catch(Exception ex){
            ex.printStackTrace();
        }

        return names;
      }

嗯,基本上,这个" new"实现运行是, UI类调出 Controller类,调用实体类,它运行内部方法并解析值一直到用户界面。

这种方法很有用,因为它可以分离程序的不同部分,使其看起来更整洁。太糟糕了,实施起来很头疼。 >>

现在,错误在于,它将只检索1个值,而不是多个值。它检索的是第一个与众不同的'我指定的特定列中的值。剩下的'不同的'值被忽略。

我有预感它与rs设置有关,@:

 ResultSet rs = pst.executeQuery();

我想到的是它只需要1个值并设置它,然后忽略其余的值。有没有人有这方面的解决方案?我试过arraylist但是如何在arraylist中存储大量的rs值失败了(这真的让我感到难过>。>)

我为这篇冗长的帖子道歉,但在我被困在这个部分几个小时之前,我尽我所能做到最好......

1 个答案:

答案 0 :(得分:0)

修改takeNames()如下

public ArrayList<String> takeNames(){
        //This will collect all names from db
        ArrayList<String> names = new ArrayList<>();

        try{
            conn = dbConnector();
            query = "select distinct Name from DbTable order by Name";
            PreparedStatement pst = conn.prepareStatement(query);
            ResultSet rs = pst.executeQuery();

            while(rs.next()){
                //shows Name data in combobox
                //Add data to the array list
                 names.add(rs.getString("Name"));
            }               
            pst.close();                
        }

        catch(Exception ex){
            ex.printStackTrace();
        }

        //Return the array list you created
        return names;
      }

修改fillComboBox(),如下所示

public ArrayList<String> fillComboBox(){
    return et.takeNames();
}

并按如下方式修改其余部分

JComboBox comboBoxName = new JComboBox();
Controller ct = new Controller();
ArrayList<String> nameList = ct.fillComboBox();

for(String name : nameList){
    comboBoxName.addItem(name);        
}