Java JDBC获取新增行生成键异常:始终返回0值求助
解决插入数据库后获取自增ID始终返回0的问题
嘿,我一眼就瞅出你代码里的问题了——你在调用rs.next()之后居然还用rs.isBeforeFirst()来判断,这完全搞反了数据库游标的逻辑啊!
问题根源
当你执行rs.next()时,游标已经从初始的BeforeFirst(结果集第一行之前的位置)移动到了第一行数据(如果有生成的自增ID的话)。这时候再调用rs.isBeforeFirst(),它会返回false,导致你的generatedId永远不会被赋值,一直停留在初始的0值。
修正后的代码
把判断逻辑改成直接检查rs.next()的返回值就行,它会告诉你是否成功获取到了生成的键:
HashMap<String, String> response = new HashMap<String, String>(); Integer generatedId = 0; try { ps = con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); ps.executeUpdate(); rs = ps.getGeneratedKeys(); // 直接判断是否存在生成的键 if (rs.next()) { generatedId = rs.getInt(1); } } catch (SQLException e) { System.out.println(e.getMessage()); // 建议在这里打印完整栈信息,方便排查问题 e.printStackTrace(); } finally { // 千万别忘了关闭数据库资源,避免内存泄漏 try { if (rs != null) rs.close(); if (ps != null) ps.close(); // 根据你的连接管理策略,决定是否关闭Connection // if (con != null) con.close(); } catch (SQLException e) { e.printStackTrace(); } }
额外注意事项
- 确保你的数据库和驱动支持返回生成键:比如MySQL需要使用
useGeneratedKeys=true的连接参数(老版本驱动要求),不过你已经用了Statement.RETURN_GENERATED_KEYS,大部分现代驱动都能正常识别 - 可以用
rs.wasNull()来验证获取到的ID是否为NULL,防止插入异常但没抛出SQL错误的情况 - 资源关闭一定要放在
finally块里,不管代码是否抛出异常都能执行
内容的提问来源于stack exchange,提问作者NashPL
相关产品推荐
相关产品推荐

