2012-12-28 38 views
0

所以,我想從SQL數據庫中選擇一個使用Java的語言,但要服從一個條件語句(少於或等於某些內容),但要服從Java中的某個循環。換句話說,類似如下:如何將Java循環與SQL條件選擇混合使用

for (int i=0; i< 195; i++) { 
      // Get the results of the SQL query 
      resultSet = statement.executeQuery( 
        "SELECT max(millisFromMid) FROM stockInfo1 WHERE (millisFromMid <= 34200000 + (120000)*i) GROUP BY stockID" 
        ); 

現在的Java這裏返回一個例外,因爲它不希望我用在這種情況下「我」;但是,如果不能在這裏使用它,我不知道我該如何改變這種情況。問題是這樣的:我正在尋找從一個數據庫檢索數據,目的是做一些操作並將結果放入一個新的數據庫中。這些操作取決於採用最新的數據,這就是爲什麼我想要增加millisFromMid的邊界數。那有意義嗎?

有沒有人有建議如何有人可以做這樣的事情?這似乎是一起使用Java和SQL時的基本技能,所以我非常想知道它。

+0

http://docs.oracle.com/javase/tutorial/java/data/strings.html –

+0

謝謝你排列我的問題,並給我那個鏈接。我已經讀過了,是的,這告訴我所有我想知道的字符串。但是,它並沒有解決問題本身。最好的是告訴我,我做這件事的方式是錯的,這很好,我已經知道了。那麼如何將這個條件變成INT條件呢? –

回答

5

SQL語句被解析並運行在與Java代碼不同的環境中 - 不同的語言,不同的作用域,除非您使用SQLite,否則它們運行在不同的進程或甚至不同的計算機上。因此,您不能僅從SQL代碼中引用Java變量i - 您必須注入它或使用特殊的API。

第一個選項 - 注入 - 是簡單地把我的價值裏面的字符串:

"SELECT max(millisFromMid) FROM stockInfo1 WHERE (millisFromMid <= 34200000 + (120000)*"+i+") GROUP BY stockID" 

就個人而言,我更喜歡用String.format做到這一點 - 不過這只是我。

String.format("SELECT max(millisFromMid) FROM stockInfo1 WHERE (millisFromMid <= 34200000 + (120000)*%d) GROUP BY stockID",i) 

第二個選項 - 通過API - 更復雜但更快(特別是如果您將它與事務組合) - 使用SQL參數。您需要創建一份準備好的聲明:

PreparedStatement preparedStatement = connection.prepareStatement("SELECT max(millisFromMid) FROM stockInfo1 WHERE (millisFromMid <= 34200000 + (120000)*?) GROUP BY stockID") 

注意的?被替換i - 這是你的參數。

for (int i=0; i< 195; i++) { 
    preparedStatement.setInt(1,i); //Set the paramater to the current value of i. 
    resultSet = preparedStatement.executeQuery(); //Execute the statement - each time with different value of the parameter. 
} 
+1

很好的答案。儘管對int值沒有風險,但我還要補充一點,直接向SQL字符串注入值通常是出於安全原因的一個壞主意(例如,如果這是由外部提供的字符串,這將是一個大問題用戶)。所以你應該更喜歡一般的API方法。 – mikera

+0

謝謝,我現在已經啓動並運行了該程序。這非常有幫助。 :) –

1

數據庫未被告知有關i的值的問題。取而代之的是讓Java將值放入字符串中,然後將其提交給數據庫。

string sql =「select * from foo where bar =」+ i;

您需要始終記住,數據庫只知道您明確告訴它的內容,並且您本質上是在運行時編寫代碼,以便在其他主機上執行。

0

您可以生成一個SQL字符串,並通過JDBC調用它,使用綁定變量是更正確的:循環之前,和內環路您每次設置的參數並執行它 - 您創建prepareStatement一次從性能,安全。它還可以避免你逃脫任何特殊字符。

由於您正在學習如何在jdbc中使用sql,請閱讀有關綁定變量的信息。一個例子是here