2016-09-14 2 views
2

저는 Java에 익숙하지 않습니다. 달성하려고 시도한 예제는 ColdFusion 구조입니다. 다음 데이터 구조를 예제로 사용합니다.Java 다차원 배열 채우기

id  color 
50  blue 
60  red 
70  green 
80  yellow 

다음과 같은 쿼리 결과 세트에서 Java 다차원 배열을 생성하려고합니다.

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))); 

      } 
     } 
} 

이 코드는이 출력을 생성합니다. 세에서 System.out.println 라인 대신에

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

등 ...

에는 다음과 같은 옵션을 시도하고 넷빈즈 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

(편집) 오류입니다. 배열은 index * number *에 의해 참조되어야합니다. 즉,이 [[0] [1]'not [0] [ "columnName"]'처럼. 또한 자바 배열은 1 기반이 아니라 0 기반임을 잊지 마십시오. (사이드 노트, 아무 것도하지 말고 메모리 누수를 막기 위해 모든 문장, 결과 집합, 연결 등을 닫는 것을 잊지 마라.) – Leigh

+0

감사합니다. 다른 의견과 함께 저에게 도움이됩니다. 일단 그것이 작동하면 나에게 맞는 대답을 확인하기 위해 다시 올 것이다. – dutchlab

답변

2

3 차원 배열 대신 결과 집합에 POJO 래퍼 클래스를 작성하는 것은 어떻습니까?

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