使用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,但似乎无法在那里找到解释。
非常感谢!
答案 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,而不是替换参数。