当前位置: 首页 > 知识库问答 >
问题:

如何在Java使用准备好的报表?

贡可人
2023-03-14

我正在尝试更新我的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```

共有2个答案

章翔宇
2023-03-14

您不能参数化对象名称,因此不可能通过准备好的语句设置列名。所以,而不是集?=?,则必须使用set yourcolumn=?,其中yourcolumn是正确的列名。

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

田翰林
2023-03-14

是否设置了中的参数?=无效。

为什么?

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

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

在SQL语句中应用参数有两个主要好处:

  • 安全性:查询不受SQL注入的影响。如果您键入一个危险的代码段作为参数,它不会损害执行;它可能会失败,但不会因此删除整个数据库。
  • 性能:当您使用不同的参数值多次调用SQL语句时,该语句将是相同的。这使得引擎中的缓存效率更高,执行速度更快。
 类似资料:
  • 我有下面的代码,我想在它上面关闭preparedStatement对象,因为它是作为一个来自sonar的bug提出的。 如何关闭preparedStatement对象?我看到的大多数示例大多使用try/finally或try with resources,然后创建对象并使用它try and close in finally。然而,在这里,对象是在单独的函数中创建的,它从那里返回,然后被使用。所以创

  • 问题内容: 何时使用语句而不是准备语句。我想在没有参数的查询中使用语句,但是为什么不使用预处理语句呢?对于没有参数的查询,哪一个更快。 问题答案: 我想在没有参数的查询中使用语句,但是为什么不使用预处理语句呢? 还差得远 对于返回结果集或更新计数的INSERT,UPDATE和DELETE语句,使用PreparedStatement。正如Joachim所指出的,它们不适用于DDL语句,也不适用于应使

  • 问题内容: 我正在尝试使用准备好的语句来设置表名以从中选择数据,但是执行查询时,我总是收到错误消息。 错误和示例代码如下所示。 有什么想法可能导致这种情况? 问题答案: 表名不能用作参数。它必须是硬编码的。因此,你可以执行以下操作:

  • 问题内容: 我正在使用准备好的语句来执行mysql数据库查询。我想实现基于各种关键字的搜索功能。 为此,我需要使用关键字,这一点我知道很多。而且我之前也使用过预处理语句,但是我不知道如何使用它,因为从以下代码中,我将在哪里添加? 我可以直接在或类似的东西中使用它吗?我在网络上看到很多帖子,但在任何地方都没有好的答案。 问题答案: 你需要在值本身中而不是在准备好的语句SQL字符串中进行设置。 因此,

  • 问题内容: 我已经使用预备语句尝试了几次,但是它返回SQL异常。这是我的代码: 运行此程序时,出现以下SQL异常: 有什么建议可以使这项工作吗?任何代码都值得赞赏。 问题答案: 您需要使用: 代替 当您将字符串传递给 该 查询时,将按字面意义执行查询,因此将其发送到数据库,然后数据库会产生错误。通过传递查询字符串,您不会执行传递值的“已缓存”准备语句。

  • 问题内容: 我想知道是否仍然可以使用准备好的语句指定返回的列名。 我正在使用MySQL和Java。 当我尝试时: 我得到了这种类型的语句(在执行之前立即打印)。 我希望看到: 我知道,我不能为表名这样做,因为讨论 这里,但不知道是否有一些方法来做到这一点对列名。 如果没有,那么我将只需要尝试确保对输入进行清理,以免导致SQL注入漏洞。 问题答案: 这表明数据库设计不正确。用户不需要知道列名。创建一