No início do projeto, eu precisava usar o Mybatis Paging. Eu li muitos plug-ins online. De fato, os princípios de implementação são basicamente os mesmos, mas a maioria deles apenas fornece código e possui anotações incompletas. Por isso, me referi a muitos artigos (cada artigo rouba um pequeno código, avalia o meu próprio e semi-plágio) e depois imitei e escrevi um plug-in de paginação adequado para o meu projeto. Sem mais delongas, acabei de enviar o código. Comparado com a maioria dos artigos, as anotações são muito completas.
O interceptador mais importante
pacote com.dnkx.intercept; importar java.sql.*; importar java.util.hashmap; importar java.util.properties; importar org.apache.ibatis.executor.resultset.ResultSetHandler; importar org.apache.ibatis.executor.statement.statementHandler; importar org.apache.ibatis.mapping.boundsql; importar org.apache.ibatis.mapping.Mappedstatement; importar org.apache.ibatis.plugin.intercept; importar org.apache.ibatis.plugin.intercepts; importar org.apache.ibatis.plugin.invocation; importar org.apache.ibatis.plugin.plugin; importar org.apache.ibatis.plugin.signature; importar org.apache.ibatis.reflection.metaObject; importar org.apache.ibatis.reflection.systemMetaObject; importação com.dnkx.pojo.page; /** * * Interceptador de paginação, usado para interceptar operações que requerem consulta de paginação e depois paginá -las. * O princípio da paginação mybatis é implementado usando o Interceptores: * Para usar o JDBC para operar no banco de dados, você deve ter um objeto de instrução correspondente. Antes de Mybatis executar a instrução SQL, ele gerará um objeto de declaração que contém a instrução SQL e a instrução SQL correspondente* é gerada antes da instrução, para que possamos começar com a instrução SQL usada para gerar a instrução antes de gerar a instrução. Na instrução mybatis, a instrução é gerada pelo método * Prepare do objeto RoutingStatementMandler. Portanto, uma das idéias para o uso de um interceptador para implementar a paginação do Mybatis é interceptar o método de preparação da interface Declaração e depois alterar a instrução SQL para a declaração SQL de consulta de paginação correspondente no método interceptor e, em seguida, chama o método de preparação do * DeclarationHandler Object, isto é, chamadas de invocação.ProEced (). * Para a paginação, uma das operações que precisamos fazer no interceptador é contar o número total de registros que atendem às condições atuais. Isso é obtendo a instrução SQL original, alterando -a para a instrução estatística correspondente e substituindo os parâmetros na instrução SQL usando os parâmetros encapsulados do mybatis e os parâmetros de configuração *. Em seguida, a instrução SQL consultando o número de registros é executada para contar o número total de registros. ** Explique várias classes que podem ser usadas no plug-in:* metaobject: uma classe fornecida por mybatis com base em um objeto que retorna o valor da propriedade* Boundsql: nisso, você pode ser executado o SQL e o STEMTSOUNS a ser usado para executar o SHETSTATEMENT OS PODE REGUMO A REALMENTE A REALMENTE APENASEIRA APENASEIRA A REUMENTO APENASEIRA AGORATE A REUMOUN A REGUMO Atualmente, o valor de Sqm. Paging de memória mybatis. * ParameterHandler: é usado no mybatis para substituir o valor que aparece no SQL. * * @Author Li Xiaogui 9 de novembro de 2016 10:59:04 */ @Intercepts ({@signature (type = declarationHandler.class, Method = "Prepare", args = {Connection.class}), @signature (type = ResultetHandler.class, MethodSASSASS) Interceptador {// Interceptar a palavra -chave PAGING PROVADA PRIVADA ESTATIC FINAL String select_id = "Page"; // O código executado pelo plug-in substituirá o método original e reescreverá a interceptação mais importante @Override Public Object Intercept (Invocation Invocation) lança arremesso {if (Invocation.getTarget () InstlasseOf Declaratectemticl () {// aqui temos uma configuração se o método de consulta contém a página de pagamentos outros métodos/// para obter o nome do método de consulta. MetaObject metaObject = SystemMetaObject.ForObject (DeclarationHandler); MAPPEDSTATEMENT MAPPEDSTATEMENT = (MAPPEDSTATEMENT) metaObject.getValue ("delegate.mappedstatement"); String selectId = mapedstatement.getId (); String MethodName = SelectId.subString (SelectId.LastIndexof (".")+1) .TolowerCase (); // Então julgue se a página estiver incluída, obtenha SQL if (Methorname.contains (select_id)) {Boundsql Boundsql = (Boundsql) metaObject.getValue ("Delegate.BoundSql"); // O parâmetro de paginação é uma propriedade do parameterObject ParameTerObject String sql = boundSql.getSql (); System.out.println ("Get SQL:"+SQL); Hashmap <string, object> map = (hashmap <string, object>) (boundsql.getParameTerObject ()); // página de página = (página) (Boundsql.getParameTerObject ()); Página página = (página) map.get ("página"); // reescreva sql string countsql = concatCountSQL (SQL); String pagesql = concatPagesql (sql, página); // System.out.println ("Reescreva a contagem de SQL:"+countSQL); System.out.println ("Rewrite Select SQL:"+PAGESQL); Conexão de conexão = (conexão) invocação.getargs () [0]; Preparado countstmt countstmt = null; ResultSet rs = null; int totalCount = 0; tente {countStmt = Connection.Preparestatement (countSQL); rs = countstmt.executeQuery (); if (rs.Next ()) {totalCount = rs.getInt (1); }} catch (sqLexception e) {System.out.println ("Ignore esta exceção"+e); } finalmente {tente {rs.close (); Countstmt.close (); } catch (sqLexception e) {System.out.println ("Ignore esta exceção"+e); }} metaobject.setValue ("Delegate.boundsql.sql", Pagesql); // Count Page.setNumCount (totalCount); }} return invocation.proeced (); } // Interceptar o Type DeclarationHandler, substitua o método do plug -in @Override public Object Plugin (Object Target) {if (Target Instânciaof DeclarationHandler) {return plugin.wrap (Target, este); } else {return Target; }} @Override public void SetProperties (Propriedades Propriedades) {} // Renove o SQL public String concatCountSql (String sql) {// stringbuffer sb = new StringBuffer ("Select count (*) de"); /*sql=sql.tolowerCase (); if (sql.lastindexOf ("order")> sql.lastindexof (")")) {sb.append (sql.substring (sql.indexOf ("de")+4, sql.lastindexOf ("order")); } else {sb.append (sql.substring (sql.indexof ("de")+4)); }*/ StringBuffer sb = new StringBuffer (); sql = sql.tolowercase (); if (sql.LastIndexOF ("Order")> 0) {sql = sql.substring (0, sql.indexOf ("order")); } sb.append ("selecione count (*) de ("+sql+") tmp"); return sb.toString (); } public string concatpagesql (string sql, página página) {stringBuffer sb = new StringBuffer (); sb.append (SQL); sb.append ("limite") .append (Page.getPageBegin ()). Append (",") .Append (Page.getPagesize ()); return sb.toString (); }} Classe de página [java] Exibir copypackage simples com.dnkx.pojo; importar java.util.hashmap; importar java.util.map; / ** * * Classe auxiliar de consulta de paginação * @Author Li Xiaogui 9 de novembro de 2016 13:55:37 */ página de classe pública { // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- PageBegin; // Posição inicial privada int numCount; // Número total de private Int Pagetotal; // Número total de String privado Orderfield = ""; // Controle o Diretor de ordem de String Private exibido na página de classificação = ""; public Page () {} public Page (int PageSize, int pageCurrentPage) {super (); this.Pagesize = PageSize; this.PageCurrentPage = PageCurrentPage; } página pública (map <string, string> map) {if (map.get ("pagenum")! = null) {this.setPagecurrentPage (this.pagecurrentPage = intege.parseint (map.getp ("pagenum")); if (map.get ("numPage")! = null) {this.setPagesize (integer.parseint (map.get ("numPerpage"))); // num de entradas exibidas por página} else {this.setPagesize (5); // o valor inicial} if (map.get. (", isto.) } if (map.get ("OrderDirection")! = null) {this.setOrderDirection (map.get ("OrderDirection")); }} public int getPageCurrentPage () {return pagecurrentPage; } public void setPageCurrentPage (int pageCurrentPage) {this.pageCurrentPage = PageCurrentPage; } public int getNumCount () {return numCount; } public void setNumCount (int numCount) {this.numCount = numCount; } public int getPageTotal () {return (numCount%PageSize> 0)? (NumCount/Pagesize+1) :( numCount/pagageSize); } public void setPageTotal (int Pagetotal) {this.Pagetotal = Pagetotal; } public int getPagesize () {return pagageSize; } public void setPagesize (int PAGESIZE) {this.pagesize = Pagesize; } public int getPageBegin () {return PageSize*(PageCurrentPage-1); } public void setPageBegin (int PageBegin) {this.pageBegin = PageBegin; } public String getOrderfield () {return orderfield; } public void Setorderfield (String Orderfield) {this.orderfield = Orderfield; } public String getOrderDirection () {return OrderDirection; } public void setOrderDirection (String OrderDirection) {this.OrderDirection = OrderDirection; } página estática pública getPage (int PageSize, int pageCurrentPage) {return New Page (PageSize, PageCurrentPage); } página estática pública getPage (mapa do mapa) {return New Page (mapa); }}Método de chamada no controlador
list string public (httpServletRequest solicitação) {long a = system.currenttimemillis (); Hashmap <string, object> map = getRequestMap.getMap (request); // encapsula o método você mesmo, pegue o parâmetro da página de solicitação página = página.getPage (map); // inicialize o mapa da página ("página, página); // coloque o objeto Página no parâmetro (este mapa é usado por mybtis, na página); map.put (map.get ("orderfield")+"", map.get ("orderdirection")); List <Com $ FEXY> List = Funcionário Service.getListpage (MAP); request.setAttribute ("emlist", lista); request.setAttribute ("página", página); request.setAtattribute ("mapa", mapa); // obtenha atributos relacionados à página Page.getNumCount (); // número total de páginas Page.getPageTotal (); // Número total de páginas de comprimento B = System.CurrentTimEmillis (); System.out.println ("-------------demorado:"+(ba)+"ms"); retornar "Basic/Funcionário_list"; }Finalmente, configure o plug-in na primavera
<bean id = "PageIntercretor"> </ Bean> <!-A primavera e Mybatis estão perfeitamente integrados, e não há necessidade de arquivo de mapeamento de configuração Mybatis-> <bean id = "sqlsessionFactory"> <nome da propriedade "MAPNING (DATASOURCE" Ref = "DataSource" /> <! Value = "ClassPath: com/dnkx/mapping/*. xml"> </property> <propriedade name = "plugins"> <ref bean = "PageInterector"/> </Property> </bean>
Ok, esse é o fim, este artigo é apenas para referência! Ansioso pelo conselho do Grande Deus