使用 JdbcTemplate 和 Oracle 11g / H2 的 Web 分页,没有可滚动的结果集

Web pagination with JdbcTemplate and Oracle 11g / H2 without scrollable resultset

这一定已经做了一千次了,但我在网上找不到 Java 代码。

我正在编写一个显示 Oracle 11g 列表的网页,该列表由 Dao 使用 JdbcTemplate 检索。

它本质上是一个审计日志,带有日期搜索字段以显示该日期和之前的日志条目。

我的审计日志服务class 将调用 Dao 并将返回的行数限制为 100,并且必须计算出要在查询中指定的最新日期。然后它会将审计日志 javabean 列表传回 MVC 层。

这是我为 SQL 所做的最大努力,出于测试目的,它还必须与 H2(Oracle 模式)兼容。 (这排除了 row_number() 函数)。 latestDate 和 maxRows 是参数。

    SELECT * FROM (
                SELECT * FROM T_ETL_AUDIT_LOG 
                WHERE LOG_TIMESTAMP  < ?latestDate 
            ) WHERE rownum < ?maxRows;

所以我需要弄清楚网页上的参数是什么(例如 lastDate、previous、next),并且审计日志服务算法必须处理第一次调用(date=Now),和上一页,下一页而不会混淆。

我还没有搜索 JSP 的分页标签,所以任何建议都很好,但这只是锦上添花。

注意我没有使用 Oracle 12,所以我无法使用新的 Oracle 分页功能

2015-01-20 - 刚刚更改了标题以排除可滚动结果集解决方案。

JDBCTemplate 不直接帮助分页。您必须进行查询以处理页码和页面大小。还应该查询计数。

这是一个分页组件已经一个一个创建的解决方案:http://javablackboard.blogspot.ro/2013/05/jsp_7.html

这里自定义的jsp标签用于分页:http://www.javaworld.com/article/2072877/swing-gui-programming/paging-long-lists.html

我在客户端使用页码,所以 'next' 和 'previous' 按钮传输下一个或上一个页码。我的服务将页码转换为 DAO 的 previousLastRow 和 lastRow 参数。原始搜索日期在每个页面上保持不变,直到用户更改它。

这是 Oracle 的 SQL,第 2 页(即第 101 到 200 行)的参数被替换为:

select * from (
    select ROWNUM as row_num, b.* from (
        select ROWNUM, MY_TIMESTAMP 
        from T_MY_TABLE 
        where MY_TIMESTAMP < TIMESTAMP'2015-01-20 12:12:34'
        and ROWNUM <= 200
        order by MY_TIMESTAMP desc
    ) b 
) where row_num > 100;