Любой лучший подход, а не результат - PullRequest
0 голосов
/ 30 марта 2012

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

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. Допустим, еще один столбец добавляется в таблицу на более позднем этапе. Есть ли способ, которым мой код обрабатывает это новое дополнение, не внося изменений в код на тот момент времени

Ответы [ 4 ]

3 голосов
/ 30 марта 2012

Вы можете использовать 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 голосов
/ 30 марта 2012

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

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

result.getString("DETAILS_FILE");

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

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

0 голосов
/ 30 марта 2012

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

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

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

0 голосов
/ 30 марта 2012

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

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

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

results.getString("name");

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

...