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

Java Swing JTable从MySQL检索数据时索引1位置数据不显示问题

问题描述

在Java Swing项目中实现从MySQL数据库读取数据填充至JTable组件时,其余逻辑运行正常,但数据库中第一条数据始终无法在表格中正常显示。
相关参考截图:

  • JTable运行效果:JTable运行效果
  • MySQL数据库原始表数据:MySQL表数据

故障对应实现代码:

public void view_librarian() throws SQLException {
        prepareStatement = connection.prepareStatement("select * from librarian");
        ResultSet rs = prepareStatement.executeQuery();
        DefaultTableModel tm = (DefaultTableModel) table.getModel();
        table.setFont(new Font("Serif", Font.PLAIN, 25));
        table.setRowHeight(35);
        table.getTableHeader().setFont(new Font("Arial", Font.BOLD, 25));
        tm.setRowCount(0);
        if (rs.next()) {
            while (rs.next()) {
                Object o[] = {rs.getString("username"), rs.getString("name"), rs.getString("mobile"), rs.getString("email"), rs.getString("address"), rs.getString("date_time")};
                tm.addRow(o);
            }
        } else {
            JOptionPane.showMessageDialog(this, "No data found");
        }
    }
故障原因

JDBC的ResultSet游标初始位置位于第一条记录的前方,调用rs.next()方法才会将游标下移一位并返回当前位置是否存在有效记录。
代码中先通过if (rs.next())做非空判断,这一步已经将游标移动到了第一条记录的位置,后续进入while (rs.next())循环时,游标会直接从第一条记录下移到第二条记录才开始读取数据,直接跳过了首条记录,这就是第一条数据始终不显示的根本原因。

修复方案

移除多余的前置rs.next()判断,直接通过while(rs.next())遍历全量结果集,遍历结束后判断表格行数即可识别空结果场景。
修复后代码如下:

public void view_librarian() throws SQLException {
    prepareStatement = connection.prepareStatement("select * from librarian");
    ResultSet rs = prepareStatement.executeQuery();
    DefaultTableModel tm = (DefaultTableModel) table.getModel();
    table.setFont(new Font("Serif", Font.PLAIN, 25));
    table.setRowHeight(35);
    table.getTableHeader().setFont(new Font("Arial", Font.BOLD, 25));
    tm.setRowCount(0);
    
    while (rs.next()) {
        Object o[] = {
            rs.getString("username"), 
            rs.getString("name"), 
            rs.getString("mobile"), 
            rs.getString("email"), 
            rs.getString("address"), 
            rs.getString("date_time")
        };
        tm.addRow(o);
    }
    
    if (tm.getRowCount() == 0) {
        JOptionPane.showMessageDialog(this, "No data found");
    }
    
    // 建议后续改成try-with-resources写法自动释放数据库资源
    rs.close();
    prepareStatement.close();
}

内容的提问来源于stack exchange,提问作者Madhurmoms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:12:29