Java操作MySQL更新两张表时仅单表生效且无报错问题求助
问题排查点
- 核心问题:orders更新语句未执行
你的代码中仅调用了sales表对应pst的executeUpdate()方法,orders表对应的pst2仅完成了参数绑定,没有执行语句的逻辑,SQL请求根本没有发送到MySQL,自然不会更新数据。 - sql2语法不完整
你定义的sql2语句末尾WHERE条件的Total字段后缺少比较逻辑,示例中语句为:
末尾String sql2 ="UPDATE `orders` SET `Username`=?,`Total`=? WHERE `Username`=? AND `Total` ";Total后没有= ?这类匹配规则,属于语法错误,就算后续补充执行逻辑也会抛出SQL异常。 - 更新逻辑合理性问题
假设你补全sql2为UPDATEordersSETUsername=?,Total=? WHEREUsername=? ANDTotal= ?,当前逻辑是用新的Total值去匹配旧的Total值,如果Total值没有变化、或者没有符合用户名+总金额匹配条件的订单,MySQL会返回影响行数为0,不会抛出任何异常,也不会有数据更新。 - 缺少执行结果校验
你没有校验executeUpdate()的返回值(该值表示SQL实际影响的行数),也没有针对更新结果做判断,哪怕没有符合条件的记录被更新,代码还是会弹出「Record Updated」的提示,误导你认为操作已经执行成功。 - 连接与事务风险
你两次调用dbConnection.getConnection()获取的是独立的数据库连接,若未开启自动提交,可能出现第一个更新提交成功、第二个更新未提交的情况。多表关联更新建议放在同一个事务中执行,要么同时成功要么同时回滚,避免数据不一致。
修正参考代码
DefaultTableModel RecordTable = (DefaultTableModel)jTable1.getModel(); int selectedRow = jTable1.getSelectedRow(); String sql ="UPDATE `sales` SET `Username`=?,`Type`=?,`Size`=?,`Unit_Price`=?,`Quantity`=?,`Total`=? WHERE `Type`=?"; // 补全sql2的WHERE条件,这里假设你是要匹配旧的Total值,根据实际业务调整 String sql2 ="UPDATE `orders` SET `Username`=?,`Total`=? WHERE `Username`=? AND `Total` = ?"; Connection conn = null; try { // 同一个事务用同一个连接 conn = dbConnection.getConnection(); // 关闭自动提交,开启事务 conn.setAutoCommit(false); String type = jComboBox_type.getSelectedItem().toString(); String size =jComboBox_size.getSelectedItem().toString(); String qty = jSpinner1.getValue().toString(); String tot = String.valueOf(total); String uprice = String.valueOf(price); int grstot = Integer.parseInt(jTextField_finaltot.getText())-Integer.parseInt(RecordTable.getValueAt(selectedRow, 4).toString()); finaltotal = grstot +total; jTextField_finaltot.setText(String.valueOf(finaltotal)); String u = jTextField_usn.getText(); RecordTable.setValueAt(type,jTable1.getSelectedRow(),0); RecordTable.setValueAt(size,jTable1.getSelectedRow(),1); RecordTable.setValueAt(uprice,jTable1.getSelectedRow(),2); RecordTable.setValueAt(qty,jTable1.getSelectedRow(),3); RecordTable.setValueAt(tot,jTable1.getSelectedRow(),4); // 执行sales更新 pst = conn.prepareStatement(sql); pst.setString(1, u); pst.setString(2,type ); pst.setString(3,size ); pst.setString(4,uprice); pst.setString(5,qty ); pst.setString(6,tot); pst.setString(7, type); int salesAffected = pst.executeUpdate(); // 执行orders更新 pst2 = conn.prepareStatement(sql2); pst2.setString(1, u); // 注意:这里如果SET的Total是新值,WHERE的应该是旧的Total值,你当前参数传的是同一个tot,逻辑可能有问题,根据实际业务调整 pst2.setString(2,tot); pst2.setString(3,u); pst2.setString(4,tot); // 这里如果是旧Total,应该传修改前的数值 int ordersAffected = pst2.executeUpdate(); // 提交事务 conn.commit(); // 打印影响行数方便排查 JOptionPane.showMessageDialog(null,String.format("更新成功,sales表影响%d行,orders表影响%d行", salesAffected, ordersAffected)); } catch (SQLException ex) { // 出现异常回滚事务 if (conn != null) { try { conn.rollback(); } catch (SQLException e) { e.printStackTrace(); } } Logger.getLogger(Pizza_Menu.class.getName()).log(Level.SEVERE, null, ex); JOptionPane.showMessageDialog(null,"更新失败:" + ex.getMessage()); } finally { // 关闭资源 if (pst != null) try {pst.close();} catch (SQLException e) {} if (pst2 != null) try {pst2.close();} catch (SQLException e) {} if (conn != null) try {conn.close();} catch (SQLException e) {} }
内容的提问来源于stack exchange,提问作者user16686753
相关产品推荐
相关产品推荐

