0

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

我试图准备的三个陈述如下:

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

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

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

非常感谢!

4

3 回答 3

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);
于 2013-03-04T19:07:05.920 回答
0

对于您的第一个陈述:

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

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

于 2013-03-04T19:07:59.447 回答
0

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

于 2013-03-04T19:08:38.727 回答