Red de conocimiento informático - Conocimiento del nombre de dominio - ¿Cómo se consigue que un paginador sea tan eficaz?

¿Cómo se consigue que un paginador sea tan eficaz?

Título: Implementación de la tecnología de paginación JSP

Resumen: Uso de herramientas para implementar la paginación universal

Autor: Evan_zhao

Correo electrónico: evan_zhao@hotmail.com

El método de paginación más utilizado actualmente es la consulta de resultados. El método de paginación más utilizado es almacenar en caché los resultados de la consulta en HttpSession o beans con estado y luego mostrar una página de datos del caché al pasar la página. Este método tiene dos inconvenientes principales: en primer lugar, los usuarios pueden ver datos caducados; en segundo lugar, si la cantidad de datos es muy grande, llevará mucho tiempo recorrer el conjunto de resultados de la primera consulta y los datos almacenados en caché también ocuparán un tiempo. mucha memoria, lo cual es ineficiente.

Otros métodos comúnmente utilizados incluyen: consultar la base de datos una vez para cada página y extraer solo una página de datos del conjunto de resultados (usando rs.last(); rs.getRow() para obtener el número total de registros, y usando rs.absolute() localiza el registro inicial de esta página). Este método casi no necesita atravesar todos los registros en la implementación JDBC de algunas bases de datos (como Oracle. Los experimentos han demostrado que la velocidad es muy lenta cuando la cantidad de registros es muy grande).

En cuanto al método de almacenamiento en caché del ResultSet, es un método completamente incorrecto. Porque cuando se cierra la declaración o la conexión, el ResultSet también se cierra, y si desea que el ResultSet sea válido, bloqueará la conexión de la base de datos durante mucho tiempo.

Por lo tanto, un mejor enfoque para la paginación es recuperar solo fragmentos de datos del tamaño de una página de la base de datos en cada paso de página. De esta manera, aunque es necesario consultar la base de datos cada vez que se pasa la página, la cantidad de registros consultados es muy pequeña y la cantidad de datos transmitidos a través de la red no es grande. Además, si se utiliza un grupo de conexiones, la cantidad de datos transmitidos a través de la red no es grande. Se puede omitir el proceso más lento de establecer una conexión a la base de datos. En el lado de la base de datos, existe una variedad de técnicas de optimización sofisticadas que pueden mejorar la velocidad de las consultas y que son mucho más efectivas que el almacenamiento en caché a nivel del servidor de aplicaciones.

En la base de datos Oracle, el número de fila del resultado de la consulta está representado por la pseudocolumna ROWNUM (comenzando desde 1). Por ejemplo, seleccione * del empleado donde rownumlt;10 devuelve las primeras 10 filas. Sin embargo, dado que rownum se asigna después de la consulta y antes de ordenar, la consulta para las filas de empleados 100 a 120 ordenadas por cumpleaños debe escribirse así:

