首页 > 解决方案 > 如何在 SQL 中动态创建 UPDATE 查询,每次调用的列不同?

问题描述

我有一个数据有效负载,其JSON格式指示我将在所述表中更新的内容。我正在使用一个PreparedStatement. 我正在使用Java v8.212. 我在MySQL。我只想更新有效载荷中的字段:

有效载荷

{
 "column1": "value1"
 "column2": "value2"...
}

我遍历所述有效负载并创建我的SQL语句,如下所示:

String sql = "UPDATE table SET\n";

if(payload.valueX.isPresent) {
  //i have something at the end of the method that deals with commas
  sql.append("columnX = " + payload.getColumnX;
}

if(thisOtherColumnExists..) { etc }

try (Connection conn = geConnection();
     PreparedStatement ps = conn.prepareStatement(sql)) {
  //at this point how do i dynamically set bound vars?
  ps.executeQuery();
}

我不喜欢这种格式,因为存在SQL注入攻击的可能性。如何使用绑定变量创建它:

if(payload.valueX.isPresent) {
  sql.append("columnX = ?";
}

//how to dynamically set?
preparedStatement.setString();

然后循环遍历 SQL 并将正确的值添加到正确的字段?有时我会更新五列,有时是十列,有时是一列,而且它们的顺序几乎总是不同的。

标签: javamysqlsqlsql-update

解决方案


您必须使用多个参数搜索准备好的语句。

基本上你可以给 setString 方法下命令。

if(payload.valueX.isPresent) {
  sql.append("columnX = ?";
  preparedStatement.setString(1,payload.getColumnX;);
}

 //adding an integer parameter, e.g
if(payload.valueY.isPresent) {
  sql.append("columnY = ?";
  preparedStatement.setInt(2,payload.getColumnY;);
}

链接可以帮助您提供示例:

如果您想要一种更动态的排序语句方法,我认为您必须设置一个循环变量并在添加新项目时增加该变量。

更改问题后编辑

您必须使用集合(Array/List/HashMap 等)并填充每个 sql 条件。在 try/catch 循环中,此集合并同时添加准备好的语句。

注意:请不要编辑已接受的答案,因为您编辑的问题也需要更改答案,因此我们不能像一直编辑那样继续。:)


推荐阅读