2012-03-27 92 views
0

我有一個字符串數組,其中包含500個股票的名稱。現在我在我的mysql數據庫中有一張表,裏面保存着1000多個股票的符號,並帶有它們的名字。我想要做的是從我擁有的表格中檢索這500個股票的符號。我試了下面的代碼從jdbc檢索數據

Class.forName("com.mysql.jdbc.Driver"); 
Connection conn=DriverManager.getConnection("jdbc:mysql//localhost/mydatabase","user","pass"); 
PreparedStatement stmt = conn.prepareStatement("SELECT (NAME) FROM stocks1 WHERE FULLNAME =?"); 
for(int i1=0;i1<i;i1++) 
{ 
    stmt.setString(1, name[i1]); 


    stmt.addBatch(); 
} 
ResultSet t=stmt.executeQuery(); 
while(t.next()) 
    System.out.println(t.getString("NAME")); 

但它不工作。沒有打印。我想我在stmt.addBatch()中犯了一個錯誤。此外,如果我想要名稱[i1]由一個通配符(%)作爲後綴,我會如何做到這一點。

+1

批處理是針對DML狀態,而不是查詢。您需要爲每個要檢索的ID運行SELECT,或者使用'WHERE IN(...)'(它不能在準備的語句中使用) – 2012-03-27 11:33:46

+0

請參閱http://stackoverflow.com/questions/7899543/in -java-can-preparedstatement-addbatch-be-used-for-select-queries – 2012-03-27 11:41:12

+0

@ Riddhish.Chaudhari-對上述問題的答案中的鏈接似乎有一些錯誤。@ ahorsewithnoname, - 所以我必須把將語句選擇到for循環並運行它。 – user1092042 2012-03-27 11:45:57

回答

1

您可以爲您的字符串數組中的股票創建一個表,並與您的stocks1表進行聯接。

比方說,你arraystocks表的名稱與一個FULLNAME的代碼看起來像這樣stocksperuser:

Class.forName("com.mysql.jdbc.Driver"); 
Connection conn=DriverManager.getConnection("jdbc:mysql//localhost/mydatabase","user","pass"); 
PreparedStatement stmt = conn.prepareStatement("SELECT NAME FROM stocks1 WHERE FULLNAME is in (SELECT FULLNAME FROM arraystocks)"); 
ResultSet t=stmt.executeQuery(); 
while(t.next()) { 
    System.out.println(t.getString("NAME")); 
} 
+0

這將意味着創建一個新表。有沒有其他的方式來做到這一點。 – user1092042 2012-03-27 11:56:01

+0

您可以使用臨時表,在關閉事務後它們會自動丟棄。但我不知道如果MySQL支持這一點。但沒有表格,你必須循環,就像你自己提到的那樣。如果您的查詢性能至關重要,則必須使用'where in(..)'。但是這些陳述的長度通常是有限的,所以你必須處理大量的股票名稱,例如一個查詢中有100個股票。 – Andreas 2012-03-27 12:01:46

+0

我用你的答案,但它在(SELECT FULLNAME FROM ...)中引發語法異常。 – user1092042 2012-03-27 12:08:36

1

對於包含通配符,如下圖所示,你可以做。

在SELECT語句中刪除=,並添加LIKE

PreparedStatement stmt = conn.prepareStatement("SELECT (NAME) FROM stocks1 WHERE FULLNAME LIKE ?"); 

在了setString方法添加%。

ps.setString(1, name[i1]+ "%"); 

此外,對於空行問題,請檢查兩個比較列的情況是否相同,無論它們應該在上還是下。 如果不是,那麼你可以在進行比較時進行轉換,如下所示。

SELECT (NAME) FROM stocks1 WHERE upper(FULLNAME) LIKE ? 

ps.setString(1, upper(name[i1])+ "%");