backtick preparedStatement Java

时间:2018-05-17 08:44:16

标签: java mysql jdbc backticks

我对以下要发送到MySQL服务器的语句有困难:

UPDATE abonament SET ? = '1' WHERE abonutid = ?

我将它们替换为:

ps.setString(1, "`" + (indexLunaPlatita + 1) + "`");
ps.setInt(2, selVal);

但是当我运行程序时,我会把它变成MySQL:

''`24`' = '1' WHERE abonutid = 2'

因此它会自动用''。

包围后面的滴答表达式

请帮忙吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您不能将占位符(?)用于列名,仅用于值。这是一般规则(不限于MySQL)。

如果您需要根据用户输入确定列名,请务必小心 - 您必须清理输入以避免自己的SQL注入攻击,在这种情况下JDBC无法帮助您防止攻击。

?不适用于您的案例的原因是因为这些参数化查询是使用预准备语句实现的:

  • 语句被发送到数据库,解析,编译并可能优化,而目前不知道值
    • (用于预处理语句的主要用例是通过重用已编译语句来提高性能)
  • 然后在第二步中提供这些值,指示数据库使用这些值执行语句
  • 然后可以发送另一组值来执行准备好的语句,等等。

由于在第二步之前不会发送这些值,因此它们不能用于确定语句实际功能的任何内容(例如,它使用哪个或哪些表)。