在JSP中使用JAVA将SQL数据追加到数据表中 - java

在所有条件过滤和求和查询执行之后,我的SQL Server中具有以下结果集。

在JSP中使用JAVA将SQL数据追加到数据表中 - java

我希望在我的页面中显示为此类(请参阅下面的屏幕截图)。

在JSP中使用JAVA将SQL数据追加到数据表中 - java

我尝试了下面的JAVA代码,这些代码给了我附加到数据表中的结果。

<%
ArrayList<String[]> rows = sqlq.querySQL();
String rowsetdate = new String();
String rowres1 = new String();
    for(String[] rowset : rows) { 
      rowsetdate = rowset[0];
      rowres1 = rowres1 + rowset[1]+ ",";
        for(String rowres2 : rowset) {
        rowres1 = rowres1 + rowres2 + ",";
         }
      rowres1 = rowres1.substring(0, rowres1.length()-1);
      rowres1 = rowres1 + "|";
     }
rowres1 = rowres1.substring(0, rowres1.length()-1);
%>

<tr>
<td><%if (rowres1  == null) out.print(""); else out.print(rowres1);%></td>
</tr>

sqlq.querySQL()用于将我的SQL查询发送到JDBC,以便我将查询发送到我的数据库。

下面的照片是代码执行后在我的数据表中附加的数据,左侧是日期,右侧是数据。

在JSP中使用JAVA将SQL数据追加到数据表中 - java

我尝试了一些不同的代码,

<%
ArrayList<String[]> rows = sqlq.querySQL();
 for(String[] rowset : rows) {
<tr>
<td><%if (rowset[0]  == null) out.print(""); else out.print(rowset[0]);%></td>
<td><%if (rowset[1]  == null) out.print(""); else out.print(rowset[1]);%></td>
</tr>
}
%>

它也没有达到我的预期结果,它返回的数据就像我在SSMS中看到的一样(请查看下面的屏幕截图)

在JSP中使用JAVA将SQL数据追加到数据表中 - java

我做错了什么,应该如何做才能达到预期的效果? (下面的截图)

在JSP中使用JAVA将SQL数据追加到数据表中 - java

感谢大家的帮助。

参考方案

您可以使用键为date且其值再次为Map的Map。内部地图使用trans作为键,使用sumtot作为值。

    Map<String, Map<String, String>> mapByDate = new HashMap<>();
    TreeSet<String> allTrans = new TreeSet<>();

    for (String[] row : rows) {
      Map<String, String> mapByDateAndTrans = mapByDate.get(row[0]);
      if (mapByDateAndTrans == null) {
        mapByDateAndTrans = new HashMap<>();
      }
      mapByDateAndTrans.put(row[1], row[2]);
      mapByDate.put(row[0], mapByDateAndTrans);
      allTrans.add(row[1]);
    }

这是一个示例代码,可以打印数据:

    System.out.println("Date/Trans: " + allTrans);
    for (Map.Entry<String, Map<String, String>> mapByDateEntry : mapByDate.entrySet()) {
      System.out.print(mapByDateEntry.getKey() + ": ");
      Map<String, String> mapByTrans = mapByDateEntry.getValue();
      for (String trans : allTrans) {
        String sumtot = mapByTrans.get(trans);
        if (sumtot != null) {
          System.out.print("[ " + sumtot + " ]");
        } else {
          System.out.print("[   ]");
        }
      }
      System.out.println();
    }

输出:

Date/Trans: [11200, 11201, 11202]
2019-07-02: [ 136 ][ 18 ][ 14 ]
2019-07-03: [ 164 ][ 10 ][ 8 ]

