Vorwort
Wenn Tabellen an der Webentwicklung wie DataTable beteiligt sind, erfolgt die Notwendigkeit von Paging. Normalerweise teilen wir die Paging-Methoden in zwei Typen auf: Front-End-Paging und Back-End-Paging.
Front-End-Pagination
Alle Datensätze (AJAX) in der Datentabelle werden gleichzeitig angefordert und dann am vorderen Ende zwischengespeichert und die Zähl- und Paging -Logik berechnet. Im Allgemeinen bieten Front-End-Komponenten (z. B. DataTable) Paging-Aktionen.
Funktionen sind: Einfach, sehr geeignet für kleine Webplattformen; Leistungsprobleme treten auf, wenn die Datenmenge groß ist und die Zeit für die Abfrage- und Netzwerkübertragung lang ist.
Backend -Pagination
Geben Sie die Seitennummer (Pagenum) und die Größe jeder Seite (pageSize) in der AJAX -Anforderung an. Der Backend querys die Daten der Seite und gibt sie zurück, und das Frontend ist nur für das Rendern verantwortlich.
Merkmale sind: komplexer; Der Performance -Engpass befindet sich in der Abfrageleistung von MySQL, die natürlich optimiert und gelöst werden kann. Im Allgemeinen verwendet Webentwicklung diese Methode.
Wir sprechen von Backend -Pagination.
MySQL -Unterstützung für Pagination
Einfach ausgedrückt, unterstützt MySQL Pagination durch Grenzklausel. Bitte beachten Sie das Beispiel unten.
Die Verwendung von Limit -Schlüsselwort ist
Begrenzen Sie [Offset,] Zeilen
Der Offset ist der Versatz relativ zur ersten Zeile (die erste Zeile ist 0), und Zeilen sind die Anzahl der Zeilen.
# Jede Seite enthält 10 Datensätze, nehmen Sie die erste Seite und senden Sie die ersten 10 Datensätze zurück, die * von Tablea Limit 0,10;# Jede Seite enthält 10 Datensätze, die zweite Seite übernommen und den 11. Datensatz zurückgeben, an den 20. Datensatz, ausgewählt * von Tablea Limit 10,10;
Was ich hier erwähnen möchte, ist, dass MySQL Pagination behandelt:
Begrenzen Sie 1000,10 - Filtern Sie 1010 Datenstücke aus, verwerfen Sie dann die ersten 1000 Stück und halten Sie 10 Teile. Wenn der Offset groß ist, nimmt die Leistung ab.
Begrenzen Sie 100000,10 - Filter 10W+10 Datenstücke und dann die ersten 10 -W -Stücke ab. Wenn Sie Leistungsprobleme in der Pagination finden, können Sie sie nach dieser Idee anpassen.
MyBatis Paging Plugin PageHelper
Bei der Verwendung von Java Spring Development ist MyBatis ein leistungsstarkes Tool für Datenbankoperationen. Beim Umgang mit Paging hat MyBatis jedoch keine besonderen Methoden. Im Allgemeinen müssen Sie die Limit -Klausel selbst schreiben, um sie zu implementieren, was relativ teuer ist. Glücklicherweise gibt es ein PageHelper -Plugin.
1. POM -Abhängigkeit
Ich werde die Konfiguration von MyBatis nicht erwähnen. Die Abhängigkeiten von PageHelper sind wie folgt. Wenn Sie eine neue Version benötigen, können Sie auf Maven wählen
<Depopenty> <gruppe> com.github.pageHelper </Groupid> <artifactId> PageHelper </artifactId> <version> 4.1.4 </Version> </abhängig>
2. MyBatis -Konfiguration von PageHelper
Öffnen Sie die MyBatis -Konfigurationsdatei, normalerweise unter dem Ressourcenpfad. Mein Name ist mybatis-config.xml.
<? Mapper aktivieren oder deaktivieren Cache. -> <Einstellung name = "CacheEnabled" value = "true"/> <!-Aktivieren oder deaktivieren Sie das faule Laden global. Bei deaktivierter Deaktivierung werden alle zugeordneten Objekte sofort geladen. -> <Einstellung name = "LazyLoadingInabled" value = "true"/> <!-Wenn ein Objekt mit einer faulen Ladeeigenschaft eine Eigenschaft lädt, wenn sie aufgerufen wird. Andernfalls wird jede Eigenschaft nach Bedarf geladen. -> <Einstellung name = "AggresivInAnyLoading" value = "true"/> <!-ob ein einzelner SQL zulässt, mehrere Datensätze zurückzugeben (abhängig von der Kompatibilität des Treibers) Standard: true-> <Einstellungsname = "MultipleresulatsetSenable" Value = "True"/> <! name = "usecolumnLabel" value = "true"/> <!- Ermöglichen Sie JDBC, Primärschlüssel zu generieren. Der Antriebsunterstützung ist erforderlich. Wenn diese Einstellung auf True gesetzt wird, erzwingt diese Einstellung den generierten Primärschlüssel, einige Laufwerke sind inkompatibel, können jedoch weiterhin ausgeführt werden. Standard: Falsch-> <Einstellung name = "useGeneratedKeys" value = "true"/> <!-Geben Sie an, wie mybatis automatisch Spalten der Datenbasistabelle kartiert. Nicht verdecken: Teil voll: Alle-> <Einstellungsname = "AutomappingBehavior" value = "partiell"/> <! Wiederholen Sie Anweisungen und Batch-Updates)-> <Einstellung Name = "DefaultExecUtortype" Value = "Simple"/> <!-Felder mit Camel-Nomenklatur konvertieren. -> <Einstellung name = "MAPUNDERSCORETOCAMELCASE" value = "true"/> <!-Setzen lokaler Cache-Reichweite Sitzung: Es gibt Datenfreigabe-Anweisung: Anweisung Scope (dies ist keine Datenfreigabe) Defalut: Sitzung-> <Seting Name = "Localcachescope" Value = "Session"/> <! Geben Sie beim Einfügen eines Nullwerts ein -> <Einstellenname = "JdbctypeFornull" value = "null"/> </Einstellungen> <Plugins> <Plugin Interceptor = "com.github.pageHelper.PageHelper"> <Eigenschaft name = "Dialekt" value = "mySQL"/> <Eigenschaftsname "OffsetaStaRe". name="rowBoundsWithCount" value="false"/> <property name="pageSizeZero" value="true"/> <property name="reasonable" value="false"/> <property name="supportMethodsArguments" value="false"/> <property name="returnPageInfo" value="none"/> </plugin></plugins></configuration>
Was Sie hier beachten müssen, ist die Konfiguration im Zusammenhang mit PageHelper.
Wenn Sie die MyBatis -Konfigurationsdatei nicht laden, verwenden Sie die MyBatis -Standardkonfiguration. Wie lade ich die MyBatis -Konfigurationsdatei?
Gehen Sie zu Ihrer Datenrouce -Konfiguration.
Geben Sie bei der Konfiguration von SQLSessionFactory die MyBatis -Kernkonfigurationsdatei und den Mapper -Pfad an, der Code ist wie folgt
@Bean (name = "mondlightsqlSessionFactory") @primary public SQLSessionFactory MoonLightSQLSessionFactory (@Qualifier ("mondlightData") dataSource dataSource ausnahms {SQLSessionFactoryBean Bean = new sqlSessionFactoryBeanBean (); Bean.setDataSource (DataSource); Bean.setMapperLocations (neuer PathMatchingResourcePenNResolver (). GetResources ("ClassPath: MyBatis-Mapper/*. xml")); Bean.setConfigLocation (neuer classpathresource ("mybatis-config.xml")); return bean.getObject (); }veranschaulichen:
Der hier konfigurierte Speicher des mapper.xml-Speichers befindet sich im Ordner ressourcen-/mybatis-mapper
Die hier konfigurierte mybatis-config.xml-Datei befindet sich unter Ressource/
3. Pagination
Bereiten Sie einen mapper.xml vor, schreiben Sie einfach einen für den Test und verwenden Sie einfach eines aus dem Projekt.
Diese Abfrage hier ist eine typische Multi-Konditions-Abfrage. Was wir tun müssen, ist, die Datensätze zu pagieren, die mit mehreren Bedingungen übereinstimmen.
<? namespace = "com.kangaroo.studio.moonlight jdbctype = "Integer" /> <arg column = "name" javatype = "java.lang.string" jdbctype = "varchar" /> <arg column = "Typ" javatype = "java.lang.Integer" jAvtype = "integer" /> <args -column = "javaN =" JavaGer = " /> <arg" /> <arg " /> <arg" /> <arg " /> <arg" /> <args " /> <arg" /> <arg " /> <args" /> <args " />" /> " />" /> " />" /> " />" /> " />" /> " />" /> " />" -Slace "-Gruppe". jdbcType="VARCHAR" /> <arg column="geo" javaType="java.lang.String" jdbcType="VARCHAR" /> <arg column="createTime" javaType="java.lang.String" jdbcType="VARCHAR" /> <arg column="updateTime" javaType="java.lang.String" jdbctype = "varchar"/> </constructor> </resultMap> <sql id = "base_column"> id, name, type, `gruppe, geo, createtime, updatetime </sql> <select id =" querygeofence "parametertype resultMap = "Geofencelist"> SELECT <include refID = "Base_Column"/> Aus Geofence wobei 1 = 1 <if test = "Typ! = null"> und type = #{Typ} </if test = "name! concat ('%', #{Group}, '%') </if> <if test = "startTime!Schreiben Sie entsprechende Methoden in die Schnittstelle mapper.java
Liste <Geofence> Querygeofence (Geofencequeryparam Geofencequeryparam);
Fügen Sie zuerst den Seitencode hinzu und erläutern Sie ihn später später
@RequestMapping(value = "/fence/query", method = RequestMethod.POST) @ResponseBody public Response queryFence(@RequestBody GeoFenceQueryParam geoFenceQueryParam) { try { Integer pageNum = geoFenceQueryParam.getPageNum()!=null?geoFenceQueryParam.getPageNum():1; Integer pageSize = GeofenceQueryparam.getPageSize ()! = Null? Geofencequeryparam.getPageSize (): 10; PageHelper.StartPage (pagenum, pageSize); Liste <Geofence> list = mondlightMapper.Querygeofence (GeofenceQueryparam); Neue Antwort zurückgeben (resultcode.success, "Abfragegeofence -Erfolg", Liste); } catch (Ausnahme e) {logger.Error ("Abfragegeofence fehlgeschlagen", e); Neue Antwort zurückgeben (resultcode.exception, "Abfragegeofence fehlgeschlagen", null); }}veranschaulichen:
1. Der Vorteil von PageHelper besteht darin, dass Pagination und Mapper.xml vollständig entkoppelt sind. Die Implementierungsmethode besteht darin, den MyBatis-Ausführungsprozess in Form eines Plug-Ins zu stärken und die Gesamtzahl- und Begrenzungsabfragen hinzuzufügen. Gehört zur physischen Seite.
2. Es gibt ein Sicherheitsproblem, auf das Sie achten müssen. Andernfalls kann dies zu einer Paging -Störung führen. Ich habe hier direkt eine Passage aus diesem Blog eingefügt.
4. Wann wird es zu unsicherem Paging führen?
Die PageHelper -Methode verwendet einen statischen ThreadLocal -Parameter, und die Paging -Parameter und -Threads sind gebunden.
Solange Sie sicherstellen können, dass die PageHelper -Methode unmittelbar gefolgt von der MyBatis -Abfragemethode aufgerufen wird, ist dies sicher. Weil PageHelper das ThreadLocal -gespeichertes Objekt automatisch im endgültigen Snippet löscht.
Wenn eine Ausnahme vor dem Eintritt in den Testamentsvollstrecker auftritt, ist der Thread nicht verfügbar, was ein menschlicher Fehler ist (z. Diese Situation führt nicht dazu, dass der ThreadLocal -Parameter aufgrund der Nichtverfügbarkeit des Threads falsch verwendet wird.
Wenn Sie jedoch den folgenden Code schreiben, handelt es sich um eine unsichere Verwendung:
PageHelper.StartPage (1, 10); List <Country> list; if (param1! = Null) {list = countryMapper.Selectif (param1);} else {list = new ArrayList <Couth> ();};}In diesem Fall erzeugt PageHelper, da Param1 null ist, einen Paging -Parameter, aber nicht verbraucht, und dieser Parameter bleibt in diesem Thread. Wenn dieser Thread erneut verwendet wird, kann er Methoden verursachen, bei denen keine Paging die Paging -Parameter konsumieren sollten, was zu unerklärlichem Paging führt.
Der obige Code sollte wie folgt geschrieben werden:
List <Country> Liste; if (param1! = Null) {pageHelper.startPage (1, 10); list = CountryMapper.Selectif (param1);} else {list = new ArrayList <Couth> ();}Diese Art des Schreibens kann Sicherheit gewährleisten.
Wenn Sie sich damit nicht wohl fühlen, können Sie die in ThreadLocal gespeicherten Paging -Parameter manuell aufräumen, die so verwendet werden können:
List <Country> Liste; if (param1! = Null) {pageHelper.startPage (1, 10); try {list = comansmapper.SelectAll (); } endlich {pageHelper.clearPage (); }} else {list = new ArrayList <Country> ();}Es ist nicht gut, so zu schreiben, und es ist nicht notwendig.
Zusammenfassen
Das obige ist die Konfiguration und die einfache Verwendungsmethode des MyBatis Paging Plugin PageHelper, das Ihnen vom Editor vorgelegt wurde (empfohlen). Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!