Java Swing JTable从MySQL检索数据时索引1位置数据不显示问题
问题描述
在Java Swing项目中实现从MySQL数据库读取数据填充至JTable组件时,其余逻辑运行正常,但数据库中第一条数据始终无法在表格中正常显示。
相关参考截图:
- JTable运行效果:

- 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
相关产品推荐
相关产品推荐

