2012-03-30 3 views
0

У меня есть 6 столбцов в таблице. У меня есть запрос select, который выбирает некоторые записи из таблицы. В то время как итерация набора результатов, им с помощью следующей логики для извлечения значений в столбцах:Любой лучший подход, а не result.getString() при повторении набора результатов в java

Statement select = conn.createStatement(); 
     ResultSet result = select.executeQuery 
     ("SELECT * FROM D724933.ECOCHECKS WHERE ECO = '"+localeco+"' AND CHK_TOOL = '"+checknames[i]+"'"); 
     while(result.next()) { // process results one row at a time 
      String eco = result.getString(1); 
      mapp2.put("ECO", eco); 
      String chktool = result.getString(2); 
      mapp2.put("CHECK_TOOL", chktool); 
      String lastchktime = result.getString(3); 
      mapp2.put("LAST_CHECK_TIME", lastchktime); 
      String status = result.getString(4); 
      mapp2.put("STATUS", status); 
      String statcmts = result.getString(5); 
      mapp2.put("STATUS_COMMENTS", statcmts); 
      String details = result.getString(6); 
      mapp2.put("DETAILS_FILE", details); 
     }    

У меня есть 2 вопроса здесь: 1. Есть ли лучший подход, а не использовать result.getString()? ?? 2. Скажем, еще один столбец добавляется к таблице в более поздней точке. Есть ли способ, которым мой код обрабатывает это новое добавление без внесения изменений в код в этот момент времени

ответ

3

Вы можете использовать ResultSetMetaData, чтобы определить количество и названия столбцов в вашем ResultSet и разобраться с ним таким образом. Обратите внимание, однако, что изменение количества столбцов в базе данных, влияющих на ваш код, и наличие кода еще не всегда может быть хорошей идеей.

Кроме того, обратите внимание, что вы переписываете значения на карте на каждой итерации цикла. Вероятно, вы хотите добавить эти карты в какой-то список?

И, наконец, вы должны убедиться, что ваши методы getString не возвратят null в любом месте, иначе его размещение на карте вызовет исключение.

Statement select = conn.createStatement(); 
ResultSet result = select.executeQuery("SELECT * FROM D724933.ECOCHECKS WHERE ECO = '"+localeco+"' AND CHK_TOOL = '"+checknames[i]+"'"); 
ResultSetMetaData rsmd = result.getMetaData(); 

int numberOfColumns = rsmd.getColumnCount();  
List data = new ArrayList<Map>(); 
Map mapp2; 

while(result.next()) { // process results one row at a time 
    mapp2 = new HashMap<String, String>(); 
    for(int i=1; i<=numberOfColumns; i++) { 
     mapp2.put(rsmd.getColumnName(i), rs.getString(i)); 
    } 
    data.add(mapp2); 
} 
+0

@jtahlborn Поскольку я извлекаю все столбцы и извлекаю их по индексу быстрее, чем поиск по имени. Если вам это нравится, вы можете использовать 'rs.getString (rsmd.getColumnName (i))' - но почему? Помните, что имена столбцов недоступны заранее, мне нужно получить их во время выполнения. –

+1

Кто бы ни старался объяснить, почему? –

+0

Алекс G был совершенно прав о целом ответе. Я не вижу в его ответе ничего, что могло бы случиться. Я принимаю его ответ как правильное решение для моего вопроса –

0

В каждом из методов get методов на ResultSet есть перегруженный вариант, который принимает имя столбца в качестве аргумента. Вы можете использовать это вместо этого, чтобы уменьшить зависимость от упорядочения столбцов.

ResultSet results = ...; 
results.getString(1); 

Вы можете сделать это:

results.getString("name"); 

Но предпочтительный способ обработки такого рода проблемы навязать порядок самостоятельно на наборе результатов, с помощью в явном виде выбора столбцов, которые вы хотите в исходном запросе.

0

Если ваша таблица добавляет новый столбец, то, очевидно, вам нужно изменить свой код, потому что в вашем коде используется жестко закодированное значение, я имею в виду getString (1).

Вместо этого используйте ResetSetMetaData's getColumnCount и выполните некоторую другую логику, чтобы динамически получать эти значения столбцов.

Другое дело, на ваш первый вопрос, ResultSet содержит getXXX() методы с двумя типами параметров, Строка имени столбца и индекс столбец внутр. Вы использовали индекс вместо имя столбца, которое будет работать быстрее.

0

Это плохая практика, чтобы использовать SELECT *, вместо этого вы должны выбрать только те столбцы, вы заинтересованы в Причина заключается в том, что именно вы говорили:. Что произойдет, если ваши изменения БД. вы не хотите тратить весь код и находить и редактировать все заявления SELECT *.

Вам не нужно поместить результат в вашу собственную карту, потому что вы уже можете сделать:

result.getString("DETAILS_FILE"); 

Но уже есть другие ответы, объясняющие это.

Было бы также полезно использовать константу вместо строки «DETAILS_FILE». Вы можете использовать константу в SELECT и в result.getString(). В случае изменения вашей БД вам нужно только ввести новую константу или изменить существующую.

+0

, соглашаясь с u относительно использования SELECT *. Я изменю его на имена столбцов, которых я требую –

+0

Хотя я согласен с использованием SELECT *, существуют веские причины, когда это может быть необходимо. Есть также причины, по которым может потребоваться прочитать данные из базы данных и поместить их в свою собственную карту - например, потому что вы затем передаете эту карту на другой уровень приложения, где уровень базы данных недоступен. В целом, ваш ответ, хотя и правильный по своему усмотрению, не отвечает на вопрос, который создает ОП. –

 Смежные вопросы

  • Нет связанных вопросов^_^