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

