JDBC 分页

2022-09-01 02:31:52

我想使用JDBC实现分页。我想知道的实际问题是“我如何分别从数据库中获取第1页和第2页的前50条记录,然后是后50条记录”

我的查询是 [数据表包含 20,000 行]Select * from data

对于第1页,我得到50条记录,对于第2页,我想得到接下来的50条记录。如何在 JDBC 中有效地实现它?

我已经搜索并发现这是跳过第一页记录的方法,但是在大型结果集上需要一些时间,我不想承受这段时间。另外,我不想在查询中使用和+,因为这些在查询中使用不好,我不知道为什么,我仍然不想在查询中使用它。rs.absolute(row)rownumlimitoffset

任何人都可以帮助我如何限制分页,或者JDBC有什么办法给我们吗?ResultSet


答案 1

没有有效的方法可以通过简单地使用JDBC来做到这一点。您必须将限制设置为 n 行,并从第 i 项子句直接开始到 SQL,这样它才是有效的。根据数据库的不同,这实际上可能很容易(参见MySQL的LIMIT -关键字),在其他数据库(如Oracle)上,它可能有点棘手(涉及子查询和使用rownum伪列)。

请参阅此 JDBC 分页教程:http://java.avdiel.com/Tutorials/JDBCPaging.html


答案 2

查询实际需要在当前页面上显示的数据。不要将整个数据集拖到Java的内存中,然后在那里过滤它。这只会使事情变得不必要地变慢。

如果您实际上很难正确实现此内容和/或弄清楚特定数据库的SQL查询,那么请在此处查看我的答案

更新:由于您使用的是Oracle,因此以下是上述答案中Oracle目标的摘录:

在 Oracle 中,您需要一个带有子句的子查询,其外观应如下所示:rownum

private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM"
    + " (SELECT id, username, job, place FROM contact ORDER BY id)"
    + " WHERE ROWNUM BETWEEN %d AND %d";

public List<Contact> list(int firstrow, int rowcount) {
    String sql = String.format(SQL_SUBLIST, firstrow, firstrow + rowcount);

    // Implement JDBC.
    return contacts;
}