Préface
Lorsque les tableaux sont impliqués dans le développement Web, tels que DataTable, le besoin de pagination se produira. Habituellement, nous divisons les méthodes de pagination en deux types: la pagination frontale et la pagination arrière.
Pagination frontale
Tous les enregistrements (AJAX) dans le tableau de données sont demandés à un moment donné, puis mis en cache sur l'extrémité frontale et la logique de comptage et de pagination calculée. Généralement, les composants frontaux (tels que DataTable) fourniront des actions de pagination.
Les fonctionnalités sont: Simple, très adapté aux plates-formes Web à petite échelle; Des problèmes de performances surviendront lorsque la quantité de données est importante et le temps de transmission de requête et de réseau sera long.
Pagination backend
Spécifiez le numéro de page (Pagenum) et la taille de chaque page (PageSize) dans la demande AJAX. Le backend interroge les données de la page et les renvoie, et le frontend n'est responsable que du rendu.
Les caractéristiques sont: plus complexes; Le goulot d'étranglement des performances est dans les performances de la requête de MySQL, qui peuvent bien sûr être optimisées et résolues. D'une manière générale, le développement Web utilise cette méthode.
Nous parlons de pagination backend.
MySQL Soutien pour la pagination
Autrement dit, MySQL prend en charge la pagination via la clause limite. Veuillez consulter l'exemple ci-dessous.
L'utilisation du mot-clé limite est
Limiter [décalage,] lignes
Le décalage est le décalage par rapport à la première ligne (la première ligne est 0), et les lignes sont le nombre de lignes.
# Chaque page a 10 enregistrements, prenez la première page et renvoyez les 10 premiers enregistrements Sélectionner * dans Tablea Limit 0,10; # Chaque page a 10 enregistrements, prendre la deuxième page et retourner le 11e enregistrement, au 20e enregistrement, sélectionner * dans Tablea Limit 10,10;
Ce que je veux mentionner ici, c'est que lorsque MySQL gère la pagination:
Limitez 1000,10 - Filtrez 1010 éléments de données, puis jetez les 1000 premiers pièces et conservez 10 pièces. Lorsque le décalage est important, les performances diminueront.
Limite 100000,10 - Filtrera 10W + 10 éléments de données, puis jetez les 10 premiers pièces. Si vous trouvez des problèmes de performances dans la pagination, vous pouvez les ajuster en fonction de cette idée.
Mybatis Paging Plugin Pagehelper
Lorsque vous utilisez Java Spring Development, MyBatis est un outil puissant pour les opérations de base de données. Cependant, lorsqu'il s'agit de la pagination, Mybatis n'a pas de méthodes spéciales. Généralement, vous devez écrire vous-même la clause limite pour la mettre en œuvre, ce qui est relativement coûteux. Heureusement, il y a un plugin Pagehelper.
1. Dépendance des pom
Je ne mentionnerai pas la configuration de MyBatis. Les dépendances de Pagehelper sont les suivantes. Si vous avez besoin d'une nouvelle version, vous pouvez choisir Maven
<dependency> <proupId> com.github.pagehelper </rompuprid> <ErtingActid> PageHelper </ artifactid> <in version> 4.1.4 </ version> </Dependance>
2. Configuration mybatis de Pagehelper
Ouvrez le fichier de configuration MyBatis, généralement sous le chemin de la ressource. Je m'appelle Mybatis-Config.xml.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Configuration public "- // mybatis.org//dtd config 3.0 // en" "http://mybatis.org/dtd/mybatis-3config.dtd"><configuration><! Mappeur Activer ou désactiver le cache. -> <setting name = "cacheenabled" value = "true" /> <! - Activer ou désactiver le chargement paresseux globalement. Lorsqu'ils sont désactivés, tous les objets associés sont chargés instantanément. -> <paramètre name = "LazyLoadingEnabled" value = "true" /> <! - Lorsque vous êtes activé, un objet avec une propriété de chargement paresseux chargera entièrement n'importe quelle propriété lorsqu'elle sera appelée. Sinon, chaque propriété sera chargée au besoin. -> <paramètre name = "AggressIveLyloading" value = "true" /> <! - que ce soit pour permettre à un seul SQL de renvoyer plusieurs ensembles de données (en fonction de la compatibilité du pilote) par défaut: true -> <paraming name = "MultipleResulTSetsEnty" Value = "true" /> <! - If alias for Columns peut être utilisé (en fonction de la compatibilité du pilote) par défaut) name = "usecolumnLabel" value = "true" /> <! - Autoriser JDBC à générer des clés primaires. La prise en charge du lecteur est requise. Si elle est définie sur true, ce paramètre forcera la clé primaire générée, certains disques sont incompatibles mais peuvent toujours être exécutés. Par défaut: false -> <setting name = "useGeneratedKeys" value = "true" /> <! - Spécifiez comment MyBatis cartose automatiquement les colonnes de la table de base de données: non obscurcie partielle: partie complète: all -> <setting name = "automappingbehavior" value = "partial" /> <! - Il s'agit du type d'exécution par défaut (Simple: Repeuse: Repeuse: L'exécuteur peut réutiliser les states préparés; Instructions et mises à jour par lots) -> <paramètre name = "defaultExeCutOrType" value = "Simple" /> <! - Converti les champs à l'aide de Camel Nomenclature. -> <paramètre name = "MapundersCoretOcamelCase" value = "true" /> <! - Définition de la plage de cache locale Session: il y aura une instruction de partage de données: étendus de l'instruction (ce ne sera pas le partage de données) Defalute: Session -> <setting name = "localCachescope" value = "session" /> <! - Définition mais le type JDBC est vide, certains conducteurs doivent spécifier la valeur, par défaut: autrement, et il n'y a pas de spécification pour être vide pour être vide pour être vide pour Specif Insertion d'une valeur null -> <paramètre name = "JDBCTYPEFORNLL" Value = "NULL" /> </ Settings> <Glugins> <Plugin interceptor = "com.github.pagehelper.pagehelper"> <property name = "dialect" value = "mysql" /> <propriété name = "offsetaspagenem" value = "false" /> <wewBoundswithCoundswith " value = "false" /> <propriété name = "pageSizezero" value = "true" /> <propriété name = "raisonnable" value = "false" /> <propriété name = "supportMethodsarguments" value = "false" /> <propriété name = "returnPageInfo" value = "nul" /> </ plugin> </ plugins> </ configuration>
Ce à quoi vous devez faire attention ici, c'est la configuration liée à PageHelper.
Si vous ne chargez pas le fichier de configuration MyBatis, vous utilisez la configuration par défaut MyBatis. Comment charger le fichier de configuration MyBatis?
Accédez à votre configuration DataSrouce.
Lors de la configuration de SQLSessionFactory, spécifiez le fichier de configuration du noyau MyBatis et le chemin du mappeur, le code est le suivant
@Bean (name = "MoonlightsqLSessionFactory") @primary public sqlSessionFactory MoonLightsQLSessionFactory (@qualifier ("MoonLightData") DataSource DataSource) lance l'exception {SqlSessionFactoryBean Bean = New SqlSessionFactoryBean (); bean.setDataSource (dataSource); bean.setMapperLocations (new PathMatchingResourcePatterNResolver (). getResources ("classPath: mybatis-mapper / *. xml")); bean.setConfiglocation (new ClassPathResource ("MyBatis-Config.xml")); return bean.getObject (); }illustrer:
Le chemin de stockage MAPPER.xml configuré ici est dans le dossier Resource / Mybatis-Mapper
Le fichier mybatis-config.xml configuré ici est sous Resource /
3. Pagination
Préparez un mappeur.xml, écrivez-en un pour le test, utilisez simplement un du projet.
Cette requête ici est une requête multi-conditionnement typique. Ce que nous devons faire, c'est paginer les enregistrements correspondant à plusieurs conditions.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Mappep Public "- // Mybatis.org//dtd Mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><Mapper namespace = "com.kangaroo.studio.moonlight.dao.mapper.moonlightmapper"> <resultmap id = "geofencest" type = "com.kangaroo.studio.moonlight.dao.model.geofence"> <constructor> <idarg colonnes = "id" javatype = "java.lang.integer" jdbcType = "Integer" /> <arg colonnen = "name" javatype = "java.lang.string" jdbcType = "varchar" /> <arg colonnen = "type" javatype = "java.lang.integer" jdbcType = "Integer" /> <argmonned = "groupe" javatype = "java. jdbcType = "varchar" /> <arg colonnen = "geo" javatype = "java.lang.string" jdbcType = "varchar" /> <arg colonnen = "CreateTime" javatype = "java.lang.string" jdbcType = "varchar" /> <arg Column = "TOUTHATETime" javatype = "java.lang.string" jdbcType = "varchar" /> </ constructor> </sultMap> <sql id = "base_column"> id, name, type, `groupe`, geo, createtime, uptetetime </ql> <select id =" QueryGeofence " paramètreType = "com.kangaroo.studio.moonlight.dao.model.geofeSeryParam" resultMap = "GeoFenest"> SELECT <inclure refid = "base_column" /> from geofence where 1 = 1 <if test = "type! = null"> et type = # {type} </ if> <if Test = "name! = nul" concat ('%', # {name}, '%') </ if> <if test = "groupe! = null"> et `groupe` like concat ('%', # {groupe}, '%') </ if> <if test =" starttime! = null "> and createtime> = # {starttime} </ if> <if test =" finm! = null "> et crareetime <= # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #) </ if> </lect> </ mapper>Écrivez des méthodes correspondantes dans l'interface Mapper.java
LISTE <GEOFENCE> QueryGeoFence (Geofefequeryparam GeofeenceQueryparam);
D'abord, ajoutez le code de la page, puis expliquez-le plus tard
@Requestmapping (value = "/ clôture / query", méthode = requestMethod.post) @ResponseBody Public Response QueryFence (@Requestbody GeofeSequeryParam GeofeSequeryParam) {Try {Integer Pagenum = GeofeSegenqueryParam.getPagenum ()! = NULL? Integer pagesize = geofeSqueryParam.getPageSize ()! = NULL? GeofeSemeryParam.getPageSize (): 10; PageHelper.StartPage (Pagenum, PageSize); List <GeoFence> list = MoonLightMapper.QueryGeoFence (GeoFenceQueryParam); Renvoie une nouvelle réponse (resultCode.success, "requête GeoFence Success", liste); } catch (exception e) {Logger.Error ("Query GeoFence a échoué", e); return new Response (resultCode.Exception, "Query GeoFence a échoué", null); }}illustrer:
1. L'avantage de Pagehelper est que la pagination et le mapper.xml sont complètement découplés. La méthode d'implémentation consiste à renforcer le processus d'exécution MyBatis sous la forme d'un plug-in, ajoutant le nombre total et limiter les requêtes. Appartient à la page physique.
2. Il y a un problème de sécurité auquel vous devez prêter attention, sinon cela peut entraîner un trouble de la pagination. J'ai directement collé un passage de ce blog ici.
4. Quand cela conduira-t-il à une pagination dangereuse?
La méthode PageHelper utilise un paramètre threadlocal statique et les paramètres et threads de pagination sont liés.
Tant que vous pouvez vous assurer que la méthode PageHelper est appelée immédiatement suivie de la méthode de requête MyBatis, c'est sûr. Parce que PageHelper efface automatiquement l'objet stocké ThreadLocal dans l'extrait enfin.
Si une exception se produit avant d'entrer à l'exécuteur, le thread ne sera pas disponible, ce qui est un bug humain (comme un décalage entre la méthode d'interface et le XML, ce qui conduira au statement cartographié qui ne sera pas trouvé). Cette situation ne produira pas de manière incorrecte le paramètre threadlocal en raison de l'indisponibilité du thread.
Mais si vous écrivez le code suivant, c'est une utilisation dangereuse:
PageHelper.StartPage (1, 10); list <country> list; if (param1! = Null) {list = countrymapper.selectif (param1);} else {list = new ArrayList <Country> ();}Dans ce cas, parce que Param1 a null, PageHelper produira un paramètre de pagination, mais il n'est pas consommé et ce paramètre restera sur ce fil. Lorsque ce thread est à nouveau utilisé, il peut provoquer des méthodes qui ne devraient pas être la pagination pour consommer les paramètres de pagination, ce qui entraîne une pagination inexplicable.
Le code ci-dessus doit être écrit comme suit:
Liste <country> liste; if (param1! = Null) {pagehelper.startPage (1, 10); list = countrymapper.selectif (param1);} else {list = new ArrayList <country> ();}Cette façon d'écrire peut assurer la sécurité.
Si vous n'êtes pas à l'aise avec cela, vous pouvez nettoyer manuellement les paramètres de pagination stockés en threadlocal, qui peuvent être utilisés comme ceci:
Liste <country> liste; if (param1! = Null) {pagehelper.startPage (1, 10); essayez {list = countrymapper.selectall (); } enfin {pageHelper.Clearpage (); }} else {list = new ArrayList <Country> ();}Ce n'est pas bon d'écrire comme ça, et ce n'est pas nécessaire.
Résumer
Ce qui précède est la configuration et la méthode d'utilisation simple du plugin MyBatis Paging Pagehelper qui vous est présenté par l'éditeur (recommandé). J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!