Au début du projet, j'avais besoin d'utiliser MyBatis Paging. J'ai lu beaucoup de plug-ins en ligne. En fait, les principes de mise en œuvre sont fondamentalement les mêmes, mais la plupart d'entre eux ne donnent que du code et ont des annotations incomplètes. J'ai donc fait référence à de nombreux articles (chaque article vole un peu de code, évalue le mien et les semi-plagiarisse), puis j'ai imité et écrit un plug-in de pagination adapté à mon projet. Sans plus tarder, je viens de télécharger le code. Par rapport à la plupart des articles, les annotations sont très complètes.
L'intercepteur le plus important
package com.dnkx.interceptor; Importer java.sql. *; import java.util.hashmap; import java.util.properties; import org.apache.ibatis.executor.resultSet.ResultSethandler; import org.apache.ibatis.executor.statement.statementHandler; import org.apache.ibatis.mapping.boundsql; import org.apache.ibatis.mapping.maptstatement; import org.apache.ibatis.plugin.interceptor; import org.apache.ibatis.plugin.intercepts; import org.apache.ibatis.plugin.invocation; import org.apache.ibatis.plugin.plugin; import org.apache.ibatis.plugin.signature; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.SystemMetaObject; import com.dnkx.pojo.page; / ** * * Intercepteur de pagination, utilisé pour intercepter les opérations qui nécessitent une requête de pagination, puis les paginent. * Le principe de la pagine MyBatis est implémenté à l'aide d'intercepteurs: * Pour utiliser JDBC pour fonctionner dans la base de données, vous devez avoir un objet d'instruction correspondant. Avant que MyBatis exécute l'instruction SQL, il générera un objet d'instruction contenant l'instruction SQL, et l'instruction SQL correspondante * est générée avant l'instruction, afin que nous puissions commencer par l'instruction SQL utilisée pour générer l'instruction avant de générer l'instruction. Dans l'instruction MyBatis, l'instruction est générée par la méthode * Préparez-vous de l'objet RoutingStationHandler. Par conséquent, l'une des idées d'utilisation d'un intercepteur pour implémenter le paginage MyBatis consiste à intercepter la méthode de préparation de l'interface de relevéhandleur, puis à modifier l'instruction SQL en l'instruction SQL de requête de pagination correspondante dans la méthode interceptor, puis à appeler la méthode de préparation de l'objet * instructionhandler, c'est-à-dire à l'appel invocation.proceed (). * Pour la pagination, l'une des opérations que nous devons effectuer dans l'intercepteur est de compter le nombre total d'enregistrements qui remplissent les conditions actuelles. C'est en obtenant l'instruction SQL d'origine, en le modifiant en instruction statistique correspondante, puis en remplaçant les paramètres dans l'instruction SQL à l'aide des paramètres encapsulés MyBatis et des paramètres de réglage *. Ensuite, l'instruction SQL interrogeant le nombre d'enregistrements est exécutée pour compter le nombre total d'enregistrements. * * Expliquez plusieurs classes qui peuvent être utilisées dans le plug-in: * MetaObject: une classe fournie par MyBatis basée sur un objet qui renvoie la valeur de la propriété * BoundsQL: En cela, vous pouvez faire en sorte que le SQL soit exécuté et que les paramètres peuvent être utilisés pour exécuter SQL * Mappudstatement: cette déclaration SQL (Rowbounds actuellement exécutée: il est utilisé pour le fichier XML de la déclaration SQL actuellement exécutée * Mybatis Memory Paging. * ParameterHandler: il est utilisé dans MyBatis pour remplacer la valeur qui apparaît dans SQL. * * @Author Li Xiaogui 9 novembre 2016 10:59:04 * / @Intercepts ({@Signature (Type = StatementHandler.class, Method = "Prepare", Args = {Connection.class}), @Signature (Type = ResultsEthandler.class, Method = "HandlerreSultSets", Args = {Statut.class})) Interceptor {// Intercepter le mot-clé PAGINY PRIVATE STATIC FINAL String select_id = "page"; // Le code exécuté par le plug-in remplacera la méthode d'origine et réécrit la plus importante Intercept @Override public Object Intercept (Invocation Invocation) lance Throwsable {if (invocation.getTarget () instanceof statuehandler) {// nous avons ici un paramètre si la méthode de requête contient la page, la pagination d'autres méthodes ignorera // donc vous avez besoin de faire la méthode de la méthode Statement Gandard). MetaObject metaObject = SystemMetaObject.ForObject (StatementHandler); MaptedStatement MapStStatement = (mappedstatement) metaObject.getValue ("Delegate.maptstatement"); String SelectID = MAPPEDSATATION.GETID (); String MethodName = SelectId.SubString (SelectId.LastIndexof (".") + 1) .tolowerCase (); // alors jugez si la page est incluse, obtenez sql if (méthorname.contains (select_id)) {boundsql boundsql = (boundsql) metaObject.getValue ("delegate.boundsql"); // Le paramètre de pagination est une propriété de ParameterObject ParameterObject String sql = boundsql.getsql (); System.out.println ("Get SQL:" + SQL); Hashmap <string, object> map = (hashmap <string, object>) (boundsql.getParameterObject ()); // page page = (page) (boundsql.getParameterObject ()); Page page = (page) map.get ("page"); // Réécriture de la chaîne SQL CountSQL = ConcatCountSQL (SQL); String pagesql = concatPagesql (sql, page); // System.out.println ("Rewrite Count SQL:" + CountSQL); System.out.println ("Rewrite Select SQL:" + pagesql); Connexion connexion = (connexion) invocation.getArgs () [0]; PRÉPAYÉSATATION COUNTSTMT = NULL; ResultSet rs = null; int totalCount = 0; try {countstmt = connection.preparestatement (countSQL); rs = countstmt.executequery (); if (Rs.Next ()) {totalCount = Rs.GetInt (1); }} catch (sqlexception e) {System.out.println ("ignorer cette exception" + e); } enfin {try {Rs.close (); countstmt.close (); } catch (sqlexception e) {System.out.println ("ignorer cette exception" + e); }} metaObject.setValue ("Delegate.boundsql.sql", pagesql); // BIND Page.SetNumCount (totalCount); }} return invocation.proceed (); } // Intercepter le type de déclaration de type, remplacer la méthode du plugin @Override Public Object Plugin (Object Target) {if (cible instanceof statuehandler) {return plugin.wrap (cible, this); } else {return Target; }} @Override public void setProperties (Properties Properties) {} // Renovate SQL public String ConcatCountSQL (String sql) {// StringBuffer sb = new StringBuffer ("select Count (*) from"); /*sql=sql.tolowerCase (); if (sql.lastIndexof ("Order")> sql.lastIndexof (")")) {sb.append (sql.substring (sql.indexof ("from") + 4, sql.lastIndexof ("ordonnance"))); } else {sb.append (sql.substring (sql.indexof ("from") + 4)); } * / StringBuffer sb = new StringBuffer (); sql = sql.tolowercase (); if (sql.lastIndexof ("Order")> 0) {sql = sql.substring (0, sql.indexof ("order")); } SB.APPEND ("SELECT COUNT (*) FROM (" + SQL + ") TMP"); return sb.toString (); } public String ConcatPagesQl (String SQL, page page) {StringBuffer sb = new StringBuffer (); SB.APPEND (SQL); SB.APPEND ("LIMIT") .APPEND (PAGE.GETPAGEBEGIN ()). APPEND (",") .APPEND (page.getPageSize ()); return sb.toString (); }} Classe de page [Java] Voir le Copypackage ordinaire com.dnkx.pojo; import java.util.hashmap; importation java.util.map; / ** * * Classe auxiliaire de requête de pagination * @author li Xiaogui 9 novembre 2016 13:55:37 * / Page de classe publique { // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- PageBegin; // Position de démarrage private int numcount; // Nombre total de private int pagetotal; // Nombre total de chaîne privée ordonnier = ""; // Contrôler la chaîne privée OrderDirection affichée sur la page de tri = ""; PAMBRE PUBLIQUE () {} PAME PUBLIC (int pagesize, int pagecurrentPage) {super (); this.pagesize = pagesize; this.PageCurrentPage = PageCurrentPage; } page publique (map <string, string> map) {if (map.get ("pagenum")! = null) {this.setPageCurrentPage (this.pagecurrentPage = Integer.Parseint (map.get ("pagenum"))); // num de pages pour requérir} else {this.setpagecurrentpage (1); if (map.get ("numperpage")! = null) {this.setPageSize (Integer.ParseInt (map.get ("numperpage"))); // num de gamme affichée par page} else {this.setPageSize (5); // Définit la valeur initiale} if (map.get ("orderfield")! = null) {this.setorde } 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 / pagesize); } public void setPageTotal (int pagetotal) {this.pagetotal = pagetotal; } public int getPageSize () {return pagesize; } 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; } public static page getPage (int pagesize, int pagecurrentPage) {return new page (pagesize, pagecurrentPage); } public static page getPage (map map) {return new page (map); }}Méthode d'appel dans le contrôleur
Public String List (HttpServLetRequest Request) {long a = System.currenttimemillis (); Hashmap <string, objet> map = getRequestmap.getMap (request); // encapsule la méthode vous-même, prenez le paramètre de la page de demande Page = Page.getPage (Map); // Initialize Page Map.put ("page", page); map.put (map.get ("OrderField") + "", map.get ("OrderDirection")); List <employee> list = EmployingService.getListPage (MAP); request.setAttribute ("eMlist", list); request.setAttribute ("page", page); request.setAttribute ("map", map); // Obtenez les attributs liés à la page page.getNumCount (); // Nombre total de pages page.getPageTotal (); // Nombre total de pages longs b = System.CurrentTimeMillis (); System.out.println ("-------------- prenant du temps:" + (BA) + "MS"); return "Basic / Employee_List"; }Enfin, configurez le plug-in au printemps
<bean id = "Page Interector"> </anEn> <! - Spring et Mybatis sont parfaitement intégrés, et il n'y a pas besoin de fichier de mappage de configuration MyBatis -> <bean id = "sqlSessionFactory"> <propriété name = "datasource" ref = "dataSource" /> <! - Scanning automatique de mapping.xml fichiers -> <propriété name = marewocations " value = "classpath: com / dnkx / mapping / *. xml"> </ propriété> <propriété name = "plugins"> <ref bean = "page intector" /> </ propriété> </ bean>
Ok, c'est la fin, cet article est pour référence uniquement! Dans l'attente des conseils du Grand Dieu