【问题标题】:Iterate and display values from a ResultSet with thymeleaf使用 thymeleaf 迭代并显示 ResultSet 中的值
【发布时间】:2018-08-14 01:02:48
【问题描述】:

我正在构建一个 Spring Boot thymeleaf Web 应用程序。该应用程序旨在为我们的用户提供一种查看和维护我们数据库中的参考表的方法。这些参考表存储在它们自己的“参考”数据库中。这些表用于查找、保存作为主数据库计算输入的值等。

由于有数百个参考表,我选择不将它们映射到类,而是从参考数据库中获取 ResultSet 元数据,使用它来生成表列表并使用 thymeleaf 将其显示给用户。

我是 Spring Boot 和 thymeleaf 的新手,但似乎无法找到一种方法来遍历 ResultSet 以显示元数据的内容。有没有办法做到这一点?似乎 ResultSet 通常使用 while 循环进行迭代,每个循环都会移动光标,但 thymeleaf 似乎使用 for 循环?

一种解决方案是以通常的方式迭代 ResultSet 并将每一行添加到对象列表的列表中,这可能类似于 db 表,例如List<List<Object>>,但我不想仅仅为了使用百里香而这样做。另外,ResultSet 有一堆有用的信息,关于每个表列的预期数据类型和属性,我以后可以使用这些信息来验证用户可能通过应用程序添加/修改的任何新记录。还是有更好的方法来表示数据库表及其相关属性?

【问题讨论】:

  • 您提到您可以选择不将它们映射到类,因为有数百个或参考表。您是否打算一次向用户显示所有这些?表示数据库表的常用方法是将列映射到对象字段并将它们添加到由 thymeleaf 模板选取的模型中。 Thymeleaf 然后可以通过类中的 getter 和 setter 引用这些字段。
  • 将 ResultSet 传递给 View 不是一个好主意。相反,您应该尝试将结果放入通用 List 并将列表发送到 View
  • 你的元数据结构不能映射到一个类(然后使用类映射)吗? “数百个参考表”,您指的是元数据数据库吗?
  • @Sam - 因为我们有数百个这样的表,所以我想生成一个包含表列表的页面,然后为每个 db 表动态生成一个页面,该页面将动态显示列和记录,然后最终用户可以根据需要添加或修改记录。我们的想法是,我们不会通过将每个表映射到一个类来与每个单独的 db 表的设计相关联,而是我们使用 db 元数据来动态地构造每个表的表示。
  • 我明白了。阿米特点可能会奏效。您可以使用 List> 创建一个可重用的 Table 类 - Map 键是列名,值是列值。然后列表将保存表中的每一行。然后,您可以将列表传递给百里香叶并渲染它。不过,将更改映射回数据库会非常复杂。我会四处寻找更好的解决方案。

标签: java spring-boot jdbc thymeleaf


【解决方案1】:

显示结果的最佳方式是使用List<String> 表示表头,List<List<String>> 表示表行。您提到您不想这样做只是为了使用 Thymeleaf,但我不确定在用户想要修改表格内容时保留表格属性以供使用的方法。

可以使用元数据生成表列的List<String>。代码可能看起来像这样:

final Statement statement = connection.createStatement();
final boolean hasResultSet = statement.execute(query);
final ResultSet resultSet = statement.getResultSet();
final ResultSetMetaData metaData = resultSet.getMetaData();
final int count = metaData.getColumnCount();

final List<String> header = new ArrayList<>(count);
for (int i = 1; i <= count; i++) {
    header.add(metaData.getColumnName(i));
}
model.addAttribute("tableHeader", header);

List&lt;List&lt;String&gt;&gt; 可以在请求时间创建,也可以在模板渲染期间进行迭代。为了实现延迟加载,我建议这样:

final Statement statement = connection.createStatement();
final boolean hasResultSet = statement.execute(query);
final ResultSet resultSet = statement.getResultSet();
final ResultSetMetaData metaData = resultSet.getMetaData();
final int count = metaData.getColumnCount();

model.addAttribute("tableContent", new LazyContextVariable<Iterable<List<String>>>() {
    @Override
    protected Iterable<List<String>> loadValue() {
        return () -> new Iterator<>() {
            private boolean loadedRow;

            {
                try {
                    loadedRow = resultSet.next();
                } catch (SQLException exception) {
                    loadedRow = false;
                    exception.printStackTrace();
                }
            }

            @Override
            public boolean hasNext() {
                return loadedRow;
            }

            @Override
            public List<String> next() {
                if (!loadedRow) {
                    return new ArrayList<>(count);
                }
                try {
                    final List<String> list = new ArrayList<>(count);
                    for (int i = 1; i <= count; i++) {
                        list.add(resultSet.getString(i));
                    }
                    loadedRow = resultSet.next();
                    return list;
                } catch (SQLException e) {
                    e.printStackTrace();
                    return new ArrayList<>();
                }
            }
        };
    }
});

Thymlead 模板可能如下所示:

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head></head>
<body>
<div id="queryResult">
    <table>
        <thead>
        <tr>
            <th th:each="header : ${tableHeader}">
                <th:block th:text="${header}"/>
            </th>
        </tr>
        </thead>
        <tbody>
        <tr th:each="row : ${tableContent}">
            <td th:each="item : ${row}">
                <th:block th:text="${item}"/>
            </td>
        </tr>
        </tbody>
    </table>
</div>
</body>
</html>

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 2014-01-23
    • 1970-01-01
    • 2017-09-26
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多