使用百日咳

时间:2018-03-06 08:26:15

标签: java spring-boot jdbc thymeleaf

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

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

我是Spring boot和thymeleaf的新手,但似乎找不到迭代ResultSet来显示元数据内容的方法。有没有办法做到这一点?似乎ResultSet通常用while循环遍历,每次循环移动光标,但是thymeleaf似乎用于循环?

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

1 个答案:

答案 0 :(得分:0)

显示结果的最佳方式是对表头使用 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<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();

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

Thymelead 模板可能如下所示:

<!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>