使用Java执行SQL更新查询时出现报错问题
修正后的更新代码及注意事项
看起来你想要更新t_clr_payment_cycle_header表中对应Txn_life_cycle_ID = 'MCC000100222333333'的记录,将TXN_LIFE_CYCLE_IDENTIFICATION字段截取前15位存储。我发现你的代码里有几个需要调整的地方,下面是修正后的方案:
问题点梳理
- SQL语法错误:原语句末尾多了一个不必要的右括号
),会导致执行失败 - WHERE条件不匹配需求:你原本的条件是根据
payment_cycle_header_id筛选,但实际需求是针对特定Txn_life_cycle_ID的记录 - SQL注入风险:直接拼接字符串构造SQL存在安全隐患,推荐使用预编译语句
方案1:修正基础版(不推荐,仍有注入风险)
如果暂时需要快速调整原有代码,先修正语法和条件:
ArrayList<String> update_TXN_LIFE_CYCLE_IDENTIFICATION = new ArrayList<String>(); // 修正WHERE条件为你需要的Txn_life_cycle_ID,同时去掉多余的右括号 String Query_update_TXN_LIFE_CYCLE_IDENTIFICATION = "UPDATE t_clr_payment_cycle_header " + "SET TXN_LIFE_CYCLE_IDENTIFICATION = SUBSTR(TXN_LIFE_CYCLE_IDENTIFICATION, 1, 15) " + "WHERE Txn_life_cycle_ID = 'MCC000100222333333'"; // 执行数据库操作(这里补充完整你的DataBaseConnect调用逻辑) update_TXN_LIFE_CYCLE_IDENTIFICATION = DataBaseConnect.executeUpdate(Query_update_TXN_LIFE_CYCLE_IDENTIFICATION);
方案2:推荐的预编译语句(安全可靠)
为了避免SQL注入,使用PreparedStatement是更专业的做法:
String updateSql = "UPDATE t_clr_payment_cycle_header " + "SET TXN_LIFE_CYCLE_IDENTIFICATION = SUBSTR(TXN_LIFE_CYCLE_IDENTIFICATION, 1, 15) " + "WHERE Txn_life_cycle_ID = ?"; try (Connection conn = DataBaseConnect.getConnection(); PreparedStatement pstmt = conn.prepareStatement(updateSql)) { // 设置参数 pstmt.setString(1, "MCC000100222333333"); // 执行更新并获取受影响行数 int affectedRows = pstmt.executeUpdate(); System.out.println("更新了 " + affectedRows + " 条记录"); // 提交事务(如果你的连接不是自动提交的话) conn.commit(); } catch (SQLException e) { e.printStackTrace(); // 出现异常时回滚事务 try { if (conn != null) conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } }
额外注意事项
- 数据库函数差异:如果你的数据库是MySQL,需要把
SUBSTR换成SUBSTRING,两个函数用法略有不同 - 字段长度验证:确保
TXN_LIFE_CYCLE_IDENTIFICATION字段长度足够存储15位字符,避免截断报错 - 事务处理:更新操作建议放在事务中,确保数据一致性,出现异常及时回滚
内容的提问来源于stack exchange,提问作者Girish Hiremath
相关产品推荐
相关产品推荐

