2012-07-03 28 views
27

我正在使用Java PreparedStatment對象構造一系列批處理的INSERT查詢。查詢語句的格式爲...如何使用java編寫語句的表名變量插入

String strQuery = "INSERT INTO ? (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);"; 

...所以無論字段值和表名是變量(即我有同樣的列格式的每個插入將被引導到多個表不同的)。如果我刪除「?」,我可以讓執行程序工作。表名變量和硬代碼,但每一製備的聲明將被插入到一個不同的表,所以需要保持一個變量我填充之前立即執行使用批量查詢...

stmt.setString(1, "tableName1"); 

我怎樣才能讓這成爲一個充滿活力可變嗎?

回答

37

你不能。您需要使用字符串連接/佔位符與String.format構造sql。準備好的語句是針對列值而不是表名。

+2

謝謝大家......好像我不知道要插入的表名,直到交換每行的變量爲止,最好的辦法是在DB存儲過程中構建插入。然後將每行的所有參數傳遞給存儲過程,然後讓DB處理表名操作。無論如何感謝人們的答覆。 :-) – ForestSDMC

+13

這是否意味着SQL注入保護對於動態表名是不可能的? –

+0

@Richard我得出了同樣的結論,聽起來很愚蠢,但至少可以根據數據庫中可用表的列表來檢查表名。 – JulienD

-3

您需要將其添加到原始字符串:

String tableName = "some_table_name"; 
// some other code 
String strQuery = "INSERT INTO " + tableName + " (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);"; 

你需要在strQuery分號? (你可以這樣做,它對我來說看起來有點奇怪:-))

+6

容易受到SQL注入代替。不要使用這個答案,孩子! – SigmaX

+6

......這取決於你的tableName來自哪裏。如果它來自用戶或來自不可靠的客戶,那麼我會同意你的意見。但是如果它包含在你自己的方法中,那麼String的不變性意味着它確實是安全的。 –

+0

技術上屬實。但是,一個好的答案仍然需要大量的免責聲明:「通常,避免使用動態SQL查詢,這段時間被廣泛認爲是不安全的做法。如果你必須這樣做,確保你確切地知道你在做什麼。 – SigmaX

-2

表名不能用作參數。它必須是硬編碼的。嘗試像這樣:

String tableName = "tableName1"; 
String strQuery = "INSERT INTO " + tableName + " (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);"; 
+7

易受SQL注入影響。不要使用這個答案,孩子! – SigmaX

-1

一種替代可以是String.format

例如

String sql = String.format("INSERT INTO $1%s (col1, col2, col3, (etc)", myTablename); 
+15

易受SQL注入攻擊。不要使用這個答案,孩子! – SigmaX

+12

這是通常的「哦,我知道什麼SQL注入是」偏執狂 - 它完全取決於myTablename來自哪裏。 – davidfrancis

+3

同意。但是,與大多數安全問題一樣,訪問問答網站的很大一部分人都不會理解他們需要關注myTablename的來源。所以答案需要合格。 – SigmaX

11

您可以使用佔位符代替表名,然後用您的表名替換它。

String strQuery = "INSERT INTO $tableName (col1, col2, col3, col4, col5) 
        VALUES (?,?,?,?,?,?);"; 

和當u諳表名

String query =strQuery.replace("$tableName",tableName); 
stmt =conn.prepareStatement(query); 
+27

容易受到SQL注入的影響。不要使用這個答案,孩子! – SigmaX

+7

只有$ tablename是從用戶輸入,但是,對不對?但是如果像單選按鈕選擇那樣返回一個枚舉值,或者將$ tablename的可能值限制爲一個已定義的集合的其他方法,那麼它會好嗎? – Toadfish

+9

@SigmaX那麼你的解決方案不容易受到SQL注入攻擊? – Mahdi