【问题标题】:Java PreparedStatement syntax issuesJava PreparedStatement 语法问题
【发布时间】:2013-03-04 19:03:03
【问题描述】:

我在使用 Java PreparedStatements 时遇到一些 SQL 语法错误问题。

我试图准备的三个语句如下:

insertBook = con.prepareStatement("INSERT INTO Books ? VALUES ?");
selectBooks = con.prepareStatement("SELECT * FROM Books?");
deleteBooks = con.prepareStatement("DELETE FROM Books?");

在第一个语句中,我想传入两个字符串,一个包含要插入的列列表,另一个包含要插入的所有值。在另外两个语句中,我想在末尾插入一个(可选的)WHERE 子句。

我已经看到this question 似乎处理了类似的问题,但在他的情况下,他似乎试图在没有意义的地方使用 ?s;除非我在 SQL 上失败了,否则我看不出有什么理由不能在这里插入我的字符串。我搜索了 Javadocs,但似乎也无法在那里找到解释。

非常感谢!

【问题讨论】:

  • 你不能那样使用prepareStatement()。为什么不连接字符串,然后将结果传递给方法?

标签: java sql derby


【解决方案1】:

这就是它的设计方式。 ?-s 仅用于参数,考虑使用StringBuilder 连接您的“WHERE”子句。

这只是一个简单的例子,你不能在这里使用StringBuilder,它对于构建复杂的查询很有效

这是你的例子

String whereClause = " WHERE Id = ?";

String insert = "INSERT INTO [Table](C1, C2) VALUES(?, ?)";
String select = "SELECT * FROM [Table] ";
String update = "UPDATE [Table] SET C1 = ? ";
String delete = "DELETE FROM [Table] ";

PreparedStatement insertSt = con.prepareStatement(insert);
PreparedStatement selectSt = con.prepareStatement(select + whereClause);
PreparedStatement deleteSt = con.prepareStatement(update + whereClause);
PreparedStatement updateSt = con.prepareStatement(delete + whereClause);

【讨论】:

  • StringBuilder 看起来很有希望。那么在这种情况下是否根本无法使用PreparedStatement?我对 JavaDB 比较陌生。
  • @lan Knight StringBuilder 仅用于字符串的连接,您仍然需要使用 PreparedStatement 执行查询
【解决方案2】:

对于您的第一个陈述:

insertBook = con.prepareStatement("INSERT INTO Books ? VALUES ?");

我将从VALUES 之后的第二个? 开始。由于您只有一个?,因此您只有一个占位符,因此只能将一个值传递给语句。仅此部分就使您的目标无法通过 JDBC 实现。事实上,prepareStatement() 将至少对于某些驱动程序和数据库,将语句发送到数据库服务器,指示它准备语句。届时服务器将解析和规划语句,因此此时必须知道列和参数的数量。

【讨论】:

    【解决方案3】:

    “?”在 JDBC 中,与底层 DBMS 协议支持的参数替换密切相关。但是,您正在尝试更改发送到数据库的实际 SQL,而不是替换参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 2011-04-19
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 2021-02-21
      相关资源
      最近更新 更多