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

报错:resultSetToTableModel找不到符号,ATM系统迷你账单表格问题

解决“resultSetToTableModel cannot find symbol”错误并实现ATM迷你账单表格展示

错误原因

Apache Commons DbUtils的DbUtils类没有resultSetToTableModel这个静态方法,你导入的org.apache.commons.dbutils.DbUtils仅提供数据库资源关闭、驱动加载等基础工具方法,并不包含ResultSet到Swing TableModel的转换逻辑。

解决方案

方案1:手动将ResultSet转换为DefaultTableModel(推荐)

直接遍历ResultSet构建表格模型,无需依赖额外未定义方法,同时修复原代码的SQL注入风险:

private void DisplayTr() {
    Connection con = null;
    PreparedStatement pst = null;
    ResultSet rs = null;
    try {
        // 替换为你的MySQL实际端口(通常为3306)
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/atmdatabase", "root", "");
        // 使用PreparedStatement避免SQL注入
        String sql = "select * from TransactionTbl where AccNum = ?";
        pst = con.prepareStatement(sql);
        // 根据MyAccNum的实际类型选择set方法,此处假设为字符串类型
        pst.setString(1, MyAccNum);
        rs = pst.executeQuery();
        
        // 构建DefaultTableModel
        DefaultTableModel model = new DefaultTableModel();
        ResultSetMetaData metaData = rs.getMetaData();
        int columnCount = metaData.getColumnCount();
        
        // 添加表格列名
        for (int i = 1; i <= columnCount; i++) {
            model.addColumn(metaData.getColumnName(i));
        }
        
        // 填充表格行数据
        while (rs.next()) {
            Object[] rowData = new Object[columnCount];
            for (int i = 1; i <= columnCount; i++) {
                rowData[i - 1] = rs.getObject(i);
            }
            model.addRow(rowData);
        }
        
        // 绑定表格模型
        MiniTbl.setModel(model);
    } catch (SQLException e) {
        // 移除空捕获块,打印异常栈轨迹便于排查问题
        e.printStackTrace();
    } finally {
        // 用DbUtils安全关闭数据库资源,避免泄漏
        DbUtils.closeQuietly(con, pst, rs);
    }
}

关键优化点

  • 修复SQL注入风险:用PreparedStatement替代字符串拼接的SQL语句,避免恶意输入破坏数据库。
  • 完善异常处理:移除空catch块,打印异常信息,快速定位问题。
  • 规范资源管理:使用DbUtils.closeQuietly()自动关闭Connection、PreparedStatement和ResultSet,简化资源清理逻辑。

方案2:自定义ResultSetHandler实现转换(进阶)

如果需要复用ResultSet到TableModel的转换逻辑,可以基于DbUtils的ResultSetHandler接口自定义实现类:

public class TableModelHandler implements ResultSetHandler<DefaultTableModel> {
    @Override
    public DefaultTableModel handle(ResultSet rs) throws SQLException {
        DefaultTableModel model = new DefaultTableModel();
        ResultSetMetaData metaData = rs.getMetaData();
        int columnCount = metaData.getColumnCount();
        
        // 添加列名
        for (int i = 1; i <= columnCount; i++) {
            model.addColumn(metaData.getColumnName(i));
        }
        
        // 添加行数据
        while (rs.next()) {
            Object[] rowData = new Object[columnCount];
            for (int i = 1; i <= columnCount; i++) {
                rowData[i - 1] = rs.getObject(i);
            }
            model.addRow(rowData);
        }
        return model;
    }
}

在DisplayTr方法中使用该自定义Handler:

private void DisplayTr() {
    Connection con = null;
    PreparedStatement pst = null;
    ResultSet rs = null;
    try {
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/atmdatabase", "root", "");
        String sql = "select * from TransactionTbl where AccNum = ?";
        pst = con.prepareStatement(sql);
        pst.setString(1, MyAccNum);
        rs = pst.executeQuery();
        
        // 使用自定义Handler完成转换
        TableModelHandler handler = new TableModelHandler();
        DefaultTableModel model = handler.handle(rs);
        MiniTbl.setModel(model);
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        DbUtils.closeQuietly(con, pst, rs);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:30:14