Zu Beginn des Projekts musste ich MyBatis Paging verwenden. Ich habe viele Plug-Ins online gelesen. Tatsächlich sind die Implementierungsprinzipien im Grunde gleich, aber die meisten geben nur Code und haben unvollständige Annotationen. Also verwies ich auf viele Artikel (jeder Artikel stiehlt einen kleinen Code, bewertet meinen eigenen und halb plagiiert) und nachgeahmt und ein Paging-Plug-In geschrieben, das für mein Projekt geeignet ist. Ohne weiteres habe ich gerade den Code hochgeladen. Im Vergleich zu den meisten Artikeln sind die Anmerkungen sehr vollständig.
Der wichtigste Abfangwerk
Paket com.dnkx.interceptor; Java.sql.*importieren; import Java.util.hashMap; Import Java.util.Properties; import org.apache.ibatis.executor.resultset import org.apache.ibatis.executor.statement.statementHandler; import org.apache.ibatis.mapping.boundSql; import org.apache.ibatis.mapping.mappingStatement; 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; /** * * Pagination Interceptor, verwendet, um Operationen abzufangen, die eine Paging -Abfrage erfordern und dann paginieren. * Das Prinzip von MyBatis Paging wird mit Interceptors implementiert: * Um JDBC zu verwenden, um in der Datenbank zu arbeiten, müssen Sie ein entsprechendes Anweisungsobjekt haben. Bevor MyBatis die SQL -Anweisung ausführt, generiert es ein Anweisungsobjekt, das die SQL -Anweisung enthält, und die entsprechende SQL -Anweisung* wird vor der Anweisung generiert, sodass wir mit der SQL -Anweisung beginnen können, mit der die Anweisung generiert wird, bevor sie die Anweisung generiert. In MyBatis wird eine Anweisung durch die * -Prepe -Methode des RoutingStatementHandler -Objekts generiert. Eine der Ideen für die Verwendung eines Interceptors zur Implementierung von MyBatis Paging besteht daher darin, die Vorbereitung der Methode der AnweisungStHandler -Schnittstelle abzufangen und dann die SQL -Anweisung in die entsprechende Pagination -Abfrage -SQL -Anweisung in der Interceptor -Methode zu ändern, und rufen Sie dann die Vorbereitungsmethode des * AnweisungHandler -Objekts auf. * Für die Pagination besteht eine der Operationen, die wir im Interceptor ausführen müssen, die Gesamtzahl der Aufzeichnungen, die den aktuellen Bedingungen erfüllen. Dies erfolgt durch die Erfassung der ursprünglichen SQL -Anweisung, das Ändern der entsprechenden statistischen Anweisung und das Ersetzen der Parameter in der SQL -Anweisung unter Verwendung der myBatis eingekapselten Parameter und Einstellung * Parameter. Anschließend wird die SQL -Anweisung, die die Anzahl der Datensätze abfragt, ausgeführt, um die Gesamtzahl der Datensätze zu zählen. ** Erklären Sie mehrere Klassen, die im Plug-In verwendet werden können:* metaObject: Eine Klasse, die von MyBatis basierend auf einem Objekt zurückgegeben wird, das den Eigenschaftswert zurückgibt. MyBatis Memory Paging. * ParameterHandler: Es wird in MyBatis verwendet, um den in SQL angezeigten Wert zu ersetzen. * * @author Li Xiaogui November 9, 2016 10:59:04 */ @Intercepts({ @Signature(type=StatementHandler.class, method="prepare",args={Connection.class}), @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class}) }) public class PageInterceptor implements Interceptor {// Abfangen das Paging -Keyword private statische String String select_id = "Seite"; // Der vom Plug-In ausgeführte Code ersetzt die ursprüngliche Methode und schreibt den wichtigsten Intercept @Override öffentlichen Objekt-Intercept (Invocation Invocation) um. MetaObject metaObject = SystemMetaObject.forObject (StatementHandler); Kartonisch kartierstatement = (kartierstatement) metaObject.getValue ("delegate.mappedStatement"); String selectID = MapPedStatement.getId (); String methodName = selectId.substring (selectId.lastIndexof (".")+1) .tolowerCase (); // dann beurteilen Sie, ob die Seite enthalten ist, sql if (methorname.contains (select_id)) {boundSQL boundSQL = (boundSQL) metaObject.getValue ("delegate.boundSQL"); // Paginationsparameter ist eine Eigenschaft von ParameterObject ParameterObject String SQL = bodensql.getSQL (); System.out.println ("Get SQL:"+SQL); HashMap <String, Object> map = (HashMap <String, Object>) (bodensql.getParameterObject ()); // Page page = (Seite) (boundsql.getParameterObject ()); Seite Seite = (Seite) map.get ("Seite"); // SQL String countSQL = concatCountSQL (SQL) neu schreiben; String pagesql = concatpagesql (SQL, Seite); // system.out.println ("Rewrite count SQL:"+countSQL); System.out.println ("SELECT SELECT SQL:"+PAGESQL); Connection Connection = (Verbindung) Invocation.getargs () [0]; PrepedStatement 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 ("Ignorieren Sie diese Ausnahme"+e); } endlich {try {rs.close (); countstmt.close (); } catch (sqlexception e) {System.out.println ("Ignorieren Sie diese Ausnahme"+e); }} metaObject.setValue ("delegate.boundsql.sql", pagesql); // Bind Count Page.setNumCount (TotalCount); }} return Invocation.Procece (); } // Abfangen das Typ AnweisungHandler, überschreiben Sie die Plugin -Methode @Override public Object -Plugin (Objektziel) {if (Zielinstanz von AnweisungHandler) {return plugin.wrap (target, this); } else {return target; }} @Override public void setProperties (Eigenschaften Eigenschaften) {} // Renovate SQL public String concatCountSQL (String SQL) {// StringBuffer sb = new StringBuffer ("Wählen Sie Count (*) aus"); /* sql=sql.tolowerCase (); if (sql.lastIndexof ("order")> sql.lastindexof (")")) {sb.append (sql.substring (sql.indexof ("from")+4, sql.lastindexof ("order")); } 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 ("Wählen Sie count (*) aus ("+sql+") tmp"); return sb.tostring (); } public String concatpagesql (String SQL, Seite Seite) {StringBuffer sb = new StringBuffer (); Sb.Append (SQL); sb.Append ("limit") .Append (page.getPageBegin ()). append (",") .Append (page.getPageSize ()); return sb.tostring (); }} Seitenklasse [Java] Sehen Sie sich einfach Copypackage com.dnkx.pojo an; import Java.util.hashMap; import Java.util.map; / ** * * Pagination Query Hilfsklasse * @author li xiaogui 9. November 2016 13:55:37 */ Public Class Seite { // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ PageBegin; // Startposition private int numcount; // Gesamtzahl der privaten int pagetotal; // Gesamtzahl der privaten String orderfield = ""; // Kontrolle der privaten String -OrderDirection auf der Sortierseite = ""; public page () {} public page (int pageSize, int pagecurrentPage) {Super (); this.PageSize = pageSize; this.PageCurrentPage = PageCurrentPage; } public page (map <String, String> map) {if (map.get ("pagenum")! if (map.get ("numperpage")! } if (map.get ("orderDirection")! }} public int getSpageCurrentPage () {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; } öffentliche statische Seite getPage (int pageSize, int pagecurrentPage) {Neue Seite zurückgeben (pageSize, pagecurrentPage); } öffentliche statische Seite getPage (Karte Karte) {neue Seite zurückgeben (Karte); }}Anrufmethode in Controller
public string list (httpServletRequest request) {long a = system.currentTimemillis (); Hashmap <String, Objekt> map = getRequestMap.getMap (Anforderung); // Die Methode selbst inkapituliert, nehmen Sie den Parameter der Anforderung Seite Seite = page.getPage (Karte); // Seitenkarte initialisieren. map.put (map.get ("orderfield")+"", map.get ("orderDirection"); List <Speoree> list = powerService.getListPage (MAP); Request.SetAttribute ("emlist", Liste); Request.SetAttribute ("Seite", Seite); Request.SetatTribute ("Karte", Karte); // Page verwandte Attribute page.getNumCount (); // Gesamtzahl der Seiten Seite.getPagetotal (); // Gesamtzahl der Seiten lang B = System.currentTimemillis (); System.out.println ("-------------- zeitaufwändig:"+(ba)+"ms"); Rückgabe "Basic/Employee_List"; }Konfigurieren Sie zum Schluss das Plug-In im Frühjahr
<bean id = "pageInterector"> < /bean> <!-Spring und MyBatis sind perfekt integriert, und es besteht keine Notwendigkeit einer myBatis-Konfigurationszuordnungsdatei-> <bean id = " value = "classPath: com/dnkx/maxPing/*. xml"> </property> <Eigenschaft name = "Plugins"> <ref bean = "pageInterector"/> </property> </bean>
Ok, das ist das Ende, dieser Artikel ist nur als Referenz! Ich freue mich auf den Rat des großen Gottes