You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:55:16