java将结果集返回给另一个函数
我正在创建一个程序来管理MySQL服务器。我有一个可以正常工作的UI和代码,可以在数据库中添加新条目。下图是我正在使用的原型GUI,对这个问题很重要的部分是表框,它将在数据库工作时显示数据库的条目
我用来读取数据库内容的代码正常工作。该程序是结构化的,因此我有单独的类用于接口、场景控制器和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 楼答案
我假设你在close()方法中关闭了conneciton。这就是它关闭的原因。finally在方法体之后但在结果传递给调用函数之前执行
我觉得不管怎么说,传回结果集都是不好的做法,因为结果集并不是真正的类型安全的。如果更改查询,您将在没有注意到的情况下中断fillTable()函数。当然,您需要找到一种方法,在某个点关闭resultset和底层DB连接。这可能很有挑战性