Prefacio
Cuando las tablas están involucradas en el desarrollo web, como DataTable, surgirá la necesidad de paginación. Por lo general, dividimos los métodos de paginación en dos tipos: paginación frontal y paginación de back-end.
Paginación frontal
Todos los registros (AJAX) en la tabla de datos se solicitan a la vez, y luego se almacenan en caché en la parte delantera y calculó el recuento y la lógica de paginación. En general, los componentes front-end (como DataTable) proporcionarán acciones de paginación.
Las características son: simples, muy adecuadas para plataformas web a pequeña escala; Los problemas de rendimiento surgirán cuando la cantidad de datos sea grande, y el tiempo para la consulta y la transmisión de la red será largo.
Paginación de backend
Especifique el número de página (Pageno) y el tamaño de cada página (PageSize) en la solicitud AJAX. El backend consulta los datos de la página y los devuelve, y el frontend solo es responsable de la representación.
Las características son: más complejas; El cuello de botella de rendimiento está en el rendimiento de la consulta de MySQL, que por supuesto puede optimizarse y resolver. En términos generales, el desarrollo web utiliza este método.
Estamos hablando de paginación de backend.
Soporte de MySQL para la paginación
En pocas palabras, MySQL admite paginación a través de la cláusula de límite. Consulte el ejemplo a continuación.
El uso de la palabra clave de límite es
Límite [compensación,] filas
El desplazamiento es el desplazamiento relativo a la primera fila (la primera fila es 0), y las filas son el número de filas.
# Cada página tiene 10 registros, tome la primera página y devuelva los primeros 10 registros seleccione * del límite de tabla 0,10;# Cada página tiene 10 registros, tome la segunda página y devuelva el 11º registro, al vigésimo registro, seleccione * del límite de tabla 10,10;
Lo que quiero mencionar aquí es que MySQL maneja la paginación:
Limite 1000,10: filtre 1010 piezas de datos, luego deseche las primeras 1000 piezas y mantenga 10 piezas. Cuando el desplazamiento es grande, el rendimiento disminuirá.
Límite 100000,10 - filtrará 10W+10 piezas de datos y luego descartará las primeras 10W piezas. Si encuentra problemas de rendimiento en la paginación, puede ajustarlos de acuerdo con esta idea.
MyBatis Paging Plugin PageHelper
Al usar el desarrollo de Java Spring, MyBatis es una herramienta poderosa para las operaciones de la base de datos. Sin embargo, al tratar con la paginación, MyBatis no tiene ningún método especial. En general, debe escribir la cláusula de límite para implementarla, lo cual es relativamente costoso. Afortunadamente, hay un complemento PageHelper.
1. Dependencia de POM
No mencionaré la configuración de MyBatis. Las dependencias de PageHelper son las siguientes. Si necesita una nueva versión, puede elegir en Maven
<Spendency> <ProupId> com.github.pagehelper </proupid> <artifactid> pageHelper </arfactid> <versever> 4.1.4 </versever> </dependence>
2. Configuración mybatis de PageHelper
Abra el archivo de configuración de MyBatis, generalmente en la ruta de recursos. Mi nombre es mybatis-config.xml.
<? xml versión = "1.0" encoding = "utf-8"?> < Mapper habilita o deshabilita la memoria caché. -> <setting name = "cacheenabled" value = "true"/> <!-Enable o deshabilite la carga perezosa a nivel mundial. Cuando se deshabilitan, todos los objetos asociados se cargan instantáneamente. -> <setting name = "LazyLoadingEnabled" value = "true"/> <!-Cuando está habilitado, un objeto con una propiedad de carga perezosa cargará completamente cualquier propiedad cuando se llame. De lo contrario, cada propiedad se cargará según sea necesario. -> <setting name = "agressiveLaLyLoading" value = "true"/> <!-si a permitir que un solo sql devuelva múltiples conjuntos de datos (dependiendo de la compatibilidad del controlador) predeterminado: true-> <setting name = "multipleReSultSetSenabled" valor = "verdadero"/> <!-alias para columnas para columnas se puede utilizar (dependiendo de la compatibilidad del controlador) predeterminado: verdadero-n. valor = "true"/> <!- Permitir JDBC para generar claves primarias. Se requiere soporte de manejo. Si se establece en verdadero, esta configuración forzará la clave primaria generada, algunas unidades son incompatibles pero aún se pueden ejecutar. predeterminado: falso-> <setting name = "useGeneratedKeys" value = "true"/> <!-Especifique cómo myBatis asigna automáticamente columnas de la tabla base de datos Ninguna: no obscena parcial: parte completa: all-> <setting name = "automapningbehavior" value = "parcial"/> <!-Este es el tipo de ejecución predeterminado (simple: simple: reutilizar: el ejecutor puede reutilizar estatementos preparados "value". declaraciones y actualizaciones de lotes)-> <setting name = "DefaultExeCutortype" value = "simple"/> <!-Convertir campos usando Camel Nomenclature. -> <setting name = "mapunderscoretocamelcase" value = "true"/> <!-configuración de la sesión del rango de caché local: habrá una declaración de intercambio de datos: el alcance de la declaración (esto no será compartir datos) Defalut: sesión-> <setting name = "localCacheCope" value = "session"/> <!-configuración pero el tipo JDBC está vacío, algunos discursos necesitan especificar el valor, value predeterminado, y no especificar el tipo, y no especificar el tipo de especificación, y no es el tipo de especificación, y no es el tipo, y no es el tipo, y no es el tipo de especificación, y no es el tipo de especificación, y no es el tipo de especificación de valor predeterminado, y existe el otro, y existe el otro, y existe el tipo, y no se especifica el valor predeterminado, y no es el tipo de especificación. inserting a null value --> <setting name="jdbcTypeForNull" value="NULL"/></settings><plugins> <plugin interceptor="com.github.pagehelper.PageHelper"> <property name="dialect" value="mysql"/> <property name="offsetAsPageNum" value="false"/> <property name="rowBoundsWithCount" valor = "falso"/> <propiedad name = "pageSizebero" value = "true"/> <propiedad name = "razonable" value = "false"/> <propiedad name = "supportMethodSarGuments" value = "false"/> <propiedad name = "returnPageInfo" value = "none"/> </tugin> </glugins> </formugar>
A lo que debe prestar atención aquí es la configuración relacionada con PageHelper.
Si no carga el archivo de configuración de MyBatis, entonces está utilizando la configuración predeterminada de MyBatis. ¿Cómo cargar el archivo de configuración de mybatis?
Vaya a su configuración de datos de datos.
Al configurar SQLSessionFactory, especifique el archivo de configuración del núcleo de MyBatis y la ruta mapper, el código es el siguiente
@Bean (name = "MoonlightSqlSessionFactory") @Primary Public SQLSessionFactory MoonlightSqlSessionFactory (@Qualifier ("MoonlightData") DataSource DataSource) lanza una excepción {sqlSessionFactoryBean Bean = Nueva sqlSessionFactoryBean (); Bean.SetDataSource (DataSource); Bean.SetMapperLocations (New PathMatchingResourcePternResolver (). GetResources ("ClassPath: MyBatis-Mapper/*. Xml")); bean.setConfigLocation (nuevo classpathResource ("mybatis-config.xml")); return bean.getObject (); }ilustrar:
La ruta de almacenamiento mapper.xml configurada aquí está en la carpeta de recursos/mybatis-mapper
El archivo mybatis-config.xml configurado aquí está en recursos/
3. Paginación
Prepare un mapper.xml, simplemente escriba uno para la prueba, solo use uno del proyecto.
Esta consulta aquí es una consulta típica de múltiples condiciones. Lo que debemos hacer es paginar los registros coincidentes por múltiples condiciones.
<? xml versión = "1.0" encoding = "utf-8"?> <! Doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper Namespace = "com.kangaroo.studio.moonlight.dao.mapper.moonlightmapper"> <resultmap id = "geofenceList" type = "com.kangaroo.studio.moonlight.dao.model.geofence"> <constructor> <darg column = "id" javatype = "java.lang.lang.lang.lang.langerer" jdbctype = "Integer" /> <arg columna = "name" javatype = "java.lang.string" jdbctype = "varchar" /> <arg column = "type" javatype = "java.lang.integer" jdbctype = "integer" /> <<rum = "group" javatype = "java.lang". jdbctype = "varchar" /> <arg columna = "geo" javatype = "java.lang.string" jdbctype = "varchar" /> <arg columna = "createTime" javatype = "java.lang.string" jdbctype = "varchar" /> <arg columna = "Úndimate" javatype = "java.lang.lang.lang.lang.lang.lang.lang. jdbctype = "varchar"/> </constructor> </sultmap> <sql id = "base_column"> id, name, type, `group`, geo, createTime, updateTime </sql> <select id =" Querygeofence "ParametTerType =" com.kangaroo.studio.moonlight.DaO resultMap = "geofenceList"> select <incluido refid = "base_column"/> de geofence donde 1 = 1 <if <if test = "type! = null"> y type = #{type} </if> <if test = "name! = null"> y nombre como conca concat ('%', #{group}, '%') </if> <if test = "starttime! = null"> y createTime> = #{starttime} </if> <if test = "endtime! = null"> y createTime <= #{endtime} </if> </select> </pper>Escriba los métodos correspondientes en la interfaz mapper.java
Lista <Seofence> Querygeofence (GeofenceQueryParam GeofenceQueryParam);
Primero, agregue el código de página y luego explíquelo más tarde
@RequestMapping (value = "/Fence/Query", método = requestmethod.post) @ResponseBody Public Response Queryfence (@RequestBody GeofenceQueryParam GeofenceQueryParam) {try {Integer pagenum = geofenceQueryParam.getPageNum ()! = Null Entero pagesize = geofenceQueryparam.getPageSize ()! = NULL? GeofenceQueryParam.getPageSize (): 10; PageHelper.StartPage (Pagenum, PageSize); List <Beofence> list = MoonlightMapper.QueryGeofence (GeofenceQueryParam); devolver una nueva respuesta (resultCode.Success, "Consulta Geofence Success", List); } catch (excepción e) {logger.error ("consulta geofence fallida", e); devolver una nueva respuesta (resultCode.Exception, "consulta geofence fallida", nulo); }}ilustrar:
1. La ventaja de PageHelper es que la paginación y el mapper.xml están completamente desacoplados. El método de implementación es fortalecer el proceso de ejecución de MyBatis en forma de complemento, agregando el recuento total y las consultas límite. Pertenece a la página física.
2. Existe un problema de seguridad al que debe prestar atención, de lo contrario puede conducir al trastorno de la paginación. He pegado directamente un pasaje de este blog aquí.
4. ¿Cuándo conducirá a una paginación insegura?
El método PageHelper utiliza un parámetro staticSlocal, y los parámetros de paginación y los subprocesos están vinculados.
Siempre que pueda asegurarse de que el método PageHelper se llame inmediatamente seguido por el método de consulta MyBatis, esto es seguro. Porque PageHelper borra automáticamente el objeto almacenado ThreadLocal en el fragmento finalmente.
Si se produce una excepción antes de ingresar al ejecutor, el hilo no estará disponible, que es un error humano (como un desajuste entre el método de interfaz y XML, lo que conducirá a que no se encuentre la declaración mapeada). Esta situación no hará que el parámetro de hilo se use incorrectamente debido a la falta de disponibilidad del hilo.
Pero si escribe el siguiente código, es un uso inseguro:
PageHelper.StartPage (1, 10); List <Country> List; if (Param1! = Null) {list = countryMapper.Selectif (param1);} else {list = new ArrayList <Country> ();}En este caso, debido a que Param1 tiene NULL, PageHelper producirá un parámetro de paginación, pero no se consume, y este parámetro permanecerá en este hilo. Cuando este hilo se usa nuevamente, puede causar métodos que no deberían estar pagando para consumir los parámetros de paginación, lo que da como resultado una paginación inexplicable.
El código anterior debe escribirse de la siguiente manera:
List <Country> list; if (param1! = Null) {pageHelper.StartPage (1, 10); list = countryMapper.Selectif (param1);} else {list = new ArrayList <Country> ();}Esta forma de escribir puede garantizar la seguridad.
Si no está a gusto con esto, puede limpiar manualmente los parámetros de paginación almacenados en ThreadLocal, que puede usarse así:
List <Country> list; if (param1! = Null) {pageHelper.StartPage (1, 10); intente {list = countryMapper.Selectall (); } Finalmente {pageHelper.ClearPage (); }} else {list = new ArrayList <Country> ();}No es bueno escribir así, y no es necesario.
Resumir
Lo anterior es el método de configuración y uso simple del complemento MyBatis Paging PageHelper introducido por el editor (recomendado). Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!