如何通过 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 从数据库检索数据的惯用方法是
- 获取
连接
- 在
连接
上创建语句
- 执行
语句
- 迭代返回的
结果集
这意味着对于每个查询,您应该只检索一次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/