Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以用java传递结果集吗?_Java_Sql_Sqlite - Fatal编程技术网

可以用java传递结果集吗?

可以用java传递结果集吗?,java,sql,sqlite,Java,Sql,Sqlite,我试图发出一个命令,在这个命令中,我可以向SQLite/Mysql数据库发送不同的查询,并将结果集返回给正在调用的任何函数。它需要能够处理是2列还是15列 下面的方法不起作用-可能是因为它关闭了resultset/连接,但我不知道其他方法如何操作 想法 public static ResultSet queryDB(String query) { try { Connection connection = DriverManager.getConnection("jdbc

我试图发出一个命令,在这个命令中,我可以向SQLite/Mysql数据库发送不同的查询,并将结果集返回给正在调用的任何函数。它需要能够处理是2列还是15列

下面的方法不起作用-可能是因为它关闭了resultset/连接,但我不知道其他方法如何操作

想法

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);
    }
}