我正在尝试更新我的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=?
,其中yourcolumn
是正确的列名。
如果该列是动态的,则需要将其连接到查询字符串中(建议您对照允许的列名列表检查列名,以防止SQL注入问题)。
是否设置了中的参数?=
无效。
为什么?
JDBC驱动程序和引擎可以在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注入漏洞。 问题答案: 这表明数据库设计不正确。用户不需要知道列名。创建一