如何在Java中获取SQL插入语句的最后插入ID并复用?
获取插入生成的主键并复用
你已经在prepareStatement时指定了Statement.RETURN_GENERATED_KEYS,这是正确的第一步,接下来只需要在执行插入后获取生成的主键,再用于第二条插入语句即可。修改后的完整代码如下:
String sql="INSERT INTO ventas(prefijo,fecha,hora,vtanum,vlrfactura,cambio) VALUES(?,?,?,?,?,?);"; int lastInsertId = -1; try { // 开启事务,保证两个操作的原子性 con.setAutoCommit(false); ps=con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); ps.setString(1, vta.getPrefijo()); ps.setDate(2, vta.getFecha()); ps.setTime(3, vta.getHora()); ps.setInt(4, vta.getVtanum()); ps.setInt(5,vta.getVlrfactura()); ps.setInt(6,vta.getCambio()); ps.execute(); // 提取生成的主键 ResultSet generatedKeys = ps.getGeneratedKeys(); if (generatedKeys.next()) { lastInsertId = generatedKeys.getInt(1); // 若主键是其他类型(如BigInt),可改用getLong() } // 使用主键执行第二条插入 if (lastInsertId != -1) { String pagoSql = "INSERT INTO pagmundimotos.pagos(id_venta,frmpag) VALUES (?, ?);"; PreparedStatement pagoPs = con.prepareStatement(pagoSql); pagoPs.setInt(1, lastInsertId); pagoPs.setString(2, "9"); pagoPs.execute(); } con.commit(); // 提交事务 return true; } catch (SQLException ex) { try { if (con != null) { con.rollback(); // 出错时回滚所有操作 } } catch (SQLException rollbackEx) { Logger.getLogger(OperacionesBD.class.getName()).log(Level.SEVERE, null, rollbackEx); } Logger.getLogger(OperacionesBD.class.getName()).log(Level.SEVERE, null, ex); return false; } finally { // 关闭资源,防止泄漏 try { if (ps != null) ps.close(); if (generatedKeys != null) generatedKeys.close(); } catch (SQLException closeEx) { Logger.getLogger(OperacionesBD.class.getName()).log(Level.SEVERE, null, closeEx); } }
关键说明:
- 获取主键逻辑:
PreparedStatement.getGeneratedKeys()会返回包含生成主键的结果集,调用next()后即可取出对应值,注意要和数据库主键的数据类型匹配。 - 事务控制:将两个插入操作放在同一事务中,确保要么全部执行成功,要么全部回滚,避免出现数据不一致的情况。
- 资源管理:在finally块中关闭
PreparedStatement和ResultSet,释放数据库连接资源。
内容的提问来源于stack exchange,提问作者santiago
相关产品推荐
相关产品推荐

