java jsp jdbc pagination

java - ResultSet a la paginación



jsp jdbc (5)

¿Cómo convierto objeto ResultSet a una vista paginada en un JSP?

Por ejemplo, esta es mi consulta y conjunto de resultados:

pst = con.prepareStatement("select userName, job, place from contact"); rs = pst.executeQuery();


Aquí hay un par de cosas que puede hacer:

  • Marshall el resultado establecido en una lista de objetos / registros
  • Según el tamaño de página requerido, averigüe cuántas páginas tendrá en función del conjunto de resultados.
  • Compruebe el parámetro de solicitud para la página requerida y los desplazamientos 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 desplazamiento es 48.
  • Determine el número total de páginas según el recuento de los elementos.

  • Muestre sus artículos según el desplazamiento que haya determinado (solo se muestra desde el punto 48)

  • Genere su paginación con la cantidad de páginas según el número total de páginas que haya determinado.

=======

Ese es tu 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 el tamaño de página)
  • Formas elegantes de paginación
  • etc.

Busque el Patrón de lista de valores y aplíquelo. Esa suele ser la mejor manera de manejar este tipo de cosas.


Este ejemplo de Oracle es incorrecto.

Sí, en el exterior seleccionamos whe tienen buenos valores de ROWNUM, pero todavía es pseudocolumna por lo que no podemos usar BETWEEN en él. Necesitamos uno más select.

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 cadena sql sólida y clase Statement es SLOOOW. Oracle tiene que analizar su SQL cada vez que lo ejecute.

//Slooow example Satement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select * from my_table where id = 11");

Use PreparedStatement y los 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);


Puede usar displaytag para la paginación o el conjunto de resultados, pero descarga un archivo jar de displattag

primero creas un servlet StudentList.java

public class StudentList extends HttpServlet

{public void service (solicitud HttpServletRequest, respuesta HttpServletResponse) arroja ServletException, IOException {

ArrayList al=new ArrayList(); StudentDao stdo=new StudentDao(); // this is DAO Class (Data Acccess Object) try { al=stdo.getStudentList(); //getstudent list dao method } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } request.setAttribute("al",al); RequestDispatcher rd=request.getRequestDispatcher("StudentPaging.jsp"); rd.forward(request,response); }

}

// método dao

public ArrayList getStudentList() throws SQLException,Exception { ArrayList ai=new ArrayList(); Connection con=null; Statement st=null; ResultSet rs=null; Date dt=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy"); StudentInformation sdata=null; con=MyConnection.creatConnection(); if(con!=null) { st=con.createStatement(); String select="select * from STUDENT"; System.out.println(select); rs=st.executeQuery(select); if(rs!=null) { while(rs.next()) { sdata=new StudentInformation(); sdata.setSid(rs.getString("SID")); sdata.setFirstName(rs.getString("FIRSTNAME")); sdata.setMiddleName(rs.getString("MIDDLENAME")); sdata.setLastName(rs.getString("LASTNAME")); dt=rs.getDate("SDATE"); sdata.setDateofbirth(sdf.format(dt)); sdata.setGender(rs.getString("GENDER")); sdata.setAddress(rs.getString("ADDRESS")); sdata.setHigestQulification(rs.getString("HIQULIFICATION")); sdata.setLanguageKnow(rs.getString("LANGUAGE")); sdata.setHobby(rs.getString("HOBBY")); sdata.setTermCondition(rs.getString("TERMCON")); ai.add(sdata); } } } return ai; }


Para comenzar, debe agregar uno o dos parámetros de solicitud adicionales al JSP: firstrow y (opcionalmente) rowcount . El rowcount también se puede dejar y definir completamente en el lado del servidor.

Luego agregue un grupo de botones de búsqueda al JSP: el siguiente botón debe indicar al Servlet que incremente el valor de firstrow con el valor de rowcount . El botón anterior obviamente debería disminuir el valor de firstrow con el valor de rowcount . ¡No olvide manejar valores negativos y desbordamientos correctamente! Puedes hacerlo con la ayuda del SELECT count(id) .

Luego ejecute una consulta SQL específica para recuperar una 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 las cláusulas LIMIT y 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; }

En Oracle necesita 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<Contact> list(int firstrow, int rowcount) { String sql = String.format(SQL_SUBLIST, firstrow, firstrow + rowcount); // Implement JDBC. return contacts; }

En DB2, necesita 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<Contact> list(int firstrow, int rowcount) { String sql = String.format(SQL_SUBLIST, firstrow, firstrow + rowcount); // Implement JDBC. return contacts; }

No hago MSSQL, pero es sintácticamente similar a DB2. Ver también este tema .

Finalmente, solo presente la sublista en la página JSP de la forma habitual con JSTL c:forEach .

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

Tenga en cuenta que algunos pueden sugerir que necesita SELECT toda la tabla y guardar la List<Contact> en el alcance de la sesión y hacer uso de la List#subList() para paginar. Pero esto está lejos de ser eficiente con la memoria 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 el componente h:dataTable , puede encontrar útil este artículo . También contiene algunas matemáticas agnósticas útiles para el lenguaje para lograr que la paginación "similar a Google" funcione bien.