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

Java数据库异常求助:获取product表最大pId时出错

问题分析与解决方案

原代码存在的问题

  • 数据库资源未关闭:Connection、Statement、ResultSet使用后未关闭,会导致数据库连接泄漏,长期运行引发错误。
  • 空表处理逻辑冗余:select max(pId) from product即使表中无数据,也会返回一行值为null的结果,rs.first()始终为true,原代码的else分支永远不会执行;且直接用rs.getInt(1)获取值时,若结果为null会返回0,虽然最终结果正确,但存在潜在空指针风险。
  • 缺少新增数据后的自动更新:原代码仅在窗体首次显示时执行一次,新增数据后标签不会自动刷新为最新的ID值。

修正后的代码实现

1. 封装获取最新ID的工具方法

将获取最大ID的逻辑独立封装,同时用try-with-resources自动关闭数据库资源,避免泄漏:

private int getNextProductId() {
    int nextId = 1;
    try (Connection conn = ConnectionProvider.getCon();
         Statement st = conn.createStatement();
         ResultSet rs = st.executeQuery("select max(pId) from product")) {
        
        if (rs.next()) {
            Integer maxId = rs.getInt(1);
            // 处理max(pId)为null的情况(表为空)
            if (maxId != null && !rs.wasNull()) {
                nextId = maxId + 1;
            }
        }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "获取ID失败: " + e.getMessage());
        e.printStackTrace();
    }
    return nextId;
}

2. 窗体显示时初始化标签

private void formComponentShown(java.awt.event.ComponentEvent evt) {                                    
    jLabel4.setText(String.valueOf(getNextProductId()));
}

3. 新增数据后自动更新标签

在你执行完新增数据的逻辑后,调用以下代码刷新标签:

// 新增数据操作完成后执行
jLabel4.setText(String.valueOf(getNextProductId()));

额外优化建议

  • 用PreparedStatement替代Statement:即使是查询操作,也能避免潜在的SQL注入风险,同时提升数据库执行效率。
  • 优先使用数据库自增主键:如果你的数据库支持(如MySQL的AUTO_INCREMENT、Oracle的SEQUENCE),让数据库自动管理主键,能避免多用户同时新增数据时,客户端计算ID出现的重复问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:32:47