So implementieren Sie die Paging-Funktion des MyBatis-Interceptors Vorwort: Lassen Sie uns zunächst über das Implementierungsprinzip sprechen. Verwenden Sie den Interceptor, um das ursprüngliche SQL abzufangen, fügen Sie dann die Schlüsselwörter und Attribute der Paging-Abfrage hinzu, fügen Sie sie zu einer neuen SQL-Anweisung zusammen und übergeben Sie sie zur Ausführung an mybatis. Außer dem Geschäftscode gibt es nicht viel zu schreiben, hier sind einige wichtige Punkte: 1. Paging-Objekt. Seitenklasse. Legen Sie zwei Parameter für das Objekt fest: die aktuelle Seitenzahl (vom Front-End angegeben) und die Gesamtzahl der Datensätze (im Interceptor zugewiesen). Dies hilft Ihnen bei der Berechnung der beiden in der Paging-SQL-Anweisung verwendeten Parameter. /** * Entity-Klasse, die der Paging-Funktion entspricht */ öffentliche Klasse Seite { /** * Gesamtzahl der Einträge*/ private int Gesamtzahl; /** * Aktuelle Seite */ private int aktuelleSeite; /** * Seiten gesamt*/ private int Gesamtseite; /** * Anzahl der Einträge pro Seite*/ private int Seitennummer = 5; /** * Der Grenzparameter in der Datenbank, ab dem der Eintrag übernommen werden soll*/ private int dbIndex; /** * Der Limit-Parameter in der Datenbank, wie viele Einträge insgesamt aufgenommen werden*/ private int dbNumber; /** * Berechnen und legen Sie zugehörige Attributwerte entsprechend den Attributwerten im aktuellen Objekt fest */ öffentliche Leere zählen() { // Gesamtzahl der Seiten berechnen int totalPageTemp = this.totalNumber / this.pageNumber; int plus = (diese.Gesamtzahl % diese.Seitenzahl) == 0 ? 0 : 1; Gesamtseitentemp = Gesamtseitentemp + plus; wenn(totalPageTemp <= 0) { Gesamtseitentemp = 1; } this.totalPage = Gesamtseitentemp; // Aktuelle Seitenzahl festlegen // Die Gesamtseitenzahl ist kleiner als die aktuelle Seitenzahl. Die aktuelle Seitenzahl sollte auf die Gesamtseitenzahl festgelegt werden, wenn (this.totalPage < this.currentPage) { diese.aktuelleSeite = diese.gesamteSeite; } // Wenn die aktuelle Seitenzahl kleiner als 1 ist, setze sie auf 1 wenn(diese.aktuelleSeite < 1) { diese.aktuelleSeite = 1; } //Grenzwertparameter festlegen this.dbIndex = (this.currentPage - 1) * this.pageNumber; diese.dbNummer = diese.seitenNummer; } öffentliche int getTotalNumber() { gib die Gesamtzahl zurück; } public void setTotalNumber(int totalNumber) { this.totalNumber = Gesamtzahl; dies.zählen(); } öffentliche int getCurrentPage() { aktuelleSeite zurückgeben; } öffentliche void setCurrentPage(int currentPage) { diese.aktuelleSeite = aktuelleSeite; } öffentliche int getTotalPage() { gib Gesamtseite zurück; } öffentliche void setTotalPage(int totalPage) { this.totalPage = Gesamtseite; } public int getPageNumber() { Seitennummer zurückgeben; } public void setPageNumber(int pageNumber) { this.pageNumber = Seitennummer; dies.zählen(); } öffentliche int getDbIndex() { gibt dbIndex zurück; } öffentliche Leere setDbIndex (int dbIndex) { dies.dbIndex = dbIndex; } öffentliche int getDbNumber() { gibt dbNumber zurück; } public void setzeDBNummer(int dbNummer) { diese.dbNummer = dbNummer; } } 2. Implementierung des Schlüssel-Interceptors Paket com.imooc.interceptor; importiere java.sql.Connection; importiere java.sql.PreparedStatement; importiere java.sql.ResultSet; importiere java.util.Map; importiere java.util.Properties; importiere org.apache.ibatis.executor.parameter.ParameterHandler; importiere org.apache.ibatis.executor.statement.StatementHandler; importiere org.apache.ibatis.mapping.BoundSql; importiere org.apache.ibatis.mapping.MappedStatement; importiere org.apache.ibatis.plugin.Interceptor; importiere org.apache.ibatis.plugin.Intercepts; importiere org.apache.ibatis.plugin.Invocation; importiere org.apache.ibatis.plugin.Plugin; importiere org.apache.ibatis.plugin.Signature; importiere org.apache.ibatis.reflection.DefaultReflectorFactory; importiere org.apache.ibatis.reflection.MetaObject; importiere org.apache.ibatis.reflection.SystemMetaObject; importiere com.imooc.entity.Page; /** * Paging-Blocker * * @Autor Skye * */ @Abfangt({ @Signature(Typ = StatementHandler.Klasse, Methode = "vorbereiten", Argumente = { Connection.Klasse, Integer.Klasse }) }) öffentliche Klasse PageInterceptor implementiert Interceptor { öffentliches Objekt abfangen (Aufruf Aufruf) wirft Throwable { StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, neue DefaultReflectorFactory()); MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement"); //Holen Sie sich die Methodennamen-ID über die MetaObject-Metadaten: com.XXX.queryMessageListByPage Zeichenfolge-ID = mappedStatement.getId(); //Passen Sie die Abfrage-ID an, die sich auf die in mybatis definierte Paging bezieht wenn (id.matches(".+ByPage$")) { //BoundSql enthält die ursprüngliche SQL-Anweisung und die entsprechenden Abfrageparameter BoundSql boundSql = statementHandler.getBoundSql(); Map<String, Objekt> params = (Map<String, Objekt>) boundSql.getParameterObject(); Seite Seite = (Seite) params.get("Seite"); : Zeichenfolge sql = boundSql.getSql(); Zeichenfolge countSql = "Wählen Sie count(*)aus (" + sql + ")a"; Verbindung Verbindung = (Verbindung) invocation.getArgs()[0]; Vorbereitete Anweisung countStatement = Verbindung.prepareStatement(countSql); ParameterHandler parameterHandler = (ParameterHandler) metaObject.getValue("delegate.parameterHandler"); ParameterHandler.setParameters(AnzahlAnweisung); Ergebnismenge rs = countStatement.executeQuery(); wenn (rs.next()) { //Warum getInt(1)? Weil die Spalten der Datentabelle bei 1 anfangen zu zählen page.setTotalNumber(rs.getInt(1)); System.out.println("Der Interceptor erfährt, dass die Gesamtzahl der Datensätze auf der Seite lautet: " + page.getTotalNumber()); } Zeichenfolge pageSql = sql + " limit " + page.getDbIndex() + "," + page.getDbNumber(); metaObject.setValue("delegate.boundSql.sql", pageSql); } Aufruf zurückgeben.fortfahren(); } /** * @param Ziel * Das abgefangene Objekt */ öffentliches Objekt-Plugin (Objektziel) { // Wenn die Interceptor-Klasse mit einem Unternehmen verglichen wird, das Tickets im Auftrag anderer kauft, dann ist dies der Agent, der Tickets im Auftrag anderer kauft (bevor er die Methode betritt, ist er ein Agent ohne die Fähigkeit, Tickets im Auftrag anderer zu kaufen, und nach dem Betreten wird er ein Agent mit der Fähigkeit, Tickets im Auftrag anderer zu kaufen) // Informationen zum Abfangziel durch Annotationen abrufen. Wenn es die Abfanganforderungen nicht erfüllt, geben Sie das ursprüngliche Ziel zurück. Wenn es die Anforderungen erfüllt, verwenden Sie einen dynamischen Proxy, um ein Proxy-Objekt zu generieren. return Plugin.wrap(target, this); } public void setProperties(Eigenschaften Eigenschaften) { // TODO Automatisch generierter Methodenstummel } } 3. Registrieren Sie Ihren eigenen Interceptor in mybatis-config.xml <!-- Angepasster Paging-Interceptor--> <Plugins> <plugin interceptor="Der vollständige Klassenname des von Ihnen geschriebenen Interceptors"> </plugin> </plugins> Die SQL-Anweisungen in der Datei mapper.xml, die sich auf die Dao-Ebene beziehen, müssen nicht geändert werden. 4. Das Frontend muss dem Backend einen Parameter geben, der angibt, welche Seite angezeigt werden soll. Nachdem die Abfrageparameter über die Serviceebene zusammengestellt wurden, werden sie an MyBatis übergeben, um die Paging-Daten abzufragen. Die von der von mir definierten Paging-DAO-Schnittstelle zurückgegebenen Daten sind eine Liste, die die Ergebnisse der Paging-Abfrage enthält. Das Frontend kann das Plug-In jquery_pagination verwenden, um die Seitennummerierung zu implementieren. Bitte gehen Sie zum offiziellen GitHub, um zu erfahren, wie Sie es einrichten. <!--Für die Seitennummerierung erforderliche Skripte--> <% // Anforderungskontext abrufen String context = request.getContextPath(); %> <link href="../css/pagination.css" rel="externes Nofollow" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="../js/jquery-1.11.3.js"></script> <script type="text/javascript" src="../js/jquery.pagination.js"></script> <Skripttyp="text/javascript"> //Aktion, die nach dem Klicken auf die Paginierungsschaltfläche ausgelöst wird function handlePaginationClick(new_page_index, pagination_container) { <!--Senden Sie die Parameter der aktuellen Seite aus dem stuForm-Formular. Sie können die restful-Methode verwenden, damit springmvc die durch das Schlüsselwort @PathVariable definierten Parameter zum Herstellen einer Verbindung verwendet. Diese beiden Parameter werden von der Paging-Steuerung selbst bereitgestellt, sodass wir sie nicht selbst finden müssen. Die Zählung beginnt jedoch bei 0 und unsere Hintergrund-Paging-Zählung beginnt bei 1, sodass wir 1 manuell hinzufügen müssen. --> $("#stuForm").attr("action", "Die von Ihnen definierte Paging-Abfrage-URL/"+(new_page_index+1)); $("#stuForm").einreichen(); gibt false zurück; } $(Funktion(){ $("#News-Pagination").pagination(${result.totalRecord}, { items_per_page:${result.pageSize}, // Wie viele Datensätze werden pro Seite angezeigt current_page:${result.currentPage} - 1, // Welche Datenseite wird aktuell angezeigt num_display_entries:8, // Anzahl der auf den Seiten angezeigten Einträge next_text:"Nächste Seite", prev_text: "Vorherige Seite", num_edge_entries:2, //Verbindung zum Paginierungstext herstellen, Anzahl der angezeigten Einträge callback:handlePaginationClick(aktuelle Seite, ID des Paginierungs-Divs), //Callback-Funktion ausgeführt load_first_page:false //Verhindert, dass die Seite ständig aktualisiert wird (das ist sehr wichtig!) }); }); </Skript> <!-- Dieser Teil verwendet das Tag c:forEach, um die Tabelle mit den Abfrageergebnissen auszudrucken--> <!--Name der Seitensteuerung--> <div id="News-Pagination"></div> Der Zweck dieser Zusammenfassung besteht darin, eine Gesamtlösung für die Paging-Funktion zu entwickeln (die sowohl das Front-End als auch das Back-End abdeckt). Ab dem 17. und 18. April werde ich ein kleines System schreiben, um das anzuwenden, was ich in der letzten Zeit gelernt habe. Danach werde ich zurückkommen, um die falschen Teile in diesem Artikel zu aktualisieren. Wenn Sie Fragen haben, hinterlassen Sie bitte eine Nachricht oder diskutieren Sie in der Community dieser Site. Vielen Dank fürs Lesen. Ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung dieser Site! Das könnte Sie auch interessieren:
|
<<: Detaillierte Konfiguration der drahtlosen Netzwerkkarte unter Ubuntu Server
>>: Implementierung der automatischen Konstruktionsweiterleitung von React
In diesem Artikel wird hauptsächlich der Stil der...
Dies ist ein Betrugsschema für Abstimmungswebsite...
Aus der Tomcat-Konfigurationsdatei können wir ers...
Ergebnisse erzielenImplementierungscode html <...
Inhaltsverzeichnis 1. Neues Projekt erstellen 2. ...
Nach der VIP-Konfiguration wird beim Aktiv/Standb...
Ohne auf JavaScript angewiesen zu sein, wird rein...
1. Verwenden Sie das Playbook von Ansible, um htt...
Aus einer Laune heraus habe ich eine Fallstudie ü...
Bei den tatsächlichen Projekten, an denen ich tei...
1. Das ul-Tag hat in Mozilla standardmäßig einen ...
Inhaltsverzeichnis Klassisches Beispiel für einen...
Der vollständige Name von SSH ist Secure SHell. D...
In diesem Artikel wird der spezifische Code von V...
Inhaltsverzeichnis Vorwort Problembeschreibung Ur...