为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以在 java 中传递结果集?

是否可以在 java 中传递结果集?

慕无忌1623718 2022-10-26 17:18:47
我正在尝试创建一个命令,我可以将不同的查询发送到 SQLite / Mysql DB,并将结果集返回给正在调用的任何函数。它需要能够处理是 2 列还是 15 列。以下不起作用 - 大概是因为它关闭了结果集/连接,但我不知道该怎么做。想法?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;}
查看完整描述

1 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

你基本上有3个选择:

  1. 不要关闭方法中的ResultSet,StatementConnection,将执行此操作的责任移交给调用者。

    不推荐,因为它容易出错,并且会破坏格式良好的代码结构范例。

  2. 按照Jacob G.的建议,传入具有处理数据所需逻辑的对象。

    例如使用 Java 8+ Consumer

public static void queryDB(String query, Consumer<ResultSet> processor) {

    try (

        Connection connection = DriverManager.getConnection("jdbc:sqlite:" + Settings.SQLITE_DB_PATH);

        Statement statement = connection.createStatement();

        ResultSet resultSet = statement.executeQuery(query);

    ) {

        processor.accept(resultSet);

    } catch (SQLException ex) {

        Logger.getLogger(SQLInterp.class.getName()).log(Level.SEVERE, null, ex);

    }

}

然后像这样调用它:


SQLInterp.queryDB("SELECT * FROM foo", rs -> {

    while (rs.next()) {

        // process data here

    }

});

以通用数据结构将所有数据读入内存,例如List<Map<String, Object>>:


这当然假设查询对每一列都有很好的唯一名称。


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

    }

}


查看完整回答
反对 回复 2022-10-26
  • 1 回答
  • 0 关注
  • 65 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信