2012-03-27 3 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

Batching предназначен для DML statemnts, а не для запросов. Вам нужно запустить SELECT для каждого идентификатора, который вы хотите получить, или использовать 'WHERE IN (...)' (который не может использоваться в подготовленном заявлении) –

+0

см. Http://stackoverflow.com/questions/7899543/in -java-can-readystatement-addbatch-be-used-for-select-queries –

+0

@ Riddhish.Chaudhari. Ссылка в ответе на вышеупомянутый вопрос, похоже, имеет некоторые ошибки. @ ahorsewithnoname, - Так что я должен поставить выберите оператор в цикл for и запустите его. – user1092042

ответ

1

Вы можете создать таблицу для запасов в своем массиве строк и присоединиться к таблице ваших акций1.

Скажем, таблица для arraystocks называется stocksperuser с одной колонке FULLNAME код выглядит следующим образом:

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

+0

Вы можете использовать временные таблицы, которые автоматически удаляются после закрытия транзакции. Но я не уверен, поддерживает ли mysql это. Но без таблиц вы должны зацикливаться, как вы сами упоминали. Если ваш запрос критичен по производительности, вы должны использовать 'where in (..)'. Но длина инструкций обычно ограничена, поэтому вам нужно обрабатывать куски парных имен, например. 100 акций в одном запросе. – Andreas

+0

Я использовал ваш ответ, но он генерирует исключение синтаксиса at is (SELECT FULLNAME FROM ...). – user1092042

1

Для включая подстановочные, вы можете сделать, как показано ниже.

В вашем отборное заявление REMOVE = и добавьте 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])+ "%"); 
Смежные вопросы