Java PreparedStatement语法问题

时间:2013-03-04 19:03:04

标签: java sql derby

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

我正在准备的三个陈述如下:

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

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

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

非常感谢!

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

首先发表声明:

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

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

答案 2 :(得分:0)

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

相关问题