【发布时间】:2020-11-17 01:00:47
【问题描述】:
我正在创建一个程序来管理 MySQL 服务器。我有一个可以正常工作的 UI 和代码,可以将新条目添加到数据库中。下图是我正在使用的 proto 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 函数类中并且它在那里工作,所以我知道代码很好并且完成了它的工作。
然而,每当我运行代码时,我都会得到这个错误结果。
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)
我之前已经对此进行了一些阅读,但我能找到的唯一真正相关的信息来源是七年前的 post。该问题的答案提到了使用 JavaBeans 作为将信息放在中间位置的地方,但随后在他们的示例代码中使用了一个名为“Biler”的类。除了他的帖子和我的 IDE(如果相关的话,IntelliJ)根本不认识它,我在任何地方都找不到对 Biler 的任何引用。我一直在用 JavaBeans 做一些实验,但我不确定它是否能解决我的问题。
总之,我的问题是这样的。我需要做什么才能正确地将 ResultSet 从访问 SQL 服务器的函数传递到包含用于将其写入接口中的表的代码的类?我知道这一定是可能的,但我似乎无法弄清楚。
【问题讨论】:
-
Biler类不是通用类,而是特定于该问题的 pojo/JavaBean(顺便说一句,它与您的问题重复)。该答案的作者使用它是因为问题的 OP 是从名为Biler的表中选择的。重点是创建一个类并用每一行的数据填充它,然后传递这些对象的列表而不是结果集。
标签: java jdbc javabeans resultset