java jdbc 处理 resultset 结果集的标准做法是调用 statement 或 preparedstatement 的 executequery() 方法获取结果对象,随后在 while(rs.next()) 循环中通过 rs.getxxx() 方法按列名或索引提取数据。操作完成后必须显式关闭 resultset、statement 和 connection 以释放数据库资源。若未正确关闭连接,会导致内存泄漏或数据库连接池耗尽。

如何安全地遍历并提取 ResultSet 中的字段值
使用 rs.next() 推进游标至下一行,并在循环体内调用 getString() 或 getInt() 等类型匹配的方法读取当前行的列数据。推荐使用列名而非索引以避免因 SQL 变更导致的错位,同时需处理 SQLException 异常。

import java.sql.*;
public class JdbcExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String pass = "password";
// try-with-resources 自动关闭资源
String sql = "SELECT id, name FROM users WHERE age > ?";
try (Connection conn = DriverManager.getConnection(url, user, pass);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, 18); // 设置参数
try (ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
} catch (SQLException e) {
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
预期输出:控制台打印符合年龄条件的用户 ID 和姓名列表。若查询无结果,则不打印任何内容。若数据库不可达,抛出 SQLException。
立即学习“Java免费学习笔记(深入)”;
如何处理 ResultSet 中的空值与默认行为
当数据库字段允许 NULL 时,rs.getXxx() 会返回 Java 的 null(对于包装类型)或 0/false(对于基本类型)。应使用 rs.wasNull() 判断前一次读取是否成功且值为 null,或在 SQL 中使用 COALESCE 函数提供默认值。直接读取可能引发逻辑错误,需根据业务需求选择处理方式。

import java.sql.*;
public class NullHandlingExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String pass = "password";
String sql = "SELECT id, email FROM users WHERE id = ?";
try (Connection conn = DriverManager.getConnection(url, user, pass);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, 1);
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
String email = rs.getString("email");
if (rs.wasNull()) {
System.out.println("Email is null");
} else {
System.out.println("Email: " + email);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
预期输出:若用户 ID 为 1 的记录中 email 字段为 NULL,则打印 "Email is null";否则打印具体邮箱地址。若该用户不存在,则无任何输出。
基于 PreparedStatement 参数绑定对 ResultSet 的影响
在使用 PreparedStatement 时,参数绑定会影响最终返回的 ResultSet 内容。例如,当传入的参数导致查询条件不匹配时,ResultSet 将为空,rs.next() 首次调用即返回 false。此外,参数类型必须与数据库列类型兼容,否则可能抛出 SQLException 或返回意外结果。正确绑定参数可防止 SQL 注入并确保结果集准确性。


















