有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将结果集返回给另一个函数

我正在创建一个程序来管理MySQL服务器。我有一个可以正常工作的UI和代码,可以在数据库中添加新条目。下图是我正在使用的原型GUI,对这个问题很重要的部分是表框,它将在数据库工作时显示数据库的条目

Text

我用来读取数据库内容的代码正常工作。该程序是结构化的,因此我有单独的类用于接口、场景控制器和SQL命令。我要处理的问题是,我可以从数据库中提取所需的数据,但让场景控制器类将其写入数据库根本不起作用

相关代码如下所示

SQL函数:

public ResultSet readDataBase() throws Exception{
    try {
        // Establish connection to server
        Class.forName("com.mysql.cj.jdbc.Driver");
        connect=DriverManager.getConnection("jdbc:mysql://localhost/library?"+"user=tempUser&password=12345");
        statement=connect.createStatement();

        // Execute query and write the results
        resultSet=statement.executeQuery("select * from library.books");
        return resultSet;

        // writeResultSet(resultSet);

    } catch (Exception e){
        throw e;
    } finally {
        close();
    }
}

场景控制器代码:

public void fillTable() throws SQLException{
    ResultSet resultSet=null;
    try {
        resultSet=commands.readDataBase();

        while(resultSet.next()) {
            String title = resultSet.getString("title");
            String author = resultSet.getString("author");
            String genre = resultSet.getString("genre");
            String format = resultSet.getString("format");
            String isbn = resultSet.getString("isbn");

            System.out.println("Title: " + title);
            System.out.println("Author: " + author);
            System.out.println("Genre: " + genre);
            System.out.println("Format: " + format);
            System.out.println("ISBN: " + isbn);
            System.out.println();
        }
    }catch (Exception e){
        e.printStackTrace();
    }
}

场景控制器块中代码的目的只是暂时测试和读取结果集。稍后将添加用于将结果中的数据写入各自表的写入代码。之所以选择这段代码,是因为我最初在SQL functions类中有它,并且它在那里工作,所以我知道这段代码很好,并且完成了它的工作

然而,每当我运行代码时,我都会得到这个错误结果

java.sql.SQLException: Operation not allowed after ResultSet closed
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
at com.mysql.cj.jdbc.result.ResultSetImpl.checkClosed(ResultSetImpl.java:445)
at com.mysql.cj.jdbc.result.ResultSetImpl.next(ResultSetImpl.java:1726)
at library.test.windows.interfaceSceneController.fillTable(interfaceSceneController.java:108)
at library.test.windows.winInterface.main(winInterface.java:33)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)

我之前读过一些这篇文章,但我能找到的唯一真正相关的信息来源是七年前的这篇文章。这个问题的答案提到了使用JavaBeans作为放置信息的中间位置,但随后在示例代码中使用了一个名为“Biler”的类。除了他的帖子和我的IDE(IntelliJ,如果相关的话)根本不认识它之外,我在任何地方都找不到任何关于比尔的引用。我一直在用JavaBeans做一些实验,但我不确定它是否解决了我的问题

总之,我的问题是。为了将结果集从访问SQL server的函数正确地传递给包含将其写入接口中的表的代码的类,我需要做什么?我知道这一定是可能的,但我似乎无法理解


共 (1) 个答案

  1. # 1 楼答案

    我假设你在close()方法中关闭了conneciton。这就是它关闭的原因。finally在方法体之后但在结果传递给调用函数之前执行

    try {
    
        return resultSet;
    
    } finally {
        close();
    }
    

    我觉得不管怎么说,传回结果集都是不好的做法,因为结果集并不是真正的类型安全的。如果更改查询,您将在没有注意到的情况下中断fillTable()函数。当然,您需要找到一种方法,在某个点关闭resultset和底层DB连接。这可能很有挑战性