簡體   English   中英

如何將Java循環與SQL條件選擇混合

[英]How to mix java loops with SQL conditional selects

因此,我想使用Java從SQL數據庫中進行選擇,但要遵循條件語句(小於或等於某項),並要遵循Java中的某些循環條件。 換句話說,如下所示:

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在這里返回一個異常,因為它不希望我在這種情況下使用“ i”。 但是,由於無法在這里使用它,我不確定如何更改此條件。 問題是這樣的:我正在尋找從一個數據庫中檢索數據的目的,是要進行一些操作並將結果放入一個新的數據庫中。 這些操作取決於獲取可用的最新數據,這就是為什么我想增加邊界millisFromMid的原因。 那有意義嗎?

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

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

第一種選擇-注入-只是將i的值放在字符串中:

"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這是您的參數。 prepareStatement創建一次 prepareStatement在循環之前,然后在循環內部每次都設置參數並執行它:

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.
}

問題是數據庫沒有被告知i的值。 而是使Java將值放入字符串中,然后將其提交到數據庫。

字符串sql =“從foo中選擇*,其中bar =” + i;

您需要時刻記住,數據庫只知道您明確告知的內容,並且實質上是在運行時編寫將在另一台主機上執行的代碼。

您可以生成一個sql字符串並通過jdbc調用它,從性能,安全性角度來看,使用bind變量更為正確。 它還可以避免轉義任何特殊字符。

由於您正在學習將sql與jdbc結合使用,因此請閱讀有關綁定變量的信息。 這里有一個例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM