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

现在,我想用这些数据更新表。
列名是column1column2 ...等等。
我在array[]中有数据,在unumber中有要更新的列数
我正在使用此代码,但无法正常工作。
附注:我是编码新手,所以可能太幼稚了。

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

最佳答案

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子句更新几列,因此可以循环遍历这些列并仅构造一条update语句。这将迫使您有两个循环(一个循环用于构造查询,一个循环用于在查询准备好后绑定值),但是它仍然应该相当快,因为​​您只访问数据库一次,而不是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();

07-26 02:05