结果集到分页
如何将结果集对象转换为 JSP 上的分页视图?
例如,这是我的查询和结果集:
pst = con.prepareStatement("select userName, job, place from contact");
rs = pst.executeQuery();
如何将结果集对象转换为 JSP 上的分页视图?
例如,这是我的查询和结果集:
pst = con.prepareStatement("select userName, job, place from contact");
rs = pst.executeQuery();
首先,您需要向 JSP 添加一个或两个额外的请求参数:和(可选)。也可以将其保留并完全在服务器端定义。firstrow
rowcount
rowcount
然后向 JSP 添加一堆分页按钮:下一个按钮应指示 将 的值递增为 。前面的按钮显然应该用 的值递减 。不要忘记正确处理负值和溢出!您可以借助.Servlet
firstrow
rowcount
firstrow
rowcount
SELECT count(id)
然后触发特定的 SQL 查询以检索结果的子列表。但是,确切的 SQL 语法取决于所使用的数据库。在MySQL和PostgreSQL中,使用和子句很容易:LIMIT
OFFSET
private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM"
+ " contact ORDER BY id LIMIT %d OFFSET %d";
public List<Contact> list(int firstrow, int rowcount) {
String sql = String.format(SQL_SUBLIST, firstrow, rowcount);
// Implement JDBC.
return contacts;
}
在 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;
}
在 DB2 中,您需要 OLAP 函数来实现此目的:row_number()
private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM"
+ " (SELECT row_number() OVER (ORDER BY id) AS row, id, username, job, place"
+ " FROM contact) AS temp WHERE row 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;
}
我不做MSSQL,但它在语法上与DB2相似。另请参阅此主题。
最后,只需使用 JSTL c:forEach
以通常的方式在 JSP 页面中呈现子列表即可。
<table>
<c:forEach items="${contacts}" var="contact">
<tr>
<td>${contact.username}</td>
<td>${contact.job}</td>
<td>${contact.place}</td>
</tr>
</c:forEach>
</table>
<form action="yourservlet" method="post">
<input type="hidden" name="firstrow" value="${firstrow}">
<input type="hidden" name="rowcount" value="${rowcount}">
<input type="submit" name="page" value="next">
<input type="submit" name="page" value="previous">
</form>
请注意,有些人可能会建议您需要将整个表保存在会话作用域中,并使用 List#subList()
进行分页。但是,对于数千行和多个并发用户,这远非内存效率高。SELECT
List<Contact>
对于那些对使用组件的JSF / MySQL上下文中的类似答案感兴趣的人,您可能会发现本文很有用。它还包含一些有用的与语言无关的数学,以使“类似Google”的分页很好地工作。h:dataTable
这个 Oracle 示例是错误的。
是的,在外部选择whe具有良好的ROWNUM值,但它仍然是伪列,因此我们不能在其上使用BROM。我们还需要一个选择。
正确的 sql 代码是:
SELECT c.*
FROM (SELECT c.*, ROWNUM as rnum
FROM (SELECT id, username, job, place FROM contact ORDER BY id) c) c
WHERE c.rnum BETWEEN 5 AND 10
同志们,使用实心sql字符串和语句类是SLOOOW。Oracle必须在每次执行SQL时解析它。
//Slooow example
Satement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from my_table where id = 11");
使用预准备语句和绑定参数。
//Faster example
PreparedStatement ps = conn.getPrepareStatement("select * from my_table where id = ?");
ps.setInt(1, 11);
最快的解决方案是将你的sql放在oracle存储过程中,并使用CallableStatement来调用它。
//Fastest example
CallableStatement cs = conn.prepareCall("{? = call my_plsql_function(?)}");
cs.setInt(1, 11);