或者我们可以生成一个HTML表内容:

    StringBuilder tableBuilder = new StringBuilder("<table border = 1>");
    // table header
    tableBuilder.append("<tr>");
    tableBuilder.append("<th>date/trans</th>");
    for (String trans : allTrans) {
      tableBuilder.append("<th>").append(trans).append("</th>");
    }
    tableBuilder.append("</tr>");

    // table rows
    for (Map.Entry<String, Map<String, String>> mapByDateEntry : mapByDate.entrySet()) {
      tableBuilder.append("<tr>");
      tableBuilder.append("<td>").append(mapByDateEntry.getKey()).append("</td>");
      Map<String, String> mapByTrans = mapByDateEntry.getValue();
      for (String trans : allTrans) {
        String sumtot = mapByTrans.get(trans);
        if (sumtot != null) {
          tableBuilder.append("<td>").append(sumtot).append("</td>");
        } else {
          tableBuilder.append("<td></td>");
        }
      }
      tableBuilder.append("<tr>");
    }
    tableBuilder.append("</table>");

    System.out.println(tableBuilder.toString());

输出:

<table border = 1><tr><th>date/trans</th><th>11200</th><th>11201</th><th>11202</th></tr><tr><td>2019-07-02</td><td>136</td><td>18</td><td>14</td><tr><tr><td>2019-07-03</td><td>164</td><td>10</td><td>8</td><tr></table>

如果我们将生成的输出另存为HTML文件,则可能是您想要的结果(以下屏幕截图)。您还可以更改要在JSP中使用的代码:

在JSP中使用JAVA将SQL数据追加到数据表中 - java

要通过键的自然顺序获得有序的Map,可以使用TreeMap。因此,要按日期打印数据,我们可以构造一个包含mapByDate数据的新TreeMap:

    TreeMap<String, Map<String, String>> sortedMapByDate = new TreeMap<>(mapByDate);
    // table rows
    for (Map.Entry<String, Map<String, String>> mapByDateEntry : sortedMapByDate.entrySet()) {
      tableBuilder.append("<tr>");
      tableBuilder.append("<td>").append(mapByDateEntry.getKey()).append("</td>");
      Map<String, String> mapByTrans = mapByDateEntry.getValue();
      for (String trans : allTrans) {
        String sumtot = mapByTrans.get(trans);
        if (sumtot != null) {
          tableBuilder.append("<td>").append(sumtot).append("</td>");
        } else {
          tableBuilder.append("<td></td>");
        }
      }
      tableBuilder.append("<tr>");
    }

无法从ArrayList <String>转换为List <Comparable> - java

当我写下面的代码时,编译器说 无法从ArrayList<String>转换为List<Comparable>private List<Comparable> get(){ return new ArrayList<String>(); } 但是当我用通配符编写返回类型时,代码会编译。private List&l…

SOAPFaultException部署在Tomcat上时,但在GlassFish中工作正常 - java

朋友们,我一直在尝试很多,阅读了很多论坛,但无法理解为什么出现此问题。我使用契约优先方法创建了一个Jax-WS WebService。创建WSDL和XSD,然后使用wsimport工具生成其余工件,为SEI提供实现。将WebService应用程序部署到Eclipse Helios中的GlassFish(Glassfish适配器和Eclipse中安装的插件)。…

页面加载而不是提交时发生struts验证 - java

请原谅我;我对Struts有点陌生。我遇到一个问题,即页面加载而不是我实际提交表单时发生了验证。我整天都在论坛上搜寻和搜寻,没有任何运气。我显然做错了一些事情,应该很容易确定,但是我还没有发现问题所在。这是我的struts.xml的片段:<action name="*Test" method="{1}" clas…

DataSourceTransactionManager和JndiObjectFactoryBean和JdbcTemplate的用途是什么? - java

以下的用途是什么:org.springframework.jdbc.core.JdbcTemplate org.springframework.jdbc.datasource.DataSourceTransactionManager org.springframework.jndi.JndiObjectFactoryBean <tx:annotatio…

合并List <T>和List <Optional <T >> - java

鉴于: List<Integer> integers = new ArrayList<>(Arrays.asList( 10, 12 )); List<Optional<Integer>> optionalIntegers = Arrays.asList( Optional.of(5), Optional.em…