如何将具有未知列数的 ResultSet 映射到 List 并将其显示在 HTML 表中?

Posted

技术标签:

【中文标题】如何将具有未知列数的 ResultSet 映射到 List 并将其显示在 HTML 表中?【英文标题】:How to map a ResultSet with unknown amount of columns to a List and display it in a HTML table? 【发布时间】:2012-03-01 08:22:41 【问题描述】:

我使用 Netbeans、GlassFish 和 JavaDB 创建了一个数据库应用程序。现在我的控制器 Servlet 代码执行一些动态 SQL 查询并返回一个结果集(或者我可以改变 toString)。现在,如何以表格格式显示返回的结果集(我不知道结果集的结构)。有人可以帮我解决这个问题吗?

【问题讨论】:

你到底有什么问题?从结果集中获取行?生成 html 表格?向我们展示您拥有的代码并告诉我们您遇到的问题。 @JB Nizet,我有一个类似的代码 - createStatement();结果集 rs = st.executeQuery(sql 查询)。现在我被困在这里了。如何在 HTML 表格中显示此结果集。因为我对查询一无所知,所以我对结果集结构一无所知。 @BalusC,我看到了你的推荐页面。但是,要应用 product.setId(resultSet.getLong("id")) - 这我必须知道语句返回的列数和表。我不知道。 我发布了一个答案。注意,在 cmets 中回复其他人,请不要在@ 后面加空格。我没有看到你的评论回复。 【参考方案1】:

您可以使用Map<String, Object> 来表示一个“动态”行,即<c:forEach> 中的iterable。您可以使用ResultSetMetaData 收集有关column count 和column labels 等列的信息。

所以,这个映射应该这样做:

List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();

while (resultSet.next()) 
    Map<String, Object> columns = new LinkedHashMap<String, Object>();

    for (int i = 1; i <= columnCount; i++) 
        columns.put(metaData.getColumnLabel(i), resultSet.getObject(i));
    

    rows.add(columns);

在JSP中可以如下显示:

<table>
  <thead>
    <tr>
      <c:forEach items="$rows[0]" var="column">
        <td><c:out value="$column.key" /></td>
      </c:forEach>
    </tr>
  </thead>
  <tbody>
    <c:forEach items="$rows" var="columns">
      <tr>
        <c:forEach items="$columns" var="column">
          <td><c:out value="$column.value" /></td>
        </c:forEach>
      </tr>
    </c:forEach>
  </tbody>
</table>

【讨论】:

谢谢。但是,在 JSP 页面中我看不到结果集。我所做的如下:在我的 servlet 和 JSP 中的 request.setAttribute("als",rows),rows = session.getAttribute("als"); - 有什么遗漏吗? 只需使用$als。不要在 JSP 文件中编写 Java 代码。您的错误在于您尝试将其作为会话属性而不是请求属性来获取。继续阅读***.com/questions/3177733/… 和***.com/questions/3106452/… 抱歉,我添加了 Object rows = request.getAttribute("$als")。但是它显示未使用的行变量。问题依旧。 这是一个警告,而不是错误。您似乎根本没有在任何地方使用 scriptlet 变量。只需完全删除那些无意义的 scriptlet &lt;% ... %&gt; 行并使用 $als 而不是 $rows 就像在之前的评论中所说的 &lt;c:forEach items="$als"&gt; (请花一些时间阅读给定的链接作为在你将来犯更多不必要的错误之前)。【参考方案2】:

使用结果集元数据了解查询返回的列数、这些列的类型等。

参见the javadoc,其中也有示例。

【讨论】:

以上是关于如何将具有未知列数的 ResultSet 映射到 List 并将其显示在 HTML 表中?的主要内容,如果未能解决你的问题,请参考以下文章

解析具有未知列数的 Pandas 数据框以在 statsmodels.api 中使用

如何获取ResultSet的行数和列数

如何使用 vim 命令或 sed/awk 命令将具有不同列数的行分隔到另一个文件中? [关闭]

T-SQL 查询将数据插入到具有可变列数的表中

组合具有不同列数的 Spark 数据帧

构建具有不同列数的html表