[pre] select * from (

seleccione my_table.*, rownum como my_rownum de (

seleccione nombre, cumpleaños del empleado ordenar por cumpleaños

) my_table donde rownum lt; my_rownumgt;=100

[ /pre]

MySQL puede usar la cláusula LIMIT:

seleccione nombre, fecha de nacimiento del empleado del pedido por cumpleaños LIMIT 99, 20

DB2 tiene la función número de fila() para obtener el número actual de filas. Descripción: Objeto utilizado para contener datos e información de paginación lt; brgt;

* La clase de página implementa el método básico para mostrar información de paginación, pero no especifica el tipo de datos contenidos.

* Puede implementar subclases según sea necesario para organizar los datos de una manera específica, lt; brgt;

RowSetPage encapsula datos en RowSet y ListPage encapsula datos en Listlt;

* Copyright: Copyright (c) 2002 lt; ; brgt;

* @version 1.0

*/

La página de clase pública implementa java.io.

Página final estática pública EMPTY_PAGE = nueva página();

public static final int DEFAULT_PAGE_SIZE = 20;

public static final int MAX_PAGE_SIZE = 9999

private int myPageSize = DEFAULT_PAGE_SIZE; /p>

inicio int privado;

avaCount privado, tamaño total;

datos del objeto privado

página actual privado; p> private int totalPageCount;

/**

* Constructor predeterminado, solo construye páginas vacías

*/

página protegida( ){

this.init(0, 0, 0, DEFAULT_PAGE_SIZE, nuevo objeto()

}

/* *

<); p> * Método inicial de paginación de datos, llamado por subclases

* @param start La posición inicial de esta página en la base de datos

* @param avaCount El número de elementos de datos contenidos en esta página

* @param avaCount El número de elementos de datos contenidos en esta página

* @param avaCount El número de elementos de datos contenidos en esta página

* @param avaCount El número de elementos de datos contenidos en esta página

// .append( " document.forms[0].submit(); \n")

// . append( " try{ \n")

// .}catch(e){\n")

.append( " alert('Método de consulta aún no definido: función ")

.append(queryJSFunctionName).append("()');\n")

.append( " document.all[\""). )

.append("\""].value = curPage;\n")

.append(" return false;\n")

// .append(" }\n")

.appe

nd(" }\n")

.append("}")

.append( "lt;/scriptgt; \n")

. append( "");

html.append( "lt; borde de la tabla=0 espacios de celdas=0 cellpadding=0 align=center width=80gt; \n")

.append( " lt; trgt; \n")

.append( " lt; td align=leftgt; lt; brgt; \n");

html.append( " ***" ) .append( getTotalPageCount() )..append( "Página")

.append( " [") .append(getStart()) .append("...") .append(getEnd( ))

.append("/") .append(this.getTotalSize()) .append("] \n")

.append( " lt;/tdgt; \n")

.td align=rightgt; \n");

if (hasPreviousPage()){

html.append( "[lt ;a href='javascript: ").append(gotoPage)

.append( "(lt;a href='javascript:")

.") .append(getCurrentPageNo ()-1)

.append( ")'gt; anteriorlt; /agt;]\n");

}

html.append( " No."))

.append( " lt;select name='")

.append(pageNoParamName).append("' onChange='javascript:")

p>

.append(gotoPage).append("(this.value)'gt;\n");

Cadena seleccionada = "seleccionada"

>

for( int i=1; ilt; = getTotalPageCount(); i ){

if( i == getCurrentPageNo() )

seleccionado = "seleccionado";

else selected = "";

html.append( " lt; valor de opción='").append(i).append("' ")

.append(seleccionado ).append("gt;").append(i).append("lt;/optiongt; \n");

}

if (getCurrentPageNo()gt; getTotalPageCount()){

html.append( " l

t.opción valor='").append(getCurrentPageNo())

.append("' selectedgt;").append(getCurrentPageNo())

.append("lt ;/optiongt; \n");

}

}

html.append( " lt;/selectgt; página\n");

}

p>

if (hasNextPage()){

html.append( " [lt;a href='javascript:").append (gotoPage)

.append( "()").append((getCurrentPageNo() 1))

.append( ")'gt;nextlt;/agt;]\n ");

}

html.append( " [lt; a href='javascript: ").\n"); p>

html.append( "lt;/ tdgt;lt;/trgt;lt;/tablegt; \n");

return html.toString(); > }

}

/////////////////////////////// /// ///

//

// RowSetPage.java

// Autor: evan_zhao@hotmail.com

//

//////// ////////////////////////////

paquete página;

importar javax.sql.RowSet

/**

* lt; Título: RowSetPagelt; p> * lt; pgt; Descripción: Un objeto de paginación que usa RowSet javalt;/pgt;

* lt;pgt;Copyright: Copyright (c) 2003lt;/pgt; @autor evan_zhao@hotmail.com

* @version 1.0

*/

clase pública RowSetPage extiende la página {

javax privado. sql.RowSet rs;

/**

* Página vacía

*/

RowSetPage final estática pública EMPTY_PAGE = new RowSetPage( );

/ **

* Constructor predeterminado, utilizado para crear páginas vacías

*/

public RowSetPage(){

this(null , 0, 0);

}

/**

*Construir un objeto de paginación

*@param crs contiene una página de datos OracleCac

hedRowSet

*@param start La posición inicial de la página en la base de datos

*@param totalSize El número total de registros contenidos en la base de datos

*/

public RowSetPage(RowSet crs, int start, int totalSize) {

this(crs, start, totalSize, Page.DEFAULT _PAGE_SIZE

}<); /p>

/**

*Construir objeto de paginación

*@param crs OracleCachedRowSet que contiene una página de datos

*@param start El inicio punto de esta página de datos en la base de datos Posición inicial

*@param totalSize El número total de registros contenidos en la base de datos

*@pageSize El número de registros que esta página puede acomodar

*/

public RowSetPage(RowSet crs, int start, int totalSize, int pageSize) {

try{

int avaCount =0;

if (crs! =null) {

crs.beforeFirst();

if (crs.next()) {

crs.last();

avaCount = crs.getRow();

}

if (crs!

crs.beforeFirst();

}

rs = crs;

super.init(inicio, avaCount, totalSize, pageSize. rs); p>

}catch(java.sql.SQLException sqle ){

throw new RuntimeException(sqle.toString());

}

paquete página

importar foo.DBUtil

importar java.math.BigDecimal

importar java.util.ResultSet

importar; java.sql.Statement;

importar java.sql.PreparedStatement;

importar java.sql.RowSet

/**

* lt; pgt; Título: Consulta de paginación lt; /pgt ;

* lt; pgt; Consulta la página de datos actual lt; >

* lt; pgt; Descripción: Consulta la página de datos actual según la declaración de consulta y el número de página Página de datos

No es posible utilizar la misma declaración de consulta para la página de datos actual. página.

p> * lt; pgt; Copyright: Copyright (c) 2002lt;

* @autor evan_zhao@hotmail.com

* @versión 1.0

*/

clase abstracta pública PagedStatement {

public final static int MAX_PAGE_SIZE = Page.MAX_PAGE_SIZE;

cadena protegida countSQL, querySQL

protected int pageNo, pageSize, startIndex, totalCount;

javax.sql protegido.

RowSet protegido

RowSetPage protegido

Lista privada de parámetros enlazados

/**

* Construir una declaración de página para consultar todos los datos

* @param sql query sql

*/

public PagedStatement(String sql){

this(sql, 1, MAX_PAGE_SIZE

}

/ **

* Construya un PageStatement para consultar todos los datos de la página actual

* @param sql query sql

* @param pageNo PageNo

*/**

public PagedStatement(String sql, int pageNo){

this(sql, pageNo, Page. TAMAÑO

}

/**

* Construya un PageStatement, consulte los datos en la página actual y especifique el número de registros que se mostrarán en cada página

* @ param sql query sql

* @param pageNo pageNo

* @param pageSize capacidad de cada página

*/

public PagedStatement ( String sql, int pageNo, int pageSize){

this.pageSize

this.startIndex = Page.getStartOfAnyPage(pageNo, pageSize

this); boundParams = Collections.synchronizedList(new java.util.LinkedList());

this.countSQL = "seleccione count(*) from ( " sql ") "; consultaSQL = intiQuerySQ

L(sql, this.startIndex, pageSize);

}

/**

* Generar declaración SQL para consultar una página de datos

*@param sql declaración de consulta original

*@startIndex posición inicial de grabación

*@size número de registros a obtener

*/p >

cadena abstracta protegida intiQuerySQL(String sql, int startIndex, int size

/**

*Utilice el objeto proporcionado para establecer el valor de parámetro especificado

*@param index El primer parámetro es 1, el segundo parámetro es 2