2009-01-05 36 views
6

哪種方法更適合創建動態sql查詢? 格式化或流式傳輸? 它只是偏好或有任何理由比其他人更好?或者您使用它的任何特殊圖書館。編輯: 請在C++的情況下回答。在C++/java中創建sql查詢?

回答

4

在Java中,您應該使用PreparedStatement

PreparedStatement statement = connection.prepareStatement("SELECT * FROM Table WHERE ID = ?"); 
statement.setInt(1, 17); 
ResultSet resultSet = statement.executeQuery(); 
+0

謝謝,如何防止在c + +? – yesraaj 2009-01-05 09:36:02

+0

不知道,C++不是我的一杯茶。 :) – Bombe 2009-01-05 09:40:01

6

始終使用「準備」將會有一個相當於prepareStatement但確切的功能名稱將取決於您的數據庫和驅動程序的組合上。

了一個execute(String)將事先準備好的聲明中有很多優點: -

的語句解析和訪問計劃determind只有一次在執行「準備」語句。根據您運行語句的次數,這可以使得 帶來更好的性能。

當您通過 setString()傳遞字符串數據時,您不必擔心字符串數據中的特殊字符。在execute(String)中,數據中的任何單引號或分號都會導致解析錯誤。

更糟糕的是這是如何「SQL注入」攻擊工作。如果一個字符串類似於從cust_table中的「x」;從cust中刪除_表;選擇「作爲數據輸入它可能會導致解析和執行刪除語句。

數字的處理效率更高。 setInt調用需要一個整數值,因爲您必須將等價SQL字符串轉換爲字符,然後DBMS必須將其轉換回整數。

可讀性。你編寫了一個帶有幾個問號的單個SQL語句,其中變量比較容易閱讀,而不是精神分析和分析一系列字符串連接會爲額外的引號等引起額外的噪音。

然而,幾個其中execute(String)實際上更好的情況。

您的鑰匙分佈非常不均勻的地方。例如。如果95%的客戶居住在美國,而您想列出居住在加拿大的4%,那麼「where country =?」通常會導致表空間掃描,而「where country ='CA'」,則您有機會使用索引。

另一種情況是用戶可以輸入或省略多個搜索條件。根據給定的條件構建一個SQL字符串要比構造一個複雜的查詢更適合輸入條件的所有可能的排列。

1

當使用準備的語句是不可能的,我覺得用C++流是最好的方式來編寫查詢:

std::ostringstream sql; 
sql << "exec loadStuff(" << param1 << ", " << param2 << ")"; 

不必擔心參數類型和的長度字符串很棒!