gpt4 book ai didi

Java JDBC 将 ResultSet 存储在 ArrayList 中

转载 作者:行者123 更新时间:2023-12-01 17:54:17 25 4
gpt4 key购买 nike

我正在尝试在 Java 中使用 SQLite 数据库。

(我也在使用 sqlite-jdbc-3.20.0 library ,但我认为这个问题不受此影响。)

我创建了一些稍后要使用的函数来简化我的工作流程。为此,我创建了类 DBInterface.java,并从中在我的 Main.java 类中创建了一个对象。

DBInterface.java的简化内容:

/**
* Executes a sql String and returns it's results as ResultSet[].
*
* @param sql as String holidng the SQL statement to execute
* @return ResultSet[] containing the results of the query, or empty ResultSet[] if no results
*/
public ArrayList<ResultSet> excecute(String sql)
{
if(!isConnected()) return null;
try
{
return getResultSets(statement.execute(sql));
}
catch (SQLException e)
{
Main.log(tag, "An SQLException has occured for statement '"+sql+"':");
Main.log(tag, e);
}
return null;
}

/**
* Returns an array containing all resultSets of the last executed statement.
*
* @param isResultSet as boolean defining if the statement resulted in an result set
* @return
*/
private ArrayList<ResultSet> getResultSets(boolean isResultSet)
{
ArrayList<ResultSet> results = new ArrayList<>();

try
{
int count = 0;
while(true) {
if(isResultSet)
{
ResultSet set = statement.getResultSet();
results.add(set);
/*
while(set.next())
{
//Here the information can still be retrieved
Main.log(tag, ""+set.getString("name")+", row:"+set.getRow());
}
*/

}
else
{
if(statement.getUpdateCount() == -1)
{
break;
}

Main.log(tag, "Result '"+count+"' is just a count: '"+statement.getUpdateCount()+"'");
}

count ++;
isResultSet = statement.getMoreResults();
}
}
catch(SQLException e)
{
Main.log(tag, "An SQLException has occured while processing a request:");
Main.log(tag, e);
}

return results;
}

Main.java的简化内容:

public static void main(String[] args)
{
[...]

dbInterface.excecute("DROP TABLE IF EXISTS Users");
dbInterface.excecute("CREATE TABLE IF NOT EXISTS Users (id INTEGER, name STRING(20));");
dbInterface.excecute("INSERT INTO Users (id, name) VALUES (1, \"Hans\");");
dbInterface.excecute("INSERT INTO Users (id, name) VALUES (2, \"Peter\");");

ArrayList<ResultSet> results = dbInterface.excecute("SELECT * FROM Users;");

log(tag, ""+results.size());
for(int i = 0; i < results.size(); i++)
{
ResultSet set = results.get(i);
try
{
///*
while(set.next())
{
//TODO Here the information can no longer be retrieved... :(
Main.log(tag, ""+set.getString("name")+", row:"+set.getRow());
}
//*/
}
catch (Exception e)
{
Main.log(tag, e);
}
}
}

根据我的理解,在某些情况下,SQL 查询可能会创建多个 ResultSet,因此我认为我只需将所有 ResultSet 对象添加到 ArrayList 中,这样我就可以看到何时在某处处理结果否则存在多少个 ResultSet。但奇怪的是,这不起作用。通过取消注释 DBInterface.javagetResultSets() 中的 block ,我可以确认结果集确实包含该信息。

但是,在 ArrayList 的 Main.java 中执行相同的操作时,由于某种原因我无法再访问该信息。我已经测试过更改函数以直接返回 ResultSet 对象,这确实有效,但它没有实现我的目标,因为我想返回所有可能的 ResultSet 对象,而不仅仅是一个。

最佳答案

您可以编写一个方法将 ResultSet 转换为列表、映射或类,并将 ResultSet 的结果存储在您的对象中

类似这样的事情

public List resultSetToArrayList(ResultSet rs) throws SQLException {
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
List<Map<String, Object>> list = new ArrayList<>();
while (rs.next()) {
Map<String, Object> row = new HashMap<>(columns);
for (int i = 1; i <= columns; ++i) {
row.put(md.getColumnName(i), rs.getObject(i));
}
list.add(row);
}

return list;
}

不使用ResultSet、Statement和Connection时记得关闭

显式关闭 ResultSet 可以让垃圾收集器有机会尽早回收内存,因为 ResultSet 对象可能会根据查询占用大量内存。

关于Java JDBC 将 ResultSet 存储在 ArrayList 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46588679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com