2016-07-12 134 views
0
query = "UPDATE personal_details SET '" + field + "' = '" + edit + "' WHERE associate_id = '" + associate_id + "'"; 

這裏我的表名是personal_details,我將表列名稱作爲變量字段中的參數以及編輯中的新值。這段代碼是用Java編寫的。我正在訪問的數據庫在PostgreSQL中。我可以通過這種方式傳遞列名嗎?

+2

你可以做到這一點,它的工作,但你將SQL注入攻擊敞開的,假定這些變量來自用戶輸入 –

+0

是的,你可以像這樣傳遞查詢。你有什麼問題嗎? –

+0

是的..我刪除了單引號。 query =「UPDATE personal_details SET」+ field +「='」+ edit +「'WHERE associate_id ='」+ associate_id +「'」; –

回答

0

您正在構造一個包含該查詢的字符串。數據庫不知道如何構造字符串。最終,您只需將該字符串傳遞到將被解析,編譯和執行的位置。所以是的,你可以這樣構造查詢。

無法將列名或表名作爲參數傳遞到查詢中。建議您將其他值作爲參數傳遞到查詢中。

1

雖然你可以使用普通的級聯構建字符串,則比較推薦的方法是:

  1. 使用StringBuilder/StringBuffer的,當你建立字符串優化程序的速度,特別是如果您連接內環路串;
  2. 最值得推薦的方法是使用PreparedStatement並填充參數值。參見:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
+0

建議不要使用StringBuilder進行查詢構建。 StringBuffer已棄用,不應再使用。 –

+0

@ adriaan-koster同意棄用的StringBuffer,也同意你的觀點,即StringBuilder不是最合適的解決方案。我只是展示了大多數可能的方法。親自**我**更喜歡使用** PreparedStatements **。 – lospejos

1

不要構建像這樣的查詢! @Rory指出,由於安全問題,這是不好的做法。相反,使用帶參數的PreparedStatement,例如:

String updateTableSQL = "UPDATE DBUSER SET USERNAME = ? WHERE USER_ID = ?"; 
PreparedStatement preparedStatement = dbConnection.prepareStatement(updateTableSQL); 
preparedStatement.setString(1, "mkyong_new_value"); 
preparedStatement.setInt(2, 1001); 
// execute insert SQL stetement 
preparedStatement .executeUpdate(); 

(來自mkyong兩者)​​

相關問題