Prefácio
Quando as tabelas estão envolvidas no desenvolvimento da Web, como o Datatable, a necessidade de paginação surgirá. Normalmente, dividimos os métodos de paginação em dois tipos: paginação frontal e paginação de back-end.
Paginação front-end
Todos os registros (AJAX) na tabela de dados são solicitados ao mesmo tempo e depois armazenados em cache no front -end e calculou a contagem e a lógica de paginação. Geralmente, os componentes front-end (como o Datatable) fornecem ações de paginação.
Os recursos são: simples, muito adequados para plataformas da web em pequena escala; Problemas de desempenho surgirão quando a quantidade de dados for grande e a hora da transmissão de consulta e rede será longa.
Paginação de back -end
Especifique o número da página (pagenum) e o tamanho de cada página (PageSize) na solicitação AJAX. O back -end consulta os dados da página e o retorna, e o front -end é responsável apenas pela renderização.
Os recursos são: mais complexos; O gargalo de desempenho está no desempenho da consulta do MySQL, que obviamente pode ser otimizado e resolvido. De um modo geral, o desenvolvimento da web usa esse método.
Estamos falando de paginação de back -end.
Suporte MySQL para Paginação
Simplificando, o MySQL suporta a paginação por meio da cláusula de limite. Por favor, veja o exemplo abaixo.
O uso da palavra -chave limite é
Limite [deslocamento]] linhas
O deslocamento é o deslocamento em relação à primeira linha (a primeira linha é 0) e linhas é o número de linhas.
# Cada página possui 10 registros, pegue a primeira página e retorne os 10 primeiros registros selecionados * do limite de tablea 0,10;# Cada página possui 10 registros, pegue a segunda página e retorne o 11º recorde, ao 20º recorde, selecione * do limite de tablea 10,10;
O que quero mencionar aqui é que quando o MySQL lida com a paginação:
Limite 1000,10 - Filtre 1010 peças de dados, descarte as primeiras 1000 peças e mantenha 10 peças. Quando o deslocamento é grande, o desempenho diminuirá.
Limite 100000,10 - filtrará 10w+10 peças de dados e, em seguida, descartará as primeiras peças de 10W. Se você encontrar problemas de desempenho na paginação, poderá ajustá -los de acordo com essa ideia.
Mybatis paging plug -in PageHelper
Ao usar o Java Spring Development, o MYBATIS é uma ferramenta poderosa para operações de banco de dados. No entanto, ao lidar com a paginação, o Mybatis não possui métodos especiais. Geralmente, você precisa escrever a cláusula de limite para implementá -la, o que é relativamente caro. Felizmente, há um plug -in PageHelper.
1. Dependência do POM
Não vou mencionar a configuração de Mybatis. As dependências do PageHelper são as seguintes. Se você precisar de uma nova versão, pode escolher no Maven
<Depencency> <Puerpid> com.github.pagehelper </frupidId> <ArtifactId> PageHelper </ArtifactId> <versão> 4.1.4 </version> </dependency>
2. Configuração mybatis do PageHelper
Abra o arquivo de configuração do Mybatis, geralmente no caminho dos recursos. Meu nome é mybatis-config.xml.
<? xml versão = "1.0" coding = "utf-8"?> <! Doctype Configuration public "-// mybatis.org//dtd config 3.0 //" "http://mybatis.org/dtd/mybatis-3--config.dtnhge O mapeador global ativa ou desative o cache. -> <Configuração name = "Cacheenabled" value = "true"/> <!-Ativar ou desativar o carregamento preguiçoso globalmente. Quando desativado, todos os objetos associados são carregados instantaneamente. -> <Configuração name = "LazyLoadingEnabled" value = "true"/> <!-Quando ativado, um objeto com uma propriedade de carregamento preguiçoso carregará totalmente qualquer propriedade quando é chamada. Caso contrário, cada propriedade será carregada conforme necessário. -> <Configuração name = "agressiveLAzyLoading" value = "true"/> <!-Se deve permitir que um único SQL retorne vários conjuntos de dados (dependendo da compatibilidade do driver) padrão: true-> <Configuração Nome = "MultiPleResultsetsenabled" Value = "True"/> <!-de Alias para as colunas pode ser usado (dependendo de depende (depende de "/! name = "usecolumnLabel" value = "true"/> <!- Permitir que o JDBC gere chaves primárias. O suporte da unidade é necessário. Se definido como true, essa configuração forçará a chave primária gerada, algumas unidades são incompatíveis, mas ainda podem ser executadas. default:false --> <setting name="useGeneratedKeys" value="true"/> <!-- Specify how MyBatis automatically maps columns of data base table NONE: not obscuring PARTIAL: part FULL: all--> <setting name="autoMappingBehavior" value="PARTIAL"/> <!-- This is the default execution type (SIMPLE: simple; REUSE: the executor may reuse prepared statements statements; BATCH: the executor pode repetir instruções e atualizações em lote)-> <Configuração name = "defaultExecutyType" value = "simples"/> <!-Converter campos usando a nomenclatura de camelo. -> <Configuração name = "mapundersCoretocameLCase" value = "true"/> <!-Definindo sessão de intervalo de cache local: haverá instrução de compartilhamento de dados: escopo da instrução (não será compartilhamento de dados) Defalut: Session-> <Configurando o nome = "LocalCescope" Value = "Sessão"/! Digite ao inserir um valor nulo -> <Configuração name = "jdbctypeFornull" value = "null"/> </setings> <flugins> <plugin interceptor = "com.github.pageHelper.pageHelper"> <nome da propriedade = "dialect" = "mysql"/> <nome da propriedade "> name = "rowboundswithcount" value = "false"/> <propriedade name = "PagesizeZero" value = "true"/> <names name = "razoável" value = "false"/> <names name = "supportMethodSarguments" value = "false"/> <nome da propriedade "returnPageInfo"/"into"/> </plugin "</plugin"/>
O que você precisa prestar atenção aqui é a configuração relacionada ao PageHelper.
Se você não carregar o arquivo de configuração do Mybatis, estará usando a configuração padrão do Mybatis. Como carregar o arquivo de configuração mybatis?
Vá para a sua configuração de dados.
Ao configurar o SQLSessionFactory, especifique o arquivo de configuração do Mybatis Core e o caminho do mapeador, o código é o seguinte
@Bean (name = "MoonlightSqlSessionFactory") @Primary Public SQLSessionFactory MoonlightSqlSessionFactory (@qualifier ("MoonlightData") DataSource DataSource) lança exceção {SQLSessionFactoryBean Bean = New SQLSessionFactoryBean (); bean.setDataSource (DataSource); bean.setMapperLocations (novo PathMatchingResourcePatternResolver (). GetResources ("ClassPath: Mybatis-Mapper/*. Xml")); bean.setConfigLocation (new ClassPathResource ("mybatis-config.xml")); return bean.getObject (); }ilustrar:
O caminho de armazenamento Mapper.xml configurado aqui está na pasta Recurso/Mybatis-Mapper
O arquivo mybatis-config.xml configurado aqui está em recurso/
3. Paginação
Prepare um mapper.xml, basta escrever um para o teste, basta usar um do projeto.
Esta consulta aqui é uma consulta típica de várias condições. O que precisamos fazer é pagar os registros correspondentes por várias condições.
<? xml versão = "1.0" coding = "utf-8"?> <! namesace = "com.kangaroo.studio.moonlight.dao.mapper.moonlightmapper"> <resultMap id = "geofencelist" type = "com.kangaroo.studio.moonlight.dao.model.geofence"> <burctor> <dogarng column = "idao" javatypy.geofence "> <burctor> <dogarng column =" ida "" " jdbctype = "inteiro" /> <Arg jdbctype = "varchar" /> <Arg javatype = "java.lang.string" jdbctype = "varchar"/> </construtor> </resultMap> <sql id = "base_column"> id, nome, tipo, `group`, geo, createTime, updateTime </sql> <select =" quedgeofence " parameterType = "com.kangaroo.studio.moonlight.dao.model.geofenceQueryParam" resultMap = "geofencelist"> selecione <incluir refid = "base_column"/> de geofiance onde 1 = 1 <se test! concat ('%', #{name}, '%') </if> <if test = "group! = null"> e `group` como concat ('%', #{group}, '%') </if> <se test =" starttime! = null "> e createTime> = #{starttime} </se> <se> <ffortTime! </if> </leclect> </palpper>Escreva métodos correspondentes na interface mapper.java
LISTA <GEOFENCE> Querygeofiance (GeofenceQueryParam GeofenceQueryParam);
Primeiro, adicione o código da página e depois explique mais tarde
@RequestMapping (Value = "/Fence/Query", Method = requestMethod.Post) @ResponsoBody Public Response QueryFence (@RequestBody GeofenceQueryParam geofenceQueryParam) {Try): {integer pagenum = GeofeMeryParam.getPagenum ()! = Null? Inteiro pageSize = geofenceQueryParam.getPagesize ()! = Null? GeofenceQueryParam.getPagesize (): 10; PageHelper.StartPage (Pagenum, Pagesize); Lista <GEOFENCE> LIST = Moonlightmapper.QuerygeoFence (GeofenceQueryParam); Retornar nova resposta (resultadocode.success, "Consulta Geofiance Success", List); } Catch (Exceção e) {Logger.error ("Query Geofence Failed", e); Retornar nova resposta (resultadocode.exception, "falha na falha na consulta", nula); }}ilustrar:
1. A vantagem do PageHelper é que a paginação e o mapa.xml são completamente dissociados. O método de implementação é fortalecer o processo de execução do Mybatis na forma de um plug-in, adicionando as consultas totais de contagem e limite. Pertence à página física.
2. Há um problema de segurança para o qual você precisa prestar atenção, caso contrário, pode levar ao distúrbio da paginação. Eu colei diretamente uma passagem deste blog aqui.
4. Quando isso levará à paginação insegura?
O método PageHelper usa um parâmetro estático de threadlocal e os parâmetros e threads de paginação estão vinculados.
Contanto que você possa garantir que o método PageHelper seja chamado imediatamente seguido pelo método de consulta Mybatis, isso é seguro. Porque o PageHelper limpa automaticamente o objeto armazenado Threadlocal no snippet finalmente.
Se ocorrer uma exceção antes de entrar no executor, o thread não estará disponível, o que é um bug humano (como uma incompatibilidade entre o método da interface e o XML, que levará a encontro do Mappedstatement). Essa situação não fará com que o parâmetro Threadlocal seja usado incorretamente devido à indisponibilidade do encadeamento.
Mas se você escrever o código a seguir, é um uso inseguro:
PageHelper.StartPage (1, 10); List <Country> List; if (param1! = Null) {list = countrymapper.Selectif (param1);} else {list = new ArrayList <Country> ();}Nesse caso, como o Param1 possui, o PageHelper produzirá um parâmetro de paginação, mas não é consumido, e esse parâmetro permanecerá neste thread. Quando este thread é usado novamente, pode causar métodos que não devem ser paginos para consumir os parâmetros de paginação, o que resulta em paginação inexplicável.
O código acima deve ser escrito da seguinte maneira:
Lista <Country> List; if (param1! = Null) {PageHelper.StartPage (1, 10); list = countrymapper.Selectif (param1);} else {list = new ArrayList <Country> ();}Essa maneira de escrever pode garantir a segurança.
Se você não estiver à vontade com isso, pode limpar manualmente os parâmetros de paginação armazenados no Threadlocal, que podem ser usados assim:
Lista <Country> List; if (param1! = Null) {PageHelper.StartPage (1, 10); tente {list = countrymapper.Selectall (); } finalmente {PageHelper.ClearPage (); }} else {list = new ArrayList <Country> ();}Não é bom escrever assim, e não é necessário.
Resumir
O exposto acima é o método de configuração e uso simples do PAGIN PLAGE MYBATIS PAGIN PAGINPELPER Introduzido pelo editor (recomendado). Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!