如何利用JDBC ResultSet将SQL查询结果转为二维真值表数组
问题分析与解决方案
问题根源
你的代码存在致命的数组索引错误:在while(resultSet.next())循环中,始终使用truthTable[numRows - 2][...]作为数组行索引。当表中有2行数据时,numRows-2的值固定为0,导致两行数据都被写入数组的第0行,第二行数据直接覆盖了第一行,最终数组仅保留最后一行内容。
而打印语句能正常输出两行数据,是因为resultSet.next()每次都会移动游标到下一行,打印操作是逐行执行的,但赋值操作一直指向同一个数组位置,才出现了“打印正常但数组赋值异常”的矛盾现象。
修复方案
核心修改:添加动态行索引
在循环外定义一个行计数器,每次循环后自增,用它指定数组的行索引,确保每一行数据写入对应的数组位置。
优化后的完整代码
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class SANITIZED { private static String url = "jdbc:sqlserver://SANITIZED:SANITIZED;DatabaseName=SANITIZED;encrypt=true;trustServerCertificate=true"; private static final int COLUMN_COUNT = 27; // 固定列数 public static void main(String[] args) { int numRows = 0; Connection conn = null; try { // 仅建立一次数据库连接,复用资源 conn = DriverManager.getConnection(url, "SANITIZED", "SANITIZED"); Statement statement = conn.createStatement(); // 1. 获取表的总行数 ResultSet countResult = statement.executeQuery("select count(*) from SANITIZED"); if (countResult.next()) { numRows = countResult.getInt(1); } countResult.close(); // 初始化二维数组 int[][] truthTable = new int[numRows][COLUMN_COUNT]; // 2. 查询所有数据并填充数组 ResultSet dataResult = statement.executeQuery("select * from SANITIZED"); int rowIndex = 0; // 动态行索引计数器 while (dataResult.next()) { // 填充当前行的前4列,可扩展至全部27列 truthTable[rowIndex][0] = dataResult.getInt(1); truthTable[rowIndex][1] = dataResult.getInt(2); truthTable[rowIndex][2] = dataResult.getInt(3); truthTable[rowIndex][3] = dataResult.getInt(4); // 可选:批量填充全部27列 // for (int col = 0; col < COLUMN_COUNT; col++) { // truthTable[rowIndex][col] = dataResult.getInt(col + 1); // } // 打印当前行验证数据 System.out.printf("第%d行: %d,%d,%d,%d%n", rowIndex+1, truthTable[rowIndex][0], truthTable[rowIndex][1], truthTable[rowIndex][2], truthTable[rowIndex][3]); rowIndex++; // 移动到下一个数组行 } dataResult.close(); statement.close(); } catch (SQLException e) { e.printStackTrace(); } finally { // 确保关闭数据库连接,避免资源泄漏 if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
关键优化点
- 复用数据库连接:避免重复建立连接,减少资源消耗
- 动态行索引:通过
rowIndex跟踪当前要写入的数组行,彻底解决数据覆盖问题 - 资源管理:显式关闭结果集、Statement,在
finally块中关闭连接,也可改用try-with-resources语法进一步简化 - 可扩展性:通过循环可一键填充全部27列,无需手动编写27行赋值代码
验证结果
修复后,数组的每一行将精准对应SQL表的一行数据:truthTable[0]存储第一行的11、12、13、14,truthTable[1]存储第二行的21、22、23、24,调试时可正常看到所有数据。
内容的提问来源于stack exchange,提问作者Bob Kraemer
相关产品推荐
相关产品推荐

