好吧,我需要从数据库中获取值,然后将它们插入组合框进行选择。
听起来很容易,只使用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值失败了(这真的让我感到难过>。>)
我为这篇冗长的帖子道歉,但在我被困在这个部分几个小时之前,我尽我所能做到最好......
答案 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);
}