Java JDBC 将 ResultSet 存储在 ArrayList 中

标签 java sqlite jdbc arraylist

我正在尝试在 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/

相关文章:

java - 无法使用最新的 imcache 版本 (0.1.2) 构建 redis 缓存

java - 检查传入消息的 IBM WebSphere MQ 7.0 队列的最佳方法

android - 如何将数据库恢复到原始目录?

java - 混合 JTA 和 JDBC 事务

Java连接多个数据库

java - 我的开发团队应该使用Hibernate吗?

ruby-on-rails - 问题将 Rails 应用程序 (SQLite3) 部署到 Heroku (PostgreSQL)

java - 用于 SQLite v2.X 的 sqlite-jdbc

java - 语法错误 : Encountered ";"

java - 将 Java 对象从一个 Struts 操作传递到另一个