【问题标题】:MySQL Java prepared statement Syntax errorMySQL Java 准备好的语句语法错误
【发布时间】:2021-03-18 22:46:36
【问题描述】:

我需要根据各种标准从 mysql 表中选择行,例如 Colour= Black 或 size= L。

代码在没有准备好的语句和问号的情况下工作,但是每当我尝试使用问号时,代码都不会运行。

我读过一些关于输入问号的内容,例如 \'?'//,但我不确定确切的格式。

String URL = "jdbc:mysql://localhost:3306/clothing";
String USERNAME = "root";
String PASSWORD = "password";
Connection con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
Statement stmt = con.createStatement();
String sql= "SELECT * FROM clothing.Lostandfound WHERE Colour = ? AND Size = ?;";
ResultSet rs = stmt.executeQuery(sql);
PreparedStatement preparedStmt = con.prepareStatement(sql);
preparedStmt.setString(1, Data1);
preparedStmt.setString(2, Data2);

另外,Size 是用橙色写出来的,但是当我只使用这个 sql 字符串时也会发生错误

String sql= "SELECT * FROM clothing.Lostandfound WHERE Colour = ?;";

我查看了大约 20 个不同的答案,但没有发现任何有用的信息,因此在此先感谢您的帮助!

【问题讨论】:

  • 您不必转义?。您忘记包含实际的错误消息。然而问题就在这里:ResultSet rs = stmt.executeQuery(sql);。应该是ResultSet rs = stmt.executeQuery();。前者不是PreparedStatement的方法。继承自Statement;忽略语句准备步骤;并且不知道?
  • @user207421 你为什么不回答你的评论,以便我们可以将此页面标记为已解决?

标签: java mysql sql jdbc


【解决方案1】:

您正在使用普通的java.sql.Statement 执行查询,而不是使用java.sql.PreparedStatement。这不起作用,因为普通的Statement 不支持参数化查询。因此,删除Statement 的创建和执行,并确保使用PreparedStatement 执行语句:

String URL = "jdbc:mysql://localhost:3306/clothing";
String USERNAME = "root";
String PASSWORD = "password";
String sql= "SELECT * FROM clothing.Lostandfound WHERE Colour = ? AND Size = ?;";
try (Connection con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
     PreparedStatement preparedStmt = con.prepareStatement(sql)) {
    preparedStmt.setString(1, Data1);
    preparedStmt.setString(2, Data2);
    try (ResultSet rs = preparedStmt.executeQuery()) {
        // process result set
    }
}

还要注意添加了try-with-resources,这将确保正确关闭连接、语句和结果集。

【讨论】:

  • 谢谢,我会试试你的方法。非常感谢
  • @XXXMathematicianXXX 如果我的回答帮助您解决了您的问题,请点击复选标记接受。另见What should I do when someone answers my question?
  • 顺便问一下,你知道我怎么也可以使用准备好的语句吗?列的名称?就像用 ?以及。我读到另一个答案?不能替换表名或列名,但我还是想问...否则我将不得不使用大量的if语句来真正让用户设置他想要比较数据的列...谢谢! !!
  • @XXXMathematicianXXX 您只能对进行参数化,无法对表或列名等对象名称进行参数化。
  • 好的,谢谢你,你帮了我很多。 ? 像你这样的人让这个地方变得很棒,我为此苦苦挣扎了太久。 :)
猜你喜欢
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多