java - 从列中检索所有值

标签 java sql jdbc

如何通过 java 通过 SQL 查询高效地获取列中的所有值,而无需在每次后续调用时连接到数据库?

我现在拥有的:

private List<String> retrieveSQLQuery(String sqlQuery) throws SQLException {
    JDBC jdbc = new JDBC();
    ResultSet rs = jdbc.getResultsSet(sqlQuery);
    List<String> values = new ArrayList<>();

    while (rs.next()) {
        values.add(rs.getString("model"));
    }
    return values;        
}

但是,对于每个后续 rs.next(),它会连接到数据库,创建一条语句,然后检索值。

看起来像这样:

正在连接数据库... 创建声明... 声明已创建。 正在连接数据库... 创建声明... 声明已创建。 值1 正在连接数据库... 创建声明... 声明已创建。 正在连接数据库... 创建声明... 声明已创建。 值2 正在连接数据库... 创建声明... 声明已创建。 正在连接数据库... 创建声明... 声明已创建。 值3

有没有更有效的方法来做到这一点?

<小时/>

编辑:

这是我的结果集方法:

public ResultSet getResultsSet(String QueryString) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        CachedRowSetImpl crs = null;
        try {
            // STEP 1: Register JDBC driver
            Class.forName(jdbcDriver);

            // STEP 2: Open a connection
            logger.info("Connecting to database...");
            conn = DriverManager.getConnection(dbUrl, user, password);

            // STEP 3: Execute a query.
            logger.info("Creating statement...");
            stmt = conn.createStatement();
            String sql;
            sql = QueryString;
            rs = stmt.executeQuery(sql);
            crs = new CachedRowSetImpl();
            crs.populate(rs);

            logger.info("Statement Created.");
            // STEP 5: Clean-up environment
        } catch (ClassNotFoundException e) {
            logger.error(e.getMessage());
        } catch (SQLException e) {
            logger.error(e.getMessage());
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
            } catch (SQLException e) {
                logger.error(e.getMessage());
            }
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
                logger.error(e.getMessage());
            }
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                logger.error(e.getMessage());
            }
        } // end try

        return crs;
    }

最佳答案

通过 JDBC 从数据库检索数据的惯用方法是

  1. 获取连接
  2. 连接上创建语句
  3. 执行语句
  4. 迭代返回的结果集

这意味着对于每个查询,您应该只检索一次Connection并创建一个Statement。请注意,您不应在每次检索连接连接到数据库;您应该从众多 connection pools 之一中检索它可用于 JDBC。另请注意,使用 Class.forName(...) 初始化驱动程序 is redundant for post-JDBC 4.0 drivers .

简而言之,最好直接操作 JDBC API 类,而不是为这些类滚动您自己的包装器/缓存。此外,Statement 和 ResultSet 对象的范围应该非常有限(这意味着它们不应该在方法之间传递),以防止资源泄漏。使用 try-with-resources statement 也可以最好、最安全地处理 JDBC 资源管理。而不是传统的 try-catch-finally 结构。

记住上述内容,重写 retrieveSQLQuery()(仅使用 JDBC API 类,而不是自定义 JDBC 类)可能如下所示:

 public List<String> retrieveSQLQuery(String sqlQuery) throws SQLException {

    List<String> values = new ArrayList<>();

    try (Connection conn = DriverManager.getConnection(dbUrl, user, password);
            Statement statement = conn.createStatement();
            ResultSet rs = statement.executeQuery(sqlQuery)) {

        while (rs.next()) {
            // this assumes that the passed-in query string has 
            // a "model" column in the SELECT clause
            values.add(rs.getString("model"));
        }
    }

    return values;        
}

关于java - 从列中检索所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38384757/

相关文章:

java - 如何找到内存泄漏的根源?

java - 在 Vaadin 中为 CustomComponent 创建监听器

php - 从表中获取多个值

java - Postgresql:在表创建期间分配默认时区

mysql - 从数据库中获取数据并设置到jsp文件中

java - 使用 moshi 格式化 json

java - 在 OkHttp 中使用 ArrayList 而不是 Map

sql - 如何删除SQL表中的所有重复记录?

sql - 不使用select *的原因是什么?

java - 如何使用 spring 连接到我的数据库并进行测试?