Hinweis: Dieser Blog unterscheidet sich völlig vom aktuellen Paging-Plug-In. Daher wird empfohlen, den neuesten Quellcode und die neuesten Dokumentation über die oben genannte Projektadresse zu überprüfen, um sie zu verstehen.
Ich habe mich schon einmal Sorgen um die MyBatis -Pagination -Abfrage gemacht und habe online nach vielen verwandten Artikeln gesucht, aber ich habe den letzten nicht verwendet. Der PAGED -Platz ist mit SQL und Count SQL komplett handgeschrieben, was sehr problematisch ist.
Später, für eine Weile wollte ich eine Paginationsimplementierung aus MyBatis schreiben. Ich habe eine Implementierung für Languagedriver geschrieben. Es gibt kein Problem mit der automatischen Pagination, aber die Gesamtzahl der Abfragen (Zählungen) kann immer noch nicht zu einer Zeit gelöst werden, und es wurde ungelöst.
Vor kurzem muss ich Pagination erneut verwenden. Aus Gründen der Bequemlichkeit muss ich eine allgemeine Paginierungsklasse schreiben, also beziehe ich mich wieder auf die meisten MyBatis -Paginierungscodes im Internet.
Tatsächlich hat vor langer Zeit jemand die Quellimplementierung auf Github geöffnet und MySQL, Oracle und SQLServer unterstützt, das der obigen Referenz ähnelt und eine umfassendere Überlegung hat. Aber ich denke, zu viele Klassen sind zu problematisch, daher habe ich eine Klasse mit nur einem Interceptor implementiert, der tatsächlich in zwei Klassen unterteilt werden kann. Eine der Klassen wurde von mir als statische Klasse geschrieben und in den Interceptor platziert. Sie können auch die Seitenklasse extrahieren, um die Verwendung von Seite zu erleichtern.
Sprechen wir zuerst über die Implementierungsmethode. Dieses Plugin hat nur eine Klasse: pageHelper.java
Die Interceptor -Signatur lautet:
@Intercepts ({ @Signature (type = ansageHandler.class, method = "prepe", args = {connection.class}), @signature (type = resultStHander.class, method = "Handleresultsets", args = {Anweisung.class})})Die Signatur hier ist entscheidend für die gesamte Implementierung und Idee. Zunächst fange ich die Vorbereitung der Pagination SQL ab und mache Zählabfrage. Dann fasse ich die Handleresultsets -Methode ab, um das letzte Verarbeitungsergebnis zu erhalten und das Ergebnis in das Seitenobjekt einzulegen.
Im Folgenden ist der Code, der die Seite ändern kann, eine Änderung für Oracle -Daten. Wenn Sie andere Datenbanken verwenden, können Sie den Code hier selbst ändern.
/ ** * Ändern Sie die ursprüngliche SQL in Pagination SQL * @param SQL * @param Seite * @return */ private String buildpagesql (String SQL, Seite) {StringBuilder pagesql = new StringBuilder (200); PAGESQL.Append ("SELECT * aus (SELECT TEMP. *, Rownum row_id von ("); Pagesql.And (SQL); Pagesql.Append (") Temp, wo rownum <=") .Append (page.getendrow ()); pagesql.append (");); return pagesql.toString (); } In der folgenden SetPageParameter -Methode muss dann eine ausgewählte Zählanweisung gemäß dem Datenbanktyp geändert werden:
// Gesamtzahl der Datensätze String countSQL = "Wählen Sie die Anzahl (0) aus (" + sql + ")";Warum biete ich keine Unterstützung für verschiedene Datenbanken? Ich denke nicht, dass es notwendig ist. Einige Datenbanken unterstützen Paging nicht und je einfacher dieses Plugin ist, desto einfacher ist es für Entwickler, zu verstehen und zu ändern. Es ist definitiv kein Problem, es in die Paginierungsanfrage zu ändern, die Sie benötigen.
Schließlich wird der vollständige Code hinzugefügt (weiter lesen, es gibt auch die Verwendungsmethode unten): (Klicken Sie hier, um herunterzuladen).
Paket com.mybatis.util; import org.apache.ibatis.executor.parameter.ParameterHandler; 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.*; import org.apache.ibatis.reflection.metaObject; import org.apache.ibatis.reflection.SystemmetaObject; import org.apache.ibatis.scripting.defaults.defaultParameterHandler; import org.apache.log4j.logger; Java.sql.*importieren; importieren java.util.list; Import Java.util.Properties; /*** MyBatis-Universal Pagination Interceptor* @Author Liuzh/Abel533/ISEA* Erstellt von Liuzh am 14-4-15. */ @Intercepts ({ @Signature (type = StatementHandler.class, method = "vorbereiten", args = {connection.class}), @Signature (type = resultStHandler.class, method = "Handleresultssets", args = {Static.classe})}) public class implementiert Interceptor {private static logger logger logger Logger.getLogger (pageHelper.class); public static Final ThreadLocal <Page> localPage = new ThreadLocal <page> (); / ** * Paging * @param pagenum * @param pageSize */ public static void startpage (int pagenum, int pageSize) {localPage.set (neue Seite (pagenum, pageSize)); } /*** Beenden Sie das Paging und geben Sie das Ergebnis zurück. Die Methode muss aufgerufen werden, andernfalls wird LocalPage bis zur nächsten Startpage * @Return */ public static Page EndPage () {Page page = localPage.get (); localPage.remove (); Rückgabeseite; } @Override public Object Intercept (Invocation Invocation) löscht Throwable {if (localPage.get () == null) {return Invocation.Procece (); } if (invocation.gettarget () InstanceOf AnweisungHandler) {AnweisungHandler AnweisungHandler = (BemerkungsHandler) invocation.gettarget (); MetaObject metastatementHandler = systemmetaObject.forObject (StatementHandler); // trennen Sie die Proxy -Objektkette (da die Zielklasse von mehreren Interceptors abgefangen werden kann, wird mehrere Proxying gebildet und die folgenden zwei Loops // Die primitivste Zielklasse können getrennt werden) wob metastatementHandler = systemMetaObject.forObject (Objekt); } // Die Zielklasse, die das letzte Proxy -Objekt trennen (metastatementHandler.hasger ("Ziel")) {Object Object = metastatementHandler.getValue ("Ziel"); metastatementHandler = systemMetaObject.forObject (Objekt); } MADPDStatement MapChdStatement = (MapChedStatement) metastatementHandler.getValue ("delegate.mappedStatement"); // Seiteninformationen if (localPage.get ()! = Null) {page page = localPage.get (); BoundSQL boundSQL = (boundSQL) metastatementHandler.getValue ("delegate.boundSQL"); // Page Parameter als Eigenschaft von ParameterObject ParameterString SQL = bodensql.getSQL (); // SQL String pagesql = Buildpagesql (SQL, Seite) neu schreiben; // Paging SQL MetastatementHandler.SetValue ("delegate.boundsql.sql", Pagesql) neu schreiben; Connection Connection = (Verbindung) Invocation.getargs () [0]; // Die Gesamtzahl der Seiten in den Paging -Parametern usw. zurücksetzen usw. setPageParameter (SQL, Verbindung, Kartentatement, BoundSQL, Seite); // Übergeben Sie die Ausführungsrechte an den nächsten Interceptor -Return -Aufruf. } else if (invocation.gettarget () InstanceOf resultStHander) {Object result = Invocation.Procece (); Seite Seite = localPage.get (); Page.SetResult ((Liste) Ergebnis); Rückgabeergebnis; } return null; } / ** * Schnitt nur diese beiden Arten von * AnweisungHandler * resultStHandler * @param target * @return * / @Override öffentliches Objekt -Plugin (Objektziel) {if (Zielinstanz von AnweisungHandler || Zielinstanz resultSthandler) {return plugin.wrap (target, this); } else {return target; }} @Override public void setProperties (Eigenschaften Eigenschaften) {} / ** * Ändern Sie die ursprüngliche SQL, um SQL * @param SQL * @param Seite * @return * / private String buildpagesql (String SQL, Seite) {Stringbuilder Pagesql = new Stringbuilder (200); PAGESQL.Append ("SELECT * aus (SELECT TEMP. *, Rownum row_id von ("); Pagesql.And (SQL); Pagesql.Append (") Temp, wo rownum <=") .Append (page.getendrow ()); pagesql.append (");); return pagesql.toString (); } / ** * Erhalten Sie die Gesamtzahl der Datensätze * @param SQL * @param Connection * @param MadPedStatement * @param bodenSQL * @param Seite * / private void setPageParameter (String SQL, Verbindungsverbindung, Mattestatement MappedStatement, boundsql, salesql, 0). ")"; PrepedStatement countstmt = null; ResultSet rs = null; try {countstmt = connection.preparestatement (countSQL); BodernSQL countbs = new boundSQL (MapChdStatement.getConfiguration (), countSQL, boundSQL.getParameterMappings (), boundsql.getParameterObject ()); setParameters (countstmt, kartierstatement, countbs, bodersql.getParameterObject ()); rs = countstmt.executeQuery (); int totalCount = 0; if (rs.Next ()) {TotalCount = rs.getint (1); } page.settotal (totalCount); Int TotalPage = TotalCount / Page.getPageSize () + ((TotalCount % Page.getPageSize () == 0)? 0: 1); Page.SetPages (Gesamtseite); } catch (sqlexception e) {logger.Error ("Ignorieren Sie diese Ausnahme", e); } endlich {try {rs.close (); } catch (sqlexception e) {logger.Error ("Ignorieren Sie diese Ausnahme", e); } try {countstmt.close (); } catch (sqlexception e) {logger.Error ("Ignorieren Sie diese Ausnahme", 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 (kartierstatement, parameterObject, boundSQL); ParameterHandler.SetParameters (PS); } / ** * Beschreibung: Pagination * Autor: Liuzh * Update: Liuzh (2014-04-16 10:56) * / Public Static Class Page <e> {private int pagenum; private int pagesize; private int Startrow; Privat int Endrow; private lange Gesamtzahl; private int Seiten; private Liste <e> Ergebnis; öffentliche Seite (int pagenum, int pageSize) {this.pagenum = pagenum; this.PageSize = pageSize; this.starTrow = pagenum> 0? (pagenum - 1) * pageSize: 0; this.endrow = pagenum * pageSize; } public List <E> getResult () {Rückgabeergebnis; } public void setResult (list <e> Ergebnis) {this.Result = Ergebnis; } public int getsPages () {Rückgabeseiten; } public void setPages (int pages) {this.pages = Seiten; } public int getSendRow () {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 pageSize; } public void setPageSize (int pageSize) {this.pageSize = pageSize; } public int getStarTrow () {return startertrow; } public void setStarTrow (int startertrow) {this.starTrow = startertrow; } public long gettotal () {return insgesamt; } public void settotal (langer Gesamt) {this.total = Total; } @Override public String toString () {return "Seite {" + "pagenum =" + pagenum + ", pageSize =" + pageSize + ", starter =" + startrow + ", endrow =" + endrow + ", Total =" + Total + ", Pages =" + Seiten + '}'; }}} Um diesen Interceptor zu verwenden, müssen Sie zunächst den Interceptor in der MyBatis -Konfiguration konfigurieren:
<Plugins> <Plugin interceptor = "com.mybatis.util.PageHelper"> </plugin> </plugins>
Bei der Konfiguration eines Interceptors müssen Sie auf die Position von Plugins achten. Die Reihenfolge der Plugins lautet wie folgt:
Eigenschaften?, Einstellungen?, TypeAliase?, Typhandler?, ObjectFactory?, ObjectWrapperFactory?, Plugins?
Schließlich gibt es den Beispielcode (Service Layer), der diese Methode aufruft:
@Override public pageHelper.page <sysLoginLog> findSysLoginLog (String -Loginip, String -Benutzername, String logindate, String exitdate, String -Loggerr, int pageNumber, int pagesize) löscht BusinessException {pageHelper.StartPage (Pagenumber, viert, vagessizend); sysloginLogmapper.findsysLoginLog (Loginip, Benutzername, Logindat, exitdate, lanr); return pagehelper.endPage (); }Aus dem obigen können wir sehen, dass die Verwendung dieses Plug-Ins sehr einfach ist. Sie müssen nur die Startpage- und End -Sitemethoden von PageHelper vor und nach der Abfrage verwenden. Das Anrufergebnis des Zwischencodes ist bereits im Ergebnis von PageHelper vorhanden. Wenn Sie PageHelper an einem Ort anrufen, an dem ein Ergebnis zurückgegeben wird, ist das zurückgegebene Ergebnis immer noch eine Liste, und Sie können einfach den ersten Wert nehmen (ich denke, niemand wird es an diesem Ort so verwenden, natürlich gibt es auf diese Weise keinen Fehler).
Darüber hinaus werden alle MyBatis -Codes zwischen Startpage und Endseite paginiert, und PageHelper behalten nur das letzte Ergebnis. Wenn Sie es verwenden, müssen Sie daher sicherstellen, dass nur eine MyBatis -Abfrage gleichzeitig ausgeführt wird. Wenn es mehrere Paging gibt, verwenden Sie bitte mehrmals Startpage und Endseite.
Da hier nur Oracle -Implementierungen bereitgestellt werden, hoffe ich, dass Leser, die sich auf andere Datenbanken verweisen, die von diesem Paging -Plugin implementiert werden, auch den entsprechenden Code offen offen sein können.
Projektadresse: http://xiazai.vevb.com/201612/yuanma/mybatis_pageHelper_jb51.zip
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.