2013-02-14 28 views
3

我是java新手。我想將從FileChooser中選擇的文件路徑插入到數據庫中。但是,當我嘗試這樣做時,路徑是正確的,直到查詢語句,並將其輸入到數據庫後,它將刪除文件路徑中存在的所有反斜槓。插入文件路徑到數據庫中刪除

filepath=f.getCanonicalPath(); 
// some database statements.... 
String query="insert into table1 values('" + filepath + "')"; 

如果我選擇的文件路徑爲:

「C:\用戶\文檔\ hello.txt的」;

它插入它:

「C:Usersdocumentshello.txt」

+1

你能告訴我們更多的代碼嗎?我相信'StringEscapeUtils.escapeSql'或正確的準備/綁定/執行Java代碼的使用將解決您的問題 – Najzero 2013-02-14 09:42:36

+1

@Najzero:如果您適當地使用參數化SQL,則不應該* escape *任何東西。 – 2013-02-14 09:43:40

+1

@JonSkeet那是正確的。將它更改爲或 - 並且綁定/參數化查詢是首選方式 - 編輯,這會錯過一個bobby表引用。 – Najzero 2013-02-14 09:46:56

回答

9

基本上,你不應該直接把你的價值成這樣的SQL。

您應該使用PreparedStatement並使用您的值設置參數。不需要轉義,也沒有SQL注入攻擊的風險。

String query = "insert into table1 values(?)"; 

PreparedStatement statement = connection.prepareStatement(query); 
try { 
    statement.setString(1, filePath); 
    statement.executeUpdate(); 
} finally { 
    statement.close(); 
} 

任何當你發現自己構建動態地根據用戶輸入的SQL,你應該退後一步,並強烈考慮參數化的SQL來代替。 (例外是,如果你的應用基本上是一個SQL開發工具...)

+0

Jon Skeet我正在使用mysql,所以PreparedStatement顯示它在java.sql下的包 – sincerekamal 2013-02-14 10:23:12

+1

@ user2057804:'java.sql'包是MySQL驅動程序將支持的通用JDBC接口。使用MySQL不是*不使用PreparedStatement的原因。 – 2013-02-14 10:24:07

+0

謝謝大家的即時回覆。我特別感謝[Najzero](http://stackoverflow.com/users/1563305/najzero)讓我瞭解** StringEscapeUtils **,它最終幫助很輕鬆。 :) – sincerekamal 2013-02-14 20:48:12