2013-03-04 72 views
0

我在使用Java PreparedStatements時遇到了SQL語法錯誤的一些問題。Java PreparedStatement語法問題

的三個語句我想準備如下:

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

在第一條語句,我想在兩個字符串傳遞,一個包含列的列表中插入進去,另一個包含要插入的所有值。在另外兩個語句中,我想在末尾插入一個(可選的)WHERE子句。

我已經看到了this這個問題看起來可以解決類似的問題,但在他的情況下,似乎他試圖在無意義的地方使用?除非我在SQL上失敗,否則我看不出有什麼理由不能在這裏插入我的字符串。我已經搜遍了Javadocs,但似乎也無法在那裏提出解釋。

非常感謝!

+2

你不能這樣使用'prepareStatement()'。你爲什麼不連接字符串,然後將結果傳遞給方法? – 2013-03-04 19:04:42

回答

1

這就是它的設計。 ?-s僅留下參數,請考慮使用StringBuilder連接您的'WHERE'子句。

這僅僅是一個簡單的情況下,U可以不使用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); 
+0

'StringBuilder'看起來很有希望。那麼在這種情況下,是否沒有辦法使用'PreparedStatement'?我對JavaDB相對較新。 – 2013-03-04 19:18:20

+0

@lan Knight StringBuilder僅用於串聯字符串,您仍然需要使用PreparedStatement來執行查詢 – 2013-03-04 19:21:19

0

爲了您的第一條語句:

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

我將從第二個?開始,在VALUES之後。由於您只有一個?,因此只有一個佔位符,因此只能將一個值傳遞給該語句。單就這一部分而言,您的目標無法通過JDBC實現。實際上,對於某些驅動程序和數據庫,prepareStatement()至少會將語句發送到數據庫服務器,指示它準備語句。那時服務器將解析並計劃語句,因此當時必須知道參數的列和數量。

0

「?」在JDBC中與由底層DBMS協議支持的參數替換密切相關。但是,您試圖更改發送到數據庫的實際SQL,而不是替換參數。