2016-09-14 105 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))); 

      } 
     } 
} 

这段代码产生了这个输出。

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

(编辑)的错误是因为使用的是如下的结构阵列。数组必须通过索引*号*来引用,即像这样的[[0] [1]'而不是'[0] [“columnName”]''。另外,不要忘记,java数组是基于0的,而不是基于1的。 (注意,与你的问题无关,但在完成时不要忘记关闭所有语句,结果集,连接等等以防止内存泄漏)。 – 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