【问题标题】:UPDATE TABLE with dynamic COLUMN name使用动态 COLUMN 名称更新 TABLE
【发布时间】:2015-04-24 11:18:44
【问题描述】:

我在一个从 HTML 表单中获取的数组中有动态数量的数据值。

现在我想用这些数据更新我的表格。 列名是 column1 , column2 ... 等等; 我在array[] 中有数据,在unumber 中有要更新的列数 我正在使用此代码,但它不起作用。 P.S:我是编码新手,所以可能很幼稚。

for(int i=1; i<=unumber; i++)
{
        String username = "someuser";
        String column = "column" + Integer.toString(i);
        PreparedStatement pr = null;
        String query1 = "update table1 set (?) = (?) where username = (?)";
        pr = con.prepareStatement(query1);
        pr.setString(1, column);
        pr.setString(2, array[i]);
        pr.setString(3, someuser);
        int s = pr.executeUpdate();
}

【问题讨论】:

  • 作为一个快速的提示,你没有在桌子上做一个 ALTER,因为那个关键字有非常不同的含义。您正在连续更新字段,完全不同
  • 您不能在准备好的语句中使用参数作为标识符。

标签: java sql dynamic sql-update


【解决方案1】:

AFAIK,您不能为此使用“准备好的语句”。您可以通过自己在查询中执行插入来解决它:

String query1 = "update table1 set "+column+" = ? where username = ?";
    pr = con.prepareStatement(query1);
    pr.setString(1, array[i]);
    pr.setString(2, someuser);

要注意 sql 注入。您最好检查列的可能值是否不能更改。 验证所有导致确定列名的输入

确保用户不能自己指定列:否则例如可以将列设置为password 并为某些用户设置密码。然后使用该密码登录。或者可以尝试将column 设置为'; drop table foo; select * where x

【讨论】:

  • @JBNizet:确实,这是我犯的一个错误。感谢您的关注。
【解决方案2】:

PreparedStatments 只能绑定值,不能绑定语法元素或对象名称,如列,因此这种方法行不通。您将不得不回退到字符串操作:

for(int i=0; i<unumber; i++) {
        String username = "someuser";
        String column = "column" + Integer.toString(i);;
        PreparedStatement pr = null;
        String query1 = "update table1 set " + column + " = (?) where username = (?)";
        pr = con.prepareStatement(query1);
        pr.setString(1, column);
        pr.setString(2, someuser);
        int s = pr.executeUpdate();
}

此外,由于您要使用相同的 where 子句更新多个列,因此您可以遍历这些列并仅构造 一个 更新语句。它将迫使您有两个循环(一个用于构造查询,一个用于在准备好查询后绑定值),但它仍然应该更快,因为您只访问数据库一次而不是 N 次:

String username = "someuser";
StringBuilder sql = new StringBuilder("update table1 set ");
for(int i=0; i < unumber; i++) {
    sql.append("column")
       .append(i).
       .append(" = ?");
    if (i != (unumber - 1)) {
        sql.append(", ");
    }
}
sql.append("where username = (?)");

PreparedStatement pr = con.prepareStatement(sql.toString());

for(int i = 0; i < unumber; i++) {
    pr.setString(i, array[i]);
}
pr.setString(unumber, someuser);
int s = pr.executeUpdate();

【讨论】:

    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2023-03-23
    相关资源
    最近更新 更多