使用Oracle SQL结果集填充Java swing JComboBox



我正在开发一个简单的应用程序,其中包括一个供用户选择的JComboBox。我是Java新手,在用SQL select语句的结果填充JComboBox时遇到了问题。这是因为我缺乏知识!

我已经写了3个类,一个dbConnection类来处理数据库方面的事情。另一个类实例化了我的GUI,最后一个类包含我的主要方法:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
// Extends java.sql :~ describes connections to Oracle db
class dbConn {
Connection conn;
Statement stmt;
ResultSet rs;
String conString;
String sqlString;
void dbConn() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(conString);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
if (conn != null) {
System.out.println("Connection established, database uplink is online.");
} else {
System.out.println("Connection failed, please check database status.");
}
}
}

GUI的第二类:

import javax.swing.*;
public class CaseMoverUI {
void testUI(){
// Create a new JFrame container
JFrame jfrm = new JFrame("CaseMover");
jfrm.setSize(550, 450);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComboBox jbox = new JComboBox();
jfrm.add(jbox);
jfrm.setVisible(true);
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new CaseMoverUI();
}
});
}
}

最后:

public class sqlCaller {
public static void main(String args[]){
//instantiate db object and pass values to the constructor
dbConn db = new dbConn();
db.conString = "jdbc:oracle:thin:system/password123@127.0.0.1:1521:xe";
db.sqlString = "SELECT true FROM dual";
db.dbConn();
CaseMoverUI ui = new CaseMoverUI();
ui.testUI();
}
}

我不确定如何做的第一件事是检索我的结果并将它们添加到JComboBox中。我知道我需要为dbConn类编写一个方法,并向它传递一个SQL查询

使用Oracle XE的HR测试模式,SQL查询可能类似于:

SELECT first_name FROM employees;

然而,我不确定写这个方法的正确方法。如有任何帮助,我们将不胜感激!

首先,您需要从数据库中获得结果列表:

你需要返回你的连接才能在其他方法中使用,比如:

public Connection dbConn() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(conString);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
if (conn != null) {
System.out.println("Connection established, database uplink is online.");
} else {
System.out.println("Connection failed, please check database status.");
}
return conn;
}

然后你的方法来获得你的员工名单:

public List<String> listeEmployee() {
List<String> list = new ArrayList<>();
Connection con = dbConn();
try {
Statement stm = con.createStatement();
String query = "SELECT first_name FROM employees";
ResultSet resultat = stm.executeQuery(requete);
while (resultat.next()) {
list.add(resultat.getString("first_name"));
}
} catch (Exception e) {
System.out.println("Exception = " + e);
}
return list;
}

然后你可以将这些结果添加到你的JComboBox中,如下所示:

//Empty your JComboBox
jbox.removeAllItems();
for (String employee : listeEmployee) {
jbox.addItem(employee);
}

ResultSet对象是表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。例如,当selectDataFromDatabase()方法通过Statement对象stmt执行查询时,它会创建一个ResultSetrs。请注意,ResultSet对象可以通过实现Statement接口的任何对象创建,包括PreparedStatement、CallableStatement和RowSet。

您可以通过光标访问ResultSet对象中的数据。请注意,此游标不是数据库游标。该光标是指向ResultSet中的一行数据的指针。最初,光标位于第一行之前。方法ResultSet.next将光标移动到下一行。如果光标位于最后一行之后,则此方法返回false。此方法使用while循环重复调用ResultSet.next方法,以遍历ResultSet中的所有数据。

public Vector selectDataFromDatabase() {
Vector vector = new Vector();
Connection con = null;
try {
Class.forName(DRIVER);
con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
Statement stmt = con.createStatement();
String query = "SELECT first_name FROM employees";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String firstName = rs.getString("FIRST_NAME");
vector.add(firstName);
}
} catch (ClassNotFoundException ex) {
System.out.println("An error has occured! I cannot find driver!");
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
try {
con.close();
} catch (SQLException ex) {
System.out.println("An error has occured while closing database connection!");
}
}
return vector;
}

在GUI中:

Vector vector = selectDataFromDatabase();
JComboBox jbox = new JComboBox(vector);

或者简单地说:

JComboBox jbox = new JComboBox(selectDataFromDatabase());

最新更新