可以用java传递结果集吗?
我试图发出一个命令,在这个命令中,我可以向SQLite/Mysql数据库发送不同的查询,并将结果集返回给正在调用的任何函数。它需要能够处理是2列还是15列 下面的方法不起作用-可能是因为它关闭了resultset/连接,但我不知道其他方法如何操作 想法可以用java传递结果集吗?,java,sql,sqlite,Java,Sql,Sqlite,我试图发出一个命令,在这个命令中,我可以向SQLite/Mysql数据库发送不同的查询,并将结果集返回给正在调用的任何函数。它需要能够处理是2列还是15列 下面的方法不起作用-可能是因为它关闭了resultset/连接,但我不知道其他方法如何操作 想法 public static ResultSet queryDB(String query) { try { Connection connection = DriverManager.getConnection("jdbc
public static ResultSet queryDB(String query) {
try {
Connection connection = DriverManager.getConnection("jdbc:sqlite:" + Settings.SQLITE_DB_PATH);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
resultSet.close();
statement.close();
connection.close();
return resultSet;
} catch (SQLException ex) {
Logger.getLogger(SQLInterp.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
您基本上有3种选择: 不要关闭方法中的ResultSet、语句和连接,将完成此操作的责任交还给调用者 不推荐使用,因为它容易出错,并且会破坏格式良好的代码结构范例 传入一个对象,其中包含处理数据所需的逻辑,如所示 例如,使用Java 8+: 以通用数据结构将所有数据读入内存,例如列表: 当然,这假设查询的每一列都有很好的唯一名称
public static List<Map<String, Object>> queryDB2(String query) {
try (
Connection connection = DriverManager.getConnection("jdbc:sqlite:" + Settings.SQLITE_DB_PATH);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
) {
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
String[] name = new String[columnCount];
for (int i = 0; i < columnCount; i++)
name[i] = metaData.getColumnLabel(i + 1);
List<Map<String, Object>> rows = new ArrayList<>();
while (resultSet.next()) {
Map<String, Object> row = new LinkedHashMap<>();
for (int i = 0; i < columnCount; i++)
row.put(name[i], resultSet.getObject(i + 1));
rows.add(row);
}
return rows;
} catch (SQLException ex) {
Logger.getLogger(SQLInterp.class.getName()).log(Level.SEVERE, null, ex);
}
}
您基本上有3种选择: 不要关闭方法中的ResultSet、语句和连接,将完成此操作的责任交还给调用者 不推荐使用,因为它容易出错,并且会破坏格式良好的代码结构范例 传入一个对象,其中包含处理数据所需的逻辑,如所示 例如,使用Java 8+: 以通用数据结构将所有数据读入内存,例如列表: 当然,这假设查询的每一列都有很好的唯一名称
public static List<Map<String, Object>> queryDB2(String query) {
try (
Connection connection = DriverManager.getConnection("jdbc:sqlite:" + Settings.SQLITE_DB_PATH);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
) {
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
String[] name = new String[columnCount];
for (int i = 0; i < columnCount; i++)
name[i] = metaData.getColumnLabel(i + 1);
List<Map<String, Object>> rows = new ArrayList<>();
while (resultSet.next()) {
Map<String, Object> row = new LinkedHashMap<>();
for (int i = 0; i < columnCount; i++)
row.put(name[i], resultSet.getObject(i + 1));
rows.add(row);
}
return rows;
} catch (SQLException ex) {
Logger.getLogger(SQLInterp.class.getName()).log(Level.SEVERE, null, ex);
}
}
在尝试读取之前,只要不关闭它或其各自的语句/连接,就可以传递它。Jacob G-这不会导致内存泄漏吗?假设在使用后关闭它,则不会。如果在关闭之前返回结果,如何关闭它?@DotSlashShell一个选项是不返回结果集,而是将使用者作为一个参数传递给ResultSet本身。只要在尝试读取之前不关闭它或其各自的语句/连接,就可以传递它。Jacob G-这不会导致内存泄漏吗?假设在使用它之后关闭它,否。如果在关闭前返回结果,如何关闭它?@DotSlashShell一个选项是不返回结果集,而是将消费者作为参数传递给结果集本身。谢谢!我选择了2,并将尝试它现在。但是连接是如何关闭的?@DotSlashShell代码正在使用,这是Java 7中添加的一项功能。谢谢!成功了。你能详细介绍一下资源方面的尝试吗?我在2中没有看到任何与此不同的内容,即尝试使用资源或关闭连接?@DotSlashShell您是否遵循了我提供的链接,例如查看搜索列表中的文章?非常感谢!我选择了2,并将尝试它现在。但是连接是如何关闭的?@DotSlashShell代码正在使用,这是Java 7中添加的一项功能。谢谢!成功了。你能详细介绍一下资源方面的尝试吗?我在2中没有看到任何与此不同的内容,即尝试使用资源或关闭连接?@DotSlashShell您是否遵循了我提供的链接,例如查看搜索列表中的文章?
public static List<Map<String, Object>> queryDB2(String query) {
try (
Connection connection = DriverManager.getConnection("jdbc:sqlite:" + Settings.SQLITE_DB_PATH);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
) {
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
String[] name = new String[columnCount];
for (int i = 0; i < columnCount; i++)
name[i] = metaData.getColumnLabel(i + 1);
List<Map<String, Object>> rows = new ArrayList<>();
while (resultSet.next()) {
Map<String, Object> row = new LinkedHashMap<>();
for (int i = 0; i < columnCount; i++)
row.put(name[i], resultSet.getObject(i + 1));
rows.add(row);
}
return rows;
} catch (SQLException ex) {
Logger.getLogger(SQLInterp.class.getName()).log(Level.SEVERE, null, ex);
}
}