#使用ResultSet对象
ResultSet表示SQL查询返回的结果集。应用程序通过Statement或PreparedStatement的查询方法获取ResultSet,再通过结果集游标逐行读取数据。
ResultSet创建后,游标位于第一行之前。调用next()将游标移动到下一行:当游标成功定位到数据行时返回true,没有下一行时返回false。因此,遍历结果集通常使用while (resultSet.next())。
# 获取ResultSet
使用Statement.executeQuery(String sql)执行查询并获取结果集。示例假定变量connection已通过使用JDBC连接数据库建立连接。
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ResultSetExample {
public static void queryCustomer(Connection connection) throws SQLException {
String sql = "SELECT id, name FROM customer ORDER BY id";
try (Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql)) {
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id: " + id + ", name: " + name);
}
}
}
}
示例执行成功时,输出如下:
id: 1, name: Alice
# 读取列值
JDBC列索引从1开始。读取结果集中的列时,可以使用列索引或列名(列标签)。使用列标签可以提高代码可读性;使用列索引时,应确保SQL查询列顺序未发生变化。
常用数据类型与读取方法的对应关系如下表所示。
| SQL数据类型 | 推荐读取方法 | Java返回类型 |
|---|---|---|
| CHAR、VARCHAR | getString | String |
| INTEGER、BIGINT | getInt、getLong | int、long |
| NUMBER | getBigDecimal | BigDecimal |
| DATE | getDate | java.sql.Date |
| TIMESTAMP | getTimestamp | java.sql.Timestamp |
例如,以下代码分别通过列索引和列标签读取同一行数据:
while (resultSet.next()) {
int id = resultSet.getInt(1);
String name = resultSet.getString("name");
}
如果数据库列值为SQL NULL,基本类型读取方法可能返回0、false等默认值。读取基本类型后,应调用wasNull()判断上一次读取的列是否为SQL NULL。
int amount = resultSet.getInt("amount");
if (resultSet.wasNull()) {
System.out.println("amount is NULL");
}
# 关闭ResultSet
ResultSet使用完毕后应及时关闭。推荐将ResultSet和创建它的Statement一起声明为try-with-resources资源,确保查询成功或发生SQLException时都能释放资源。
try (Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(
"SELECT id, name FROM customer")) {
while (resultSet.next()) {
System.out.println(resultSet.getString("name"));
}
}
滚动结果集、可更新结果集、流式结果集及结果集数据敏感性等高级用法,请参考处理结果集。

