使用预准备语句执行更新查询

时间:2013-01-24 22:37:15

标签: java mysql sql

 int selectie = toernooienUitvoer.getSelectedRow();
        int selectiec = toernooienUitvoer.getSelectedColumn();
        String primarykey =  (String) toernooienUitvoer.getValueAt(selectie, 0).toString();
        String waarde = toernooienUitvoer.getValueAt(selectie, selectiec).toString();

        String columnaam = toernooienUitvoer.getModel().getColumnName(selectiec).toString();
        String input = JOptionPane.showInputDialog("wijzig geselecteerde data", waarde);
        toernooienUitvoer.setValueAt(input, selectie, selectiec);   


PreparedStatement stat = con.prepareStatement("UPDATE fullhouse.toernooi SET ? = ? WHERE toernooi.T_code = ?");
        stat.setString(1, columnaam);
        stat.setString(2, input);
        stat.setString(3, primarykey);

大家,我知道查询是正确的,如果我输入值。我的猜测我的错误是在预备陈述中的某个地方 我收到了MySQLSyntaxErrorException:

4 个答案:

答案 0 :(得分:3)

我认为你不能使用占位符来动态传递列名,你的查询应该是:

"UPDATE fullhouse.toernooi SET colname = ? WHERE toernooi.T_code = ?"

答案 1 :(得分:3)

如其他答案中所述,占位符?只能用于值,而不能用于表名和列名。由于您没有重复使用PreparedStatement,这非常简单。

改变
PreparedStatement stat = con.prepareStatement("UPDATE fullhouse.toernooi SET ? = ? WHERE toernooi.T_code = ?")

PreparedStatement stat = con.prepareStatement("UPDATE fullhouse.toernooi SET " + columnName + " = ? WHERE toernooi.T_code = ?")

并调整setString来电中的索引参数。

答案 2 :(得分:0)

当你使用绑定变量时,它意味着语句是预编译的,并且在下次执行时,它会更快。您正在尝试将列的名称设置为绑定变量,这是不可能的。

因为你显然需要更新几个不同的列,为了达到一定的速度,你应该声明几个预备语句,每列一个。将它们保存在HashMap<String, PreparedStatement>

答案 3 :(得分:0)

预准备语句的列名不能是动态的,因为根据列名,查询计划将大不相同(例如,有时表扫描将是最快的,有时使用索引,有时甚至更深奥)。

如果SQL不能依赖某个计划是最快的,那么每次都需要提出一个新计划 - 这意味着制作一个准备好的声明是没有意义的,这就是为什么你不能这样做。 / p>