2016-09-14 2 views
2

Я новичок в Java и мой пример того, что я пытаюсь выполнить, это структура ColdFusion. Используя следующую структуру данных в качестве примера.Заполнение многомерных массивов Java

id  color 
50  blue 
60  red 
70  green 
80  yellow 

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

1 id 50 
    color blue 
2 id 60 
    color red 
3 id 70 
    color green 
4 id 80 
    color yellow 

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

private static String[][][] query(Connection connection) throws SQLException{ 

     Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 
     ResultSet resultSet = statement.executeQuery("SELECT colors.id,colors.color FROM colors"); 
     int size; 
     resultSet.last(); 
     size = resultSet.getRow(); 
     resultSet.beforeFirst(); 

     ResultSetMetaData rsltmetadata = resultSet.getMetaData(); 
     int colCount = rsltmetadata.getColumnCount(); 

     String[][][] rlstSetArray = new String[size][colCount][]; 

     int m = 0; 
     while(resultSet.next()) { 
      ++m; 
      for (int j=1; j <= colCount; j++){ 
       System.out.println(m); 
       System.out.println(rsltmetadata.getColumnName(j)); 
       System.out.println(resultSet.getString(rsltmetadata.getColumnName(j))); 

      } 
     } 
} 

Этот код выдает это.

1 
id 
50 
1 
color 
blue 
2 
id 
60 
2 
color 
red 

и т.д ...

На месте трех System.out.println линий испробованы следующие параметры и получить такое же сообщение от NetBeans 8.1. 'несовместимые типы: Строка не может быть преобразована в int'

rlstSetArray[m][rsltmetadata.getColumnName(j)] = resultSet.getString(rsltmetadata.getColumnName(j)); 

rlstSetArray[m][rsltmetadata.getColumnName(j)] = "'" + resultSet.getString(rsltmetadata.getColumnName(j)) + "'"; 

rlstSetArray[m]["'" + rsltmetadata.getColumnName(j) + "'"] = resultSet.getString(rsltmetadata.getColumnName(j)); 

Что вызывает это сообщение?

Позволяет ли я получать данные из массива в JSP, используя имена столбцов, которые находятся во втором измерении массива?

+0

(Edit) Ошибка в том, что вы используете массив как структуры. Массивы должны ссылаться на индекс * number *, т. Е. Как этот '[0] [1]' not '[0] [" columnName "]'. Кроме того, не забывайте, что java-массивы основаны на 0, а не на основе 1. (Обратите внимание, что не имеет никакого отношения к вашему вопросу, но не забудьте закрыть все утверждения, результаты, соединения и т. Д., Когда закончите, чтобы предотвратить утечку памяти). – Leigh

+0

Спасибо, что помогает мне вместе с другими комментариями. Когда у меня будет работа, я вернусь, чтобы проверить ответ, который работает для меня. – dutchlab

ответ

2

Как создать класс оболочки POJO для вашего результирующего набора вместо 3-мерного массива?

public class Color { 
    private Integer id; 
    private String name; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

Тогда метод запроса может быть упрощена:

private static List<Color> query(Connection connection) throws SQLException{ 
    List<Color> colors = new LinkedList(); 
    ... 
    while(resultSet.next()) { 
     Color color = new Color(); 
     color.setName(resultSet.getString(rsltmetadata.getColumnName("color")); 
     color.setId(resultSet.getString(rsltmetadata.getColumnName("id")); 
     colors.add(color); 
    } 
    return colors; 
} 
+0

Я использовал эту опцию, потому что, будучи новичком в Java, это имело для меня больше смысла. Спасибо Дэвиду. – dutchlab

2

Я не знаю, что я отвечаю на ваш вопрос, но я громко сказал: «Ой», когда я увидел тройной аспект:

private static String[][][] query(Connection connection) throws SQLException{ 

Рассматривали ли вы с помощью POJO для данных?

class ColorMap { 
    private final Integer id; 
    private final String color; 

    private static HashMap<String, Integer> nameMap = new HashMap<String, Integer>(); 

    public ColorMap(int theId, String theColor) { 
     id = theId; 
     color = theColor; 
     addColorToMap(); 
    } 

    private void addColorToMap() { 
     ColorMap.nameMap.put(this.color, this.id); 
    } 

    public static Integer getColorByName(String theName) { 
     return ColorMap.nameMap.get(theName); 
    } 
} 

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

+0

Ну, будучи новым для Java, я много не знаю. Я ищу способы решения задач, которые считаются лучшими методами, используя мои знания PHP и ColdFusion в качестве отправных точек. Спасибо за ваше предложение, и я буду смотреть дальше на то, как я буду использовать это. – dutchlab

+0

Если вы думаете об этом, это не так уж сильно отличается от того, что вы делали бы в CF. Многомерные массивы на самом деле не очень интуитивно понятны. Таким образом, вы обычно упаковываете данные в более интуитивный формат, например, CFC (или даже «структуру»). POJO использует ту же концепцию. – Leigh

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