具有动态COLUMN名称的UPDATE TABLE

时间:2015-02-23 07:16:31

标签: java sql dynamic sql-update

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

现在我想用这些数据更新我的表格。 列名称为column1column2 ...等等; 我有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();
}

2 个答案:

答案 0 :(得分:4)

AFAIK,你不能使用&#34;准备好的陈述&#34;为了这。您可以通过自己在查询中执行插入来解决它:

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

答案 1 :(得分:3)

PreparedStatment只能绑定值,而不能绑定语法元素或对象名称,因此这种方法不会起作用。你必须回归字符串操作:

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();