如何批量更新多ID对应的数据表?优化循环拼接SQL方案
优化批量更新t_reserve表的SQL写法
直接手动拼接IN子句不仅代码冗余,还存在SQL注入风险,下面是几种更安全、更简洁的替代方案:
1. 使用预编译语句(PreparedStatement)
这是最推荐的方案,彻底规避SQL注入,代码逻辑也更清晰:
String[] arr_rs_seq = value.getString("rs_seq_array", "").split(","); // 生成对应数量的?占位符 String placeholders = String.join(",", Collections.nCopies(arr_rs_seq.length, "?")); String updateSql = "UPDATE t_reserve SET 字段名 = 新值 WHERE rs_seq IN (" + placeholders + ")"; try (PreparedStatement pstmt = connection.prepareStatement(updateSql)) { // 逐个设置参数 for (int i = 0; i < arr_rs_seq.length; i++) { pstmt.setString(i + 1, arr_rs_seq[i]); } pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }
预编译会自动处理参数的转义工作,不用手动拼接单引号和逗号,既安全又省心。
2. 借助ORM框架(如MyBatis)的批量更新
如果项目使用了MyBatis这类ORM框架,直接用foreach标签就能自动完成参数拼接:
Mapper接口
void batchUpdateReserves(@Param("rsSeqs") String[] rsSeqs);
Mapper XML文件
<update id="batchUpdateReserves"> UPDATE t_reserve SET 字段名 = 新值 WHERE rs_seq IN <foreach collection="rsSeqs" item="seq" open="(" separator="," close=")"> #{seq} </foreach> </update>
框架会自动处理SQL注入和参数拼接,代码简洁易维护。
3. 用CASE WHEN实现多值批量更新
如果需要给不同ID设置不同的更新值,可以用数据库的CASE WHEN语法,减少数据库交互次数:
String[] arr_rs_seq = value.getString("rs_seq_array", "").split(","); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("UPDATE t_reserve SET status = CASE rs_seq "); // 这里示例给每个ID设置不同的status值,可根据实际需求调整 for (String seq : arr_rs_seq) { sqlBuilder.append("WHEN '").append(seq).append("' THEN 2 "); } sqlBuilder.append("ELSE status END WHERE rs_seq IN (").append(String.join(",", arr_rs_seq)).append(")"); // 注意:如果用这种方式,建议还是结合预编译处理参数,避免注入风险
内容的提问来源于stack exchange,提问作者Ozodbek
相关产品推荐
相关产品推荐

