El paso a paso o código que verás en este post es la solución más eficiente y efectiva que hallamos a esta duda o problema.
Solución:
Para comenzar, debe agregar uno o dos parámetros de solicitud adicionales al JSP: firstrow
y (opcionalmente) rowcount
. los rowcount
también se puede omitir y definir completamente en el lado del servidor.
Luego agregue un montón de botones de paginación al JSP: el próximo El botón debe instruir al Servlet
para incrementar el valor de firstrow
con el valor de rowcount
. los anterior botón obviamente debería disminuir el valor de firstrow
con el valor de rowcount
. ¡No olvide manejar correctamente los valores negativos y los desbordamientos! Puedes hacerlo con la ayuda de SELECT count(id)
.
A continuación, inicie una consulta SQL específica para recuperar un sublista de los resultados Sin embargo, la sintaxis SQL exacta depende de la base de datos utilizada. En MySQL y PostgreSQL es fácil con LIMIT
y OFFSET
cláusulas:
private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM"
+ " contact ORDER BY id LIMIT %d OFFSET %d";
public List list(int firstrow, int rowcount)
String sql = String.format(SQL_SUBLIST, firstrow, rowcount);
// Implement JDBC.
return contacts;
En Oracle necesitas una subconsulta con rownum
cláusula que debería verse así:
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 list(int firstrow, int rowcount)
String sql = String.format(SQL_SUBLIST, firstrow, firstrow + rowcount);
// Implement JDBC.
return contacts;
En DB2 necesitas la función OLAP row_number()
para esto:
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 list(int firstrow, int rowcount)
String sql = String.format(SQL_SUBLIST, firstrow, firstrow + rowcount);
// Implement JDBC.
return contacts;
No uso MSSQL, pero es sintácticamente similar a DB2. También vea este tema.
Finalmente, solo presente la sublista en la página JSP de la manera habitual con JSTL c:forEach
.
$contact.username
$contact.job
$contact.place
Tenga en cuenta que algunos mayo sugerir que usted necesita para SELECT
toda la tabla y guardar el List
en el ámbito de la sesión y hacer uso de List#subList()
para paginar. Pero esto es lejos de memoria eficiente con miles de filas y múltiples usuarios simultáneos.
Para aquellos que estén interesados en una respuesta similar en el contexto JSF/MySQL usando h:dataTable
componente, puede que este artículo le resulte útil. También contiene algunas matemáticas útiles independientes del idioma para que la paginación “similar a Google” funcione bien.
Este ejemplo de Oracle está mal.
Sí, en la selección externa tiene buenos valores de ROWNUM, pero sigue siendo una pseudocolumna, por lo que no podemos usar BETWEEN en ella. Necesitamos una selección más.
El código sql correcto es:
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
Camaradas, usando solid sql string y la clase de Declaración es LENTA. Oracle tiene que analizar su SQL cada vez que lo ejecuta.
//Slooow example
Satement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from my_table where id = 11");
Use PreparedStatement y parámetros de enlace.
//Faster example
PreparedStatement ps = conn.getPrepareStatement("select * from my_table where id = ?");
ps.setInt(1, 11);
Y la solución más rápida es poner su sql en el procedimiento almacenado de Oracle y usar CallableStatement para llamarlo.
//Fastest example
CallableStatement cs = conn.prepareCall("? = call my_plsql_function(?)");
cs.setInt(1, 11);
Aquí hay un par de cosas que puedes hacer:
- Marshall el conjunto de resultados a alguna lista de objetos/registros
- Según el tamaño de página requerido, calcule cuántas páginas tendrá según el conjunto de resultados.
- Verifique el parámetro de solicitud para la página requerida y las compensaciones según la cantidad de elementos que se mostrarán en la página. Entonces, si está en la página 4 con 12 para mostrar, su compensación es 48.
-
Determine el número total de páginas en función del recuento de elementos.
-
Muestre sus artículos en función de la compensación que haya determinado (solo visualice a partir del artículo 48)
- Genera tu paginación con la cantidad de páginas en base al número total de páginas que determinaste.
=======
Ese es su enfoque básico. Puedes modificar esto con:
- Determinar una forma de limitar la consulta a la página (pero esto no lo ayudará a determinar los tamaños de página)
- Formas elegantes de paginación
- etc..