Nota: Este blog é completamente diferente do plug-in atual de paginação, por isso é recomendável que você verifique o código-fonte e a documentação mais recentes através do endereço do projeto acima para entender.
Já estive preocupado com a consulta de paginação mybatis antes e procurei muitos artigos relacionados on -line, mas não usei o último. O local do Pagado é completamente manuscrito com SQL e Count SQL, o que é muito problemático.
Mais tarde, por um tempo, eu queria escrever uma implementação de paginação de dentro de Mybatis. Eu escrevi uma implementação para o RanguagedRiver. Não há problema com a paginação automática, mas o número total de consultas (contagem) ainda não pode ser resolvido ao mesmo tempo e ficou sem solução.
Recentemente, tenho que usar a paginação novamente. Por uma questão de conveniência, tenho que escrever uma aula de paginação geral, por isso me refiro à maioria dos códigos de paginação Mybatis na Internet novamente.
De fato, há muito tempo, alguém abriu a implementação da fonte no GitHub, apoiando o MySQL, Oracle e o SQLServer, que é semelhante à referência acima e tem uma consideração mais abrangente. Mas acho que muitas aulas são muito problemáticas, então implementei uma classe com apenas um interceptador, que pode realmente ser dividido em duas classes. Uma das classes foi escrita como uma classe estática por mim e colocada no interceptador. Você também pode extrair a classe da página para facilitar o uso da página.
Vamos falar sobre o método de implementação primeiro. Este plugin tem apenas uma classe: PageHelper.java
A assinatura do interceptador é:
@Intercepts ({ @Signature (type = DeclarationHandler.class, Method = "preparar", args = {Connection.class}), @signature (type = ResultsetHandler.class, métodA assinatura aqui é crucial para toda a implementação e idéia. Primeiro, intercepto o método de preparação para alterar o SQL da paginação e contagem de consulta. Em seguida, intercepto o método HandleResultSets para obter o último resultado do processamento e colocar o resultado no objeto da página.
A seguir, é apresentado o código para modificar a página, que é uma modificação para dados do Oracle. Se você usar outros bancos de dados, poderá modificar o código aqui.
/ ** * Modifique o SQL original para a paginação SQL * @param sql * @param página * @return */ private string BuildPagesql (string sql, página da página) {StringBuilder Pagesql = new StringBuilder (200); Pagesql.append ("Selecione * de (selecione Temp. retornar pagesql.toString (); } Então, no seguinte método setPageParameter, uma instrução Count Select precisa ser modificada de acordo com o tipo de banco de dados:
// Número total de registros String countSql = "Selecione contagem (0) de (" + sql + ")";Por que não forneço suporte para vários bancos de dados? Eu não acho que seja necessário. Alguns bancos de dados não suportam a paginação, e quanto mais simples esse plug -in, mais fácil é para os desenvolvedores entenderem e modificar. Modificar -o na consulta de paginação que você precisa definitivamente não é um problema.
Finalmente, o código completo é adicionado (continue lendo, há também o método de uso abaixo): (Clique para baixar)
pacote com.mybatis.util; importar org.apache.ibatis.executor.parameter.parameterHandler; 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.*; importar org.apache.ibatis.reflection.metaObject; importar org.apache.ibatis.reflection.systemMetaObject; importar org.apache.ibatis.scripting.defaults.defaultParameterHandler; importar org.apache.log4j.logger; importar java.sql.*; importar java.util.list; importar java.util.properties; /*** Mybatis-Interceptador de paginação universal* @Author Liuzh/Abel533/ISEA* criado por Liuzh em 14-4-15. */ @Intercepts ({ @Signature (type = declarationHandler.class, Method = "preparar", args = {Connection.class}), @Signature (type = ResultsetHandler.class, Method = "HandleResultSets", args = {declaratent.class})}) PAPDLEM PageHelper implemors "{private {particular.class})})) Logger.getLogger (PageHelper.class); public static final threadlocal <age> localPage = new Threadlocal <Page> (); / ** * Comece a pagar * @param pagenum * @param Pagesize */ public static void StartPage (int pagenum, int paGageSize) {localPage.set (new Page (pagenum, PageSize)); } /*** Termine a paginação e retorne o resultado. O método deve ser chamado, caso contrário, o local será salvo até o próximo startpage * @return */ public static página endpage () {página página = localPage.get (); localPage.Remove (); página de retorno; } @Override Public Object Intercept (Invocation Invocation) lança o Throwable {if (localPage.get () == null) {return Invocation.Proced (); } if (Invocation.getTarget () instanceof DeclarationHandler) {DeclarationHandler DeclarationHandler = (DeclarationHandler) Invocation.getTarget (); MetaObject metastatementHandler = SystemMetaObject.ForObject (DeclarationHandler); // Separe a cadeia de objetos proxy (porque a classe de destino pode ser interceptada por vários interceptores, é formada o proxy de múltiplos e os dois loops a seguir // a classe de destino mais primitiva pode ser separada) enquanto (metastatementHandler.hasgetter ("h")) {object = metatatementHandler.getValue ("h"); MetastatementHandler = SystemMetaObject.ForObject (Object); } // A classe de destino que separa o último objeto de proxy while (metastatementHandler.hasgetter ("Target")) {objeto objeto = metastatementHandler.getValue ("Target"); MetastatementHandler = SystemMetaObject.ForObject (Object); } Mapedstatement mapedstatement = (MappedStatement) metástatementHandler.getValue ("delegate.mappedstatement"); // Página informações if (localPage.get ()! = Null) {página página = localPage.get (); Boundsql Boundsql = (Boundsql) MetastatementHandler.getValue ("Delegate.boundsql"); // parâmetro de página como uma propriedade do parameterObject ParameterString sql = boundSql.getSql (); // reescreva sql string pagesql = buildPagesql (sql, página); // Reescreva o Paging SQL MetastatementHandler.SetValue ("delegate.boundsql.sql", Pagesql); Conexão de conexão = (conexão) invocação.getargs () [0]; // redefina o número total de páginas nos parâmetros de paginação, etc. setPageParameter (SQL, conexão, MappedStatement, Boundsql, página); // entrega os direitos de execução ao próximo interceptador retornar invocação.proeced (); } else if (invocation.getTarget () instanceof ResultetHandler) {objeto resultado = invocação.proeced (); Página página = localPage.get (); Page.SetResult ((List) resultado); resultado de retorno; } retornar nulo; } / ** * Interceptar apenas esses dois tipos de * Declaração * ResultadostheThandler * @param alvo * @return * / @Override public Object Plugin (Object Target) {if (Target InstânciaofHandHandler || Instância de destino do resultado de etapa) {retornar plugin.wrap (Target, this); } else {return Target; }} @Override public void SetProperties (Propriedades Propriedades) {} / ** * Modifique o SQL original para paginação sql * @param sql * @param página * @return * / private string stringpagesql (string, sql, página) {stringbuilder Pages Pages = stringbuilder (string, sql, página) {stringbuilder Pages; Pagesql.append ("Selecione * de (selecione Temp. retornar pagesql.toString (); } / ** * Obtenha o número total de registros * @param sql * @param conexão * @param mapedstatement * @param boundsql * @param página * / private void setPageParameter (string sql, conexão, página total de stringsql (stringsql (string stringsql (string stringSql, página de strings. SQL + ")"; Preparado countstmt countstmt = null; ResultSet rs = null; tente {countStmt = Connection.Preparestatement (countSQL); Boundsql countbs = new Boundsql (MappEdStatement.getConfiguration (), countSQL, boundsql.getParameTerMAppings (), Boundsql.getParameterObject ()); SetParameters (CountStmt, MappedStatement, Countbs, Boundsql.getParameterObject ()); rs = countstmt.executeQuery (); int totalCount = 0; if (rs.Next ()) {totalCount = rs.getInt (1); } página.Settotal (totalCount); int totalpage = totalCount / Page.getPagesize () + ((totalCount % Page.getPagesize () == 0)? 0: 1); página.SetPages (totalPage); } catch (sqLexception e) {logger.error ("ignore esta exceção", e); } finalmente {tente {rs.close (); } catch (sqLexception e) {logger.error ("ignore esta exceção", e); } tente {countstmt.close (); } catch (sqLexception e) {logger.error ("ignore esta exceção", e); } } } /** * Substitute parameter value* @param ps * @param mappedStatement * @param boundSql * @param parameterObject * @throws SQLException */ private void setParameters(PreparedStatement ps, MappedStatement mappedStatement, BoundSql boundSql, Object parameterObject) throws SQLException { ParameterHandler parameterHandler = new DefaultParameterHandler (MappEdStatement, ParameterObject, BoundsQL); ParameterHandler.SetParameters (PS); } / ** * Descrição: Paginação * Autor: Liuzh * Atualização: Liuzh (2014-04-16 10:56) * / Public Static Class Page <E> {private int pagenum; private int PageSize; privado int startrow; private int endrow; Total longo privado; Páginas privadas int; Lista privada <E> resultado; página pública (int pagenum, int pageSize) {this.pagenum = pagenum; this.Pagesize = PageSize; this.startrow = pagenum> 0? (Pagenum - 1) * PageSize: 0; this.endrow = pagenum * Pagesize; } Lista pública <E> getResult () {return resultado; } public void setResult (list <e> resultado) {this.result = resultado; } public int getPages () {retornar páginas; } public void setPages (int páginas) {this.Pages = páginas; } public int getEndrow () {return endrow; } public void setendrow (int endrow) {this.endrow = endrow; } public int getPagenum () {return pagenum; } public void setPagenum (int pagenum) {this.pagenum = pagenum; } public int getPagesize () {return pagageSize; } public void setPagesize (int PAGESIZE) {this.pagesize = Pagesize; } public int getstartrow () {return startrow; } public void setStarTrow (int startrow) {this.startrow = startrow; } public long getTotal () {return total; } public void Settotal (total longo) {this.total = total; } @Override public String tostring () {return "Page {" + "pagenum =" + pagenum + ", Pagesize =" + Pagesize + ", Startrow =" + Startrow + ", endrow =" " + endrow +", total = " + total +", Pages = " + Pages + '' ';; }}} Para usar este interceptador, primeiro você precisa configurar o interceptador na configuração Mybatis:
<flugins> <plugin interceptor = "com.mybatis.util.pagehelper"> </plugin> </flugins>
Ao configurar um interceptador, você precisa prestar atenção à localização dos plugins. A ordem dos plugins é a seguinte:
Propriedades?, Configurações?, TypeAlIases?, TypeHandlers?, ObjectFactory?, ObjectWrapperFactory?, plugins?, Ambientes?, DatabaseIdProvider?, Mappers?
Finalmente, existe o código de exemplo (camada de serviço) que chama esse método:
@Override public PageHelper.Page <SysLoginLog> findsysLoginlog (String Loginip, String UserName, String LogIndate, String EXITDATE, String Logerr, Int PageNumber, Int Pagesize) lança BusinessException {PageHelper.startPage (Pagenumber, Pagesize); sysloginLogmapper.findsysLoginlog (loginip, nome de usuário, logindate, saída, Logerr); retornar pageHelper.endPage (); }Do exposto, podemos ver que o uso desse plug-in é muito simples. Você só precisa usar os métodos StartPage e Endpage do PageHelper antes e depois da consulta. O resultado da chamada do código intermediário já existe no resultado do PageHelper. Se você ligar para o PageHelper em um local que retornar um resultado, o resultado retornado ainda é uma lista e você pode aceitar o primeiro valor (acho que ninguém o usará assim neste local, é claro que não há erro dessa maneira).
Além disso, todos os códigos MYBATIS entre o StartPage e o Endpage serão paginados, e o PageHelper manterá o último resultado. Portanto, ao usá -lo, você precisa garantir que apenas uma consulta Mybatis seja executada nela por vez. Se houver várias paginas, use o StartPage e o Endpage várias vezes.
Como somente as implementações do Oracle são fornecidas aqui, espero que os leitores que se referem a outros bancos de dados implementados por este plug -in de paginação também possam abrir código correspondente.
Endereço do projeto: http://xiazai.vevb.com/201612/yuanma/mybatis_pagehelper_jb51.zip
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.