如何在Java中使用准备好的语句?

如何在Java中使用准备好的语句?,java,mysql,jdbc,Java,Mysql,Jdbc,我正在尝试更新mySQL数据库中的一个条目。在这里它可以正常工作,例如: String sql = "SELECT * FROM entries WHERE user_id = ?"; PreparedStatement stmt = con.prepareStatement(sql); stmt.setInt(1, currUserId); System.out.println("Curr User

我正在尝试更新mySQL数据库中的一个条目。在这里它可以正常工作,例如:

        String sql = "SELECT * FROM entries WHERE user_id = ?";

        PreparedStatement stmt = con.prepareStatement(sql);
        stmt.setInt(1, currUserId);
        System.out.println("Curr User Id: " + currUserId);
        //Execute Query
        ResultSet rs = stmt.executeQuery();
但在这里我总是会出错,不知道为什么

        String sql = "UPDATE entries SET ? = ? WHERE user_id = ? AND id = ?";
        PreparedStatement stmt = con.prepareStatement(sql);
        stmt.setString(1, type);
        stmt.setString(2, value);
        stmt.setInt(3, App.connection.currUserId);
        stmt.setInt(4, id);

        int returnValue = stmt.executeUpdate();
这是我的错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''username' = 'benNeu' WHERE user_id = 13 AND id = 22' at line 1```

无法参数化对象名称,因此无法通过准备好的语句设置列名。因此,不是
SET?=
,您必须使用
设置您的列=?
,其中
yourcolumn
是正确的列名


如果该列是动态的,则需要将其连接到查询字符串中(建议您对照允许的列名列表检查列名,以防止SQL注入问题)。

您无法参数化对象名,因此无法通过准备好的语句设置列名。因此,不是
SET?=
,您必须使用
设置您的列=?
,其中
yourcolumn
是正确的列名


如果该列是动态的,则需要将其连接到查询字符串中(建议您对照允许的列名列表检查列名,以防止SQL注入问题)。

设置
中的参数=无效

为什么?

JDBC驱动程序和引擎可以在SQL语句中的有限位置应用参数。这些对应于通常可以看到文字值的位置

通常情况下,不能使用参数代替表名、列名(正如您在问题中试图做的那样)和其他SQL子句。记住,参数是应用的,它们不会连接到SQL语句中

将参数应用于SQL语句有两个主要好处:

  • 安全性:查询不受SQL注入的影响。如果键入危险代码段作为参数,则不会影响执行;它可能会失败,但不会因此删除整个数据库
  • 性能:使用不同的参数值多次调用SQL语句时,它将是相同的。这使得引擎中的缓存效率更高,执行速度更快

    • 设置
      中的参数=无效

      为什么?

      JDBC驱动程序和引擎可以在SQL语句中的有限位置应用参数。这些对应于通常可以看到文字值的位置

      通常情况下,不能使用参数代替表名、列名(正如您在问题中试图做的那样)和其他SQL子句。记住,参数是应用的,它们不会连接到SQL语句中

      将参数应用于SQL语句有两个主要好处:

      • 安全性:查询不受SQL注入的影响。如果键入危险代码段作为参数,则不会影响执行;它可能会失败,但不会因此删除整个数据库
      • 性能:使用不同的参数值多次调用SQL语句时,它将是相同的。这使得引擎中的缓存效率更高,执行速度更快

      您不能仅在准备好的语句数据中设置列名您不能仅在准备好的语句数据中设置列名谢谢mate,WorksThank mate,works