oracle sql resultset,使用Oracle SQL resultSet填充Java swing JComboBox

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

我已经编写了3个类,一个dbConnection类来处理db方面的事情。 另一个实例化我的GUI的类,最后一个类包含我的main方法:

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查询传递给它。

结合使用HR测试方案和Oracle XE,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 listeEmployee() {

List 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);

}

嗨,谢谢您的建议。第一个代码块需要一个返回值,我认为不是吗? public Connection dbConn()我需要从中返回什么?

抱歉@JamesPy我最后忘记设置return conn;,我现在编辑我的答案

啊,是的,我看到了@YCF_L。员工方法中有错误。类型List不带参数-第1和2行。>> >> ResultSet resultat = stm.executeQuery(requete); -认为我错了吗?

您的对帐单应该像这样Statement stm = con.createStatement();,而不像第一个那样

知道了谢谢!我留下了一个错误List list = new ArrayList();对于listEmployee()方法的第2行:List list = new ArrayList();有什么想法吗?我对这种语法不熟悉。

这会返回一个字符串列表,因此请确保将其称为导入import java.util.List; import java.util.ArrayList;

让我们继续聊天中的讨论。

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

您可以通过游标访问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());

嗨,谢谢你的主意。这类似于我第一次编写的代码。但是,当我向应用程序添加更多查询时,我需要为每个查询编写一个像这样的新类,对吗?我想知道这是否是最好的方法,或者我是否可以编写一个更抽象的类来处理连接并为不同的目的将新的SQL查询传递给它。

如果您仅在应用程序中使用一些查询,那么我认为您不需要使用更多的方法。但是,如果您对更抽象的解决方案感兴趣,请查看DAO模式。链接编辑:Oracle源

感谢您在此处输入@Zsolt bel。我将为下一个应用程序研究DAO!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值