Résumé des questions d'entrevue (6) SSM

十 、 Spring / Spring MVC

 

90. Pourquoi utiliser le ressort?

 

1. Introduction

 

  • Objectif: résoudre la complexité du développement d'applications d'entreprise

  • Fonction: utilisez JavaBean de base au lieu d'EJB et fournissez plus de fonctions d'application d'entreprise

  • Portée: toute application Java

 

En bref, Spring est un framework de conteneur léger à inversion de conteneur (IoC) et orienté aspect (AOP).

 

2. Léger  

 

Le ressort est léger en termes de taille et de frais généraux. Le framework Spring complet peut être publié dans un fichier JAR d'une taille supérieure à 1 Mo. Et les frais généraux de traitement requis par Spring sont négligeables. De plus, Spring n'est pas intrusif: en règle générale, les objets dans les applications Spring ne dépendent pas des classes spécifiques de Spring.

 

3. Inversion du contrôle  

 

Le printemps favorise le couplage lâche grâce à une technique appelée inversion de contrôle (IoC). Lorsque l'IoC est appliqué, les autres objets dont dépend un objet sont transmis passivement au lieu de créer ou de rechercher des objets dépendants par l'objet lui-même. Vous pouvez penser à l'IoC par opposition à JNDI - ce n'est pas que l'objet recherche la dépendance du conteneur, mais que le conteneur lui transmet activement la dépendance sans attendre la demande d'objet lorsque l'objet est initialisé.

 

4. Faites face à la coupe  

 

Spring fournit un support riche pour la programmation orientée aspect, permettant un développement cohérent en séparant la logique métier des applications des services au niveau du système (tels que l'audit et la gestion des transactions). Les objets d'application n'implémentent que ce qu'ils sont censés faire - compléter la logique métier - rien de plus. Ils ne sont pas responsables (ni même conscients) d'autres problèmes au niveau du système, tels que la journalisation ou le support des transactions.

 

5. Conteneur

 

Spring contient et gère la configuration et le cycle de vie des objets d'application. En ce sens, il s'agit d'un conteneur. Vous pouvez configurer la façon dont chacun de vos beans est créé. Sur la base d'un prototype configurable, vos beans peuvent créer un Une instance distincte ou une nouvelle instance est générée chaque fois que cela est nécessaire - et comment ils sont liés les uns aux autres. Cependant, le Spring ne doit pas être confondu avec les conteneurs EJB traditionnels, ils sont souvent volumineux et lourds et difficiles à utiliser.

 

6. Cadre

 

Spring peut configurer et combiner des composants simples dans des applications complexes. Dans Spring, les objets d'application sont combinés de manière déclarative, généralement dans un fichier XML. Spring fournit également de nombreuses fonctions de base (gestion des transactions, intégration de framework de persistance, etc.), vous laissant le développement de la logique applicative.

 

Toutes ces fonctionnalités de Spring vous permettent d'écrire du code plus propre, plus facile à gérer et plus facile à tester. Ils fournissent également un support de base pour divers modules au printemps.

 

91. Expliquez ce qui est aop?

 

On peut dire que l'AOP (Aspect-Oriented Programming, programmation orientée aspect) complète et améliore OOP (Object-Oriented Programming, programmation orientée objet). La POO introduit des concepts tels que l'encapsulation, l'héritage et le polymorphisme pour établir une hiérarchie d'objets pour simuler une collection de comportements publics. Lorsque nous devons introduire un comportement public pour les objets décentralisés, la POO est impuissante. En d'autres termes, la POO vous permet de définir la relation de haut en bas, mais il ne convient pas de définir la relation de gauche à droite. Par exemple, la fonction de journal. Le code journal est souvent distribué horizontalement dans toutes les hiérarchies d'objets et n'a rien à voir avec les fonctions essentielles des objets qu'il diffuse. Il en va de même pour d'autres types de code, tels que la sécurité, la gestion des exceptions et la persistance transparente. Ce code non pertinent dispersé partout est appelé code transversal. Dans la conception POO, il conduit à beaucoup de duplication de code, ce qui n'est pas propice à la réutilisation de divers modules.

 

La technologie AOP est tout le contraire. Elle utilise une technologie appelée "crosscutting" pour disséquer l'intérieur de l'objet encapsulé, et encapsuler les comportements publics qui affectent plusieurs classes dans un module réutilisable, et le nommer. "Aspect", c'est-à-dire l'aspect. Le soi-disant "aspect" consiste simplement à encapsuler la logique ou la responsabilité qui n'est pas liée à l'entreprise, mais est communément appelée par le module métier, ce qui est pratique pour réduire le code répétitif du système, réduire le couplage entre les modules et propice à l'avenir. Fonctionnement et maintenabilité. AOP signifie une relation horizontale. Si "objet" est un cylindre creux, qui encapsule les attributs et le comportement de l'objet; alors la méthode de programmation orientée aspect est comme une arête vive, coupant ces cylindres creux Pour obtenir les nouvelles à l'intérieur. Et la surface coupée est ce qu'on appelle la "facette". Ensuite, il restaure ces plans de coupe avec ses mains intelligentes, ne laissant aucune trace.

 

En utilisant la technologie «transversale», AOP divise le système logiciel en deux parties: les préoccupations fondamentales et les préoccupations transversales. Le principal processus de traitement des affaires est la préoccupation principale, et la partie qui n'y est pas liée est la préoccupation transversale. L'une des caractéristiques des préoccupations transversales est qu'elles se produisent souvent à plusieurs endroits dans les principales préoccupations, mais elles sont fondamentalement similaires partout. Tels que l'authentification d'autorité, le journal, le traitement des transactions. Le rôle de l'Aop est de séparer diverses préoccupations dans le système, en séparant les préoccupations fondamentales et les préoccupations transversales. Comme l'a dit Adam Magee, architecte de solutions senior chez Avanade, l'idée centrale d'AOP est de "séparer la logique métier de l'application des services généraux qui la prennent en charge".

 

92. Expliquez ce qu'est l'ioc?

 

IOC est l'abréviation d'Inversion of Control, et la plupart des livres sont traduits par "inversion de contrôle".

  

En 1996, Michael Mattson a proposé pour la première fois le concept d'IOC dans un article sur l'exploration de cadres orientés objet. Pour l'idée de base de la conception et de la programmation orientées objet, nous avons déjà beaucoup parlé auparavant et nous ne le répéterons pas. En termes simples, il s'agit de décomposer un système complexe en objets mutuellement coopératifs. Une fois ces classes d'objets encapsulées, l'implémentation interne est transparente pour l'extérieur , Ce qui réduit la complexité de la résolution du problème et peut être réutilisé et étendu de manière flexible.

  

Le point soulevé par la théorie du CIO est à peu près le suivant: le découplage entre objets avec dépendances est réalisé au moyen de «tiers». Comme indiqué ci-dessous:

 

Figure Processus de découplage du CIO

  

Comme vous pouvez le voir, en raison de l'introduction du "tiers" au milieu, c'est-à-dire du conteneur IOC, les quatre objets A, B, C et D n'ont pas de relation de couplage, et la transmission entre les engrenages dépend entièrement du "tiers". Le contrôle de tous les objets est transféré au conteneur IOC «tiers». Le conteneur IOC est donc devenu le cœur de tout le système. Il agit comme une sorte d '«adhésif» et lie tous les objets du système. En travaillant ensemble, sans cet "adhésif", les objets perdront contact les uns avec les autres. C'est pourquoi certaines personnes comparent le conteneur du CIO à "l'adhésif".

  

Faisons une autre expérience: retirez le conteneur IOC au milieu de l'image ci-dessus, puis jetez un œil à ce système:

 

Figure après avoir retiré le conteneur IOC

  

Ce que nous voyons maintenant, c'est tout ce que nous devons accomplir pour réaliser l'ensemble du système. À l'heure actuelle, il n'y a pas de relation de couplage entre les quatre objets A, B, C et D, et il n'y a pas de connexion les uns avec les autres. Dans ce cas, lorsque vous implémentez A, il n'est pas nécessaire de considérer du tout B, C et D. Les dépendances entre les objets ont été réduites au minimum. Par conséquent, si les conteneurs IOC peuvent être réalisés, ce sera une chose merveilleuse pour le développement du système.Chaque membre participant au développement n'a qu'à implémenter sa propre classe, ce qui n'a rien à voir avec les autres!

    

Voyons pourquoi le nom IOC est ainsi appelé? Comparons:

    

Avant que le système logiciel n'introduise le conteneur IOC, comme le montre la figure 1, l'objet A dépend de l'objet B, donc lorsque l'objet A s'initialise ou s'exécute jusqu'à un certain point, il doit créer activement l'objet B ou utiliser l'objet B qui a été créé. Que vous créiez ou utilisiez l'objet B, le contrôle est entre vos mains.

    

Après que le système logiciel a introduit le conteneur IOC, cette situation a complètement changé. Comme le montre la figure 3, en raison de l'ajout du conteneur IOC, l'objet A et l'objet B ont perdu le contact direct, donc lorsque l'objet A s'exécute pour avoir besoin de l'objet B À ce moment-là, le conteneur IOC créera activement un objet B et l'injectera à l'endroit requis par l'objet A.

    

De la comparaison avant et après, il n'est pas difficile de voir que le processus d'obtention de la dépendance de l'objet A à partir de l'objet B passe d'un comportement actif à un comportement passif, et le droit de contrôle est inversé. C'est l'origine du nom << inversion de contrôle >>.

 

93. Quels sont les principaux modules du ressort?

 

Jusqu'à présent, le framework Spring a intégré plus de 20 modules. Ces modules sont principalement divisés en conteneurs principaux, accès / intégration de données, Web, AOP (Aspect-Oriented Programming), outils, messages et modules de test, comme illustré dans la figure ci-dessous.

 

 


94. Quelles sont les méthodes d'injection courantes du ressort?

 

Spring met en œuvre l'IOC (Control Inversion) via DI (Dependency Injection) .Il existe trois méthodes d'injection principales:

 

  1. Injection constructeur

  2. injection de setter

  3. Injection basée sur l'annotation

 

95. Les fèves au printemps sont-elles sans fil?

 

Indique si le bean dans le conteneur Spring est sûr pour les threads. Le conteneur lui-même ne fournit pas de stratégie de sécurité des threads pour le bean. Par conséquent, on peut dire que le bean dans le conteneur Spring lui-même n'a pas les caractéristiques de sécurité des threads.

 

96. Quels types de portées de haricots sont pris en charge par Spring?

 

Lors de la création d'une instance de Bean via le conteneur Spring, non seulement l'instance de Bean peut être instanciée, mais également une étendue spécifique peut être spécifiée pour le Bean. Spring prend en charge les cinq étendues suivantes:

 

  • singleton: mode singleton, dans tout le conteneur Spring IoC, il n'y aura qu'une seule instance de Bean définie à l'aide de singleton

  • prototype: Mode prototype, chaque fois qu'un Bean défini par un prototype est obtenu via la méthode getBean du conteneur, une nouvelle instance de Bean sera générée

  • request: pour chaque requête HTTP, un bean défini à l'aide de request générera une nouvelle instance, c'est-à-dire que chaque requête HTTP générera une instance de bean différente. Cette portée n'est valide que lors de l'utilisation de Spring dans une application Web

  • session: Pour chaque session HTTP, une nouvelle instance est générée à l'aide du lait de haricot défini par la session. Cette étendue est également valide uniquement lors de l'utilisation de Spring dans une application Web

  • globalsession: pour chaque session HTTP globale, un bean défini à l'aide de la session générera une nouvelle instance. En règle générale, il n'est valide que lors de l'utilisation du contexte de portlet. Cette étendue est également valide uniquement lors de l'utilisation de Spring dans une application Web

 

L'un des plus répandus est le singleton et le prototype de deux étendues. Pour les beans de portée singleton, chaque demande de bean obtiendra la même instance. Le conteneur est responsable du suivi de l'état de l'instance de bean et est responsable du maintien du comportement de cycle de vie de l'instance de bean; si un bean est défini sur la portée du prototype, chaque fois que le programme demande le bean de cet identifiant, Spring créera une nouvelle instance de bean, puis reviendra au programme. Dans ce cas, le conteneur Spring utilise uniquement le nouveau mot clé pour créer l'instance Bean. Une fois la création réussie, le conteneur ne suit pas l'instance et ne conserve pas l'état de l'instance Bean.

 

Si vous ne spécifiez pas la portée du bean, Spring utilise la portée singleton par défaut. Java doit demander de la mémoire lors de la création d'une instance Java; lors de la destruction d'une instance, il doit terminer le garbage collection, ce qui augmentera la surcharge du système. Par conséquent, la création et la destruction de beans de portée de prototype sont relativement coûteuses. Une fois que l'instance Bean dans la portée singleton a été créée avec succès, elle peut être réutilisée. Par conséquent, à moins que cela ne soit nécessaire, essayez d'éviter de définir le bean sur la portée du prototype.

 

97. Quels sont les moyens pour le printemps de câbler automatiquement les grains?

 

Le conteneur Spring est chargé de créer les beans dans l'application tout en coordonnant la relation entre ces objets par ID. En tant que développeurs, nous devons dire à Spring quels beans créer et comment les assembler.

 

Il existe deux façons d'assembler les grains au printemps:

 

  • Mécanisme de découverte implicite de bean et assemblage automatique

  • Configuration de l'affichage en code java ou XML

 

Bien entendu, ces méthodes peuvent également être utilisées ensemble.

 

98. Quelles sont les modalités de mise en œuvre des transactions printanières?

 

  1. La gestion des transactions par programme est la seule option pour les applications basées sur POJO. Nous devons appeler beginTransaction (), commit (), rollback () et d'autres méthodes liées à la gestion des transactions dans le code. Il s'agit de la gestion des transactions par programme.

  2. Gestion déclarative des transactions basée sur TransactionProxyFactoryBean

  3. Gestion déclarative des transactions basée sur @Transactional

  4. Configurer les transactions basées sur Aspectj AOP

 

99. Qu'en est-il de l'isolement des transactions au printemps?

 

Le niveau d'isolement des transactions fait référence au degré d'isolement entre la modification des données par une transaction et une autre transaction parallèle. Lorsque plusieurs transactions accèdent aux mêmes données en même temps, si le mécanisme d'isolement nécessaire n'est pas adopté, les problèmes suivants peuvent se produire:

 

  • Lecture incorrecte: une transaction lit les données de mise à jour non validées d'une autre transaction.

  • Lecture fantôme: par exemple, la première transaction modifie les données d'une table. Par exemple, cette modification implique "toutes les lignes de données" de la table. Dans le même temps, la deuxième transaction modifie également les données de cette table. Cette modification insère une "ligne de nouvelles données" dans la table. Ensuite, l'utilisateur qui opérera la première transaction à l'avenir constatera qu'il y a encore des lignes de données non modifiées dans la table, comme si une illusion s'était produite.

  • Lecture non répétable: par exemple, deux instructions select identiques ont été exécutées dans la même transaction. Au cours de cette transaction, aucune instruction DDL n'a été exécutée, mais les résultats obtenus successivement sont incohérents.

 

100. Parlez-moi du processus de fonctionnement du ressort mvc?

 

Organigramme du fonctionnement du Spring MVC:

 

 

Description du processus d'exécution du printemps:

      

1. L'utilisateur envoie une demande au serveur, la demande est capturée par le contrôle frontal Spring Servelt DispatcherServlet;

      

2. DispatcherServlet analyse l'URL de la demande pour obtenir l'identificateur de ressource de la demande (URI). Ensuite, selon l'URI, appelez HandlerMapping pour obtenir tous les objets associés (y compris l'objet Handler et l'intercepteur correspondant à l'objet Handler) configurés par le gestionnaire, et enfin le renvoyer en tant qu'objet HandlerExecutionChain

      

3. DispatcherServlet sélectionne un HandlerAdapter approprié en fonction du Handler obtenu (Remarque: si le HandlerAdapter est correctement obtenu, la méthode preHandler (...) de l'intercepteur commencera à s'exécuter à ce moment)

       

4. Extrayez les données du modèle dans la demande, remplissez les paramètres du gestionnaire et commencez à exécuter le gestionnaire (contrôleur). Dans le processus de remplissage du gestionnaire, selon votre configuration, Spring vous aidera à effectuer des travaux supplémentaires:

 

  • HttpMessageConveter: convertir le message de demande (tel que Json, XML, etc.) en un objet et convertir l'objet en les informations de réponse spécifiées

  • Conversion de données: effectuez une conversion de données sur le message de demande. Si String est converti en Integer, Double, etc.

  • Enracinement des données: formatage du message de requête. Telles que la conversion d'une chaîne en un nombre formaté ou une date formatée, etc.

  • Vérification des données: vérifiez la validité des données (longueur, format, etc.) et stockez le résultat de la vérification dans BindingResult ou Error

      

5. Une fois l'exécution de Handler terminée, renvoyez un objet ModelAndView à DispatcherServlet;

      

6. Selon le ModelAndView retourné, sélectionnez un ViewResolver approprié (doit être le ViewResolver qui a été enregistré dans le conteneur Spring) et renvoyez-le au DispatcherServlet;

      

7. ViewResolver combine le modèle et la vue pour rendre la vue;

      

8. Renvoyez le résultat du rendu au client.

 

101. Quels sont les composants du ressort mvc?

 

Les composants principaux de Spring MVC:

 

  1. DispatcherServlet: contrôleur central, transfert des demandes à des classes de contrôle spécifiques

  2. Contrôleur: le contrôleur qui gère spécifiquement la demande

  3. HandlerMapping: processeur de cartographie, responsable de la cartographie de la stratégie de cartographie lorsque le processeur central transmet au contrôleur

  4. ModelAndView: les données retournées par la couche service et la classe d'encapsulation de la couche vue

  5. ViewResolver: résolveur de vues, résolution de vues spécifiques

  6. Intercepteurs: Intercepteurs, chargés d'intercepter les demandes que nous définissons puis effectuons le traitement

 

102. Quel est le rôle de @RequestMapping?

 

RequestMapping est une annotation utilisée pour gérer le mappage d'adresse de demande et peut être utilisée sur des classes ou des méthodes. Utilisé sur la classe, cela signifie que toutes les méthodes de réponse aux requêtes de la classe utilisent cette adresse comme chemin parent.

 

L'annotation RequestMapping a six attributs. Ci-dessous, nous la diviserons en trois catégories pour explication.

 

valeur , méthode :

 

  • valeur: spécifiez l'adresse réelle de la demande, l'adresse spécifiée peut être le mode modèle URI (sera expliqué plus loin);

  • méthode: spécifiez le type de méthode demandé, GET, POST, PUT, DELETE, etc.;

 

consomme , produit

 

  • consomme: spécifie le type de contenu (Content-Type) pour le traitement des demandes, tel que application / json, text / html;

  • produit: spécifie le type de contenu renvoyé et ne renvoie que si le type spécifié est inclus dans le type (Accepter) dans l'en-tête de demande de demande;

 

params , en-têtes

 

  • params: spécifie que certaines valeurs de paramètre doivent être incluses dans la demande avant que cette méthode puisse les traiter.

  • en-têtes: la demande spécifiée doit contenir certaines valeurs d'en-tête spécifiées pour que la méthode traite la demande.

 

103. Quel est le rôle de @Autowired?

 

"Utilisation détaillée de @Autowired": blog.csdn.net/u013257679/article/details/52295106

 

Treize, Mybatis

125. Quelle est la différence entre # {} et $ {} dans mybatis?

  • # {} Est un processus de pré-compilation, $ {} est un remplacement de chaîne;

  • Lorsque Mybatis traite # {}, il remplacera # {} dans sql par un ?, et appellera la méthode set de PreparedStatement pour attribuer une valeur;

  • Lorsque Mybatis traite $ {}, il remplace $ {} par la valeur de la variable;

  • L'utilisation de # {} peut empêcher efficacement l'injection SQL et améliorer la sécurité du système.

 

126. Combien de méthodes de pagination possède mybatis?

 

  1. Page de numéro

  2. pagination sql

  3. Recherche de personnes intercepteurs

  4. Pagination RowBounds

 

128. Quelle est la différence entre la pagination logique et la pagination physique de mybatis?

 

  • La vitesse de la page physique n'est pas nécessairement plus rapide que la page logique, et la vitesse de la page logique n'est pas nécessairement plus rapide que la page physique.

  • La pagination physique est toujours meilleure que la pagination logique: il n'est pas nécessaire de faire pression du côté de la base de données du côté de l'application, même s'il y a un avantage en termes de vitesse, mais d'autres avantages de performances sont suffisants pour compenser cette lacune.

 

129. mybatis prend-il en charge le chargement paresseux? Quel est le principe du chargement paresseux?

 

Mybatis ne prend en charge que le chargement différé des objets liés à l'association et à la collection. L'association fait référence à un à un et la collection fait référence à une requête un à plusieurs. Dans le fichier de configuration Mybatis, vous pouvez configurer l'activation du chargement différé lazyLoadingEnabled = true | false.

 

Son principe est d'utiliser CGLIB pour créer un objet proxy de l'objet cible. Lors de l'appel de la méthode cible, entrez la méthode interceptor, comme l'appel a.getB (). GetName (), la méthode interceptor invoke () constate que a.getB () est Si la valeur est nulle, le sql associé à la requête pré-enregistrée associée à l'objet B sera envoyé séparément, requête B, puis appelez a.setB (b), de sorte que l'attribut objet b de a a la valeur, puis complétez a.getB ( ) .getName () appel de méthode. C'est le principe de base du chargement paresseux.

 

Bien sûr, non seulement Mybatis, presque tous, y compris Hibernate, le principe de prise en charge du chargement paresseux est le même.

 

130. Parlez-moi du cache de premier niveau et du cache de deuxième niveau de mybatis?

 

Cache de premier niveau: cache local HashMap basé sur PerpetualCache, sa portée de stockage est Session, lorsque la session est vidée ou fermée, tout le cache de cette session sera vidé, le cache de premier niveau est activé par défaut.

 

Le cache de deuxième niveau a le même mécanisme que le cache de premier niveau. Par défaut, le stockage PerpetualCache et HashMap est utilisé. La différence est que la portée du stockage est Mappeur (espace de noms) et la source de stockage peut être personnalisée, comme Ehcache. Par défaut, le cache de deuxième niveau n'est pas activé. Pour activer le cache de deuxième niveau, l'utilisation de la classe d'attributs de cache de deuxième niveau doit implémenter l'interface de sérialisation sérialisable (qui peut être utilisée pour enregistrer l'état de l'objet), qui peut être configurée dans son fichier de mappage.

 

Pour le mécanisme de mise à jour des données de cache, après qu'une opération C / U / D a été effectuée dans une étendue (espaces de noms de cache de session de premier niveau / cache de deuxième niveau), le cache de toutes les sélections de cette étendue sera effacé par défaut.

 

131. Quelle est la différence entre mybatis et hibernate?

 

(1) Mybatis et hibernate sont différents, ce n'est pas exactement un framework ORM, car MyBatis oblige les programmeurs à écrire eux-mêmes les instructions Sql.

 

(2) Mybatis écrit directement le SQL écologique d'origine, qui peut contrôler strictement les performances d'exécution SQL et a une grande flexibilité. Il est très approprié pour le développement de logiciels qui n'a pas d'exigences élevées sur le modèle de données relationnelles, car la demande pour de tels logiciels change fréquemment, mais les changements de demande nécessitent une sortie rapide . Cependant, le principe de flexibilité est que mybatis ne peut pas atteindre l'indépendance de la base de données. Si vous devez implémenter un logiciel prenant en charge plusieurs bases de données, vous devez personnaliser plusieurs ensembles de fichiers de mappage sql, ce qui nécessite beaucoup de travail. 

 

(3) La capacité de mappage objet / relationnel Hibernate est solide et la base de données n'est pas pertinente. Pour les logiciels qui nécessitent des modèles relationnels élevés, si vous utilisez le développement Hibernate, vous pouvez économiser beaucoup de code et améliorer l'efficacité. 

 

132. Quels exécuteurs exécutent mybatis?

 

Mybatis dispose de trois actionneurs de base (Executor):

 

  1. SimpleExecutor : Chaque fois que la mise à jour ou la sélection est exécutée, un objet Statement est ouvert et l'objet Statement est fermé immédiatement après utilisation.

  2. ReuseExecutor : exécutez la mise à jour ou sélectionnez, utilisez SQL comme clé pour rechercher l'objet Statement, utilisez-le s'il existe et créez-le s'il n'existe pas. Après l'avoir utilisé, ne fermez pas l'objet Statement, mais placez-le dans la carte pour la prochaine utilisation. En bref, l'objet Statement est réutilisé.

  3. BatchExecutor : exécuter la mise à jour (pas de sélection, le traitement par lots JDBC ne prend pas en charge la sélection), ajouter tous les sql au lot (addBatch ()), attendre l'exécution unifiée (executeBatch ()), il met en cache plusieurs objets Statement, chacun Les objets d'instruction sont tous une fois addBatch () terminé, attendant d'exécuter un traitement par lots executeBatch () un par un. Identique au traitement par lots JDBC.

 

133. Quel est le principe de mise en œuvre du plugin de pagination mybatis?

 

Le principe de base du plug-in de pagination est d'utiliser l'interface de plug-in fournie par Mybatis pour implémenter un plug-in personnalisé, intercepter le sql à exécuter dans la méthode d'interception de plug-in, puis réécrire le sql, selon le dialecte du dialecte, ajouter la déclaration de pagination physique et les paramètres de pagination physique correspondants.

 

134. Comment mybatis écrit-il un plug-in personnalisé?

 

De: blog.csdn.net/qq_30051265/article/details/80266434

 

Le plug-in personnalisé Mybatis intercepte les quatre principaux objets de Mybatis (Executor, StatementHandler, ParameterHandler, ResultSetHandler). Les méthodes d'interception spécifiques sont les suivantes: 

  • Exécuteur: méthode d'interception de l'exécuteur (enregistrement de journal) 

  • StatementHandler: intercepte le traitement de la construction de la grammaire SQL 

  • ParameterHandler: traitement des paramètres d'interception 

  • ResultSetHandler: intercepte le traitement des jeux de résultats 

 

Le plug-in personnalisé Mybatis doit implémenter l'interface Interceptor:

 

  •  
  •  
  •  
  •  
  •  
public interface Interceptor {    Object intercept(Invocation invocation) throws Throwable;    Object plugin(Object target);    void setProperties(Properties properties);}

 

Méthode d'interception: la méthode logique de traitement spécifique de l'intercepteur 

méthode du plugin: générer des objets proxy dynamiques basés sur la signature signatureMap 

Méthode setProperties: définir les propriétés

Démo de plugin personnalisé:

 

  •  
  •  
  •  
  •  
// ExamplePlugin.java@Intercepts({@Signature(  type= Executor.class,  method = "update",  args = {MappedStatement.class,Object.class})})public class ExamplePlugin implements Interceptor {  public Object intercept(Invocation invocation) throws Throwable {  Object target = invocation.getTarget(); //被代理对象  Method method = invocation.getMethod(); //代理方法  Object[] args = invocation.getArgs(); //方法参数  // do something ...... 方法拦截前执行代码块  Object result = invocation.proceed();  // do something .......方法拦截后执行代码块  return result;  }  public Object plugin(Object target) {    return Plugin.wrap(target, this);  }  public void setProperties(Properties properties) {  }}

 

Un @Intercepts peut être configuré avec plusieurs @Signature. Les paramètres de @Signature sont définis comme suit: 

  • type: indique la classe interceptée, voici la classe d'implémentation d'Executor;

  • méthode: indique la méthode d'interception, voici la méthode de mise à jour pour intercepter Executor;

  • args: indique les paramètres de la méthode.

Publié 9 articles originaux · aimé 0 · visites 244

Je suppose que tu aimes

Origine blog.csdn.net/Fabri/article/details/105492315
conseillé
Classement