Sujet du jour: comment comprendre MyBatis (avantages et inconvénients) et explication détaillée de l'utilisation de MyBatis!

Un, MyBatis

1. Qu'est-ce que MyBatis

(1) Mybatis est un framework semi-ORM (Object Relational Mapping), qui encapsule JDBC en interne. Vous n'avez qu'à prêter attention à l'instruction SQL
elle-même pendant le développement, et vous n'avez pas besoin de dépenser de l'énergie sur les processus compliqués de chargement des pilotes, de création de connexions et de création d'instructions. Les programmeurs écrivent directement du
SQL natif , ce qui peut contrôler strictement les performances d'exécution SQL avec une grande flexibilité.
(2) MyBatis peut utiliser XML ou des annotations pour configurer et mapper les informations natives, et mapper les POJO aux enregistrements de la base de données, évitant
presque tous les codes JDBC et le réglage manuel des paramètres et obtenant des ensembles de résultats.
(3) Configurer les différentes instructions à exécuter via des fichiers xml ou des annotations, et
générer les instructions SQL finales exécutées via l'objet java et les paramètres dynamiques du SQL dans l'instruction. Enfin, le framework mybatis exécute le SQL et mappe le résultat à java
objet et retour. (Le processus de l'exécution de sql au retour du résultat).

2. Les avantages et les inconvénients de MyBatis

Avantages:
(1) Basé sur la programmation d'instructions SQL, il est assez flexible et n'aura aucun impact sur la conception existante de l'application ou de la base de données. SQL est écrit en
XML, ce qui libère le couplage entre SQL et le code du programme et facilite la gestion unifiée; des balises XML sont fournies, Prend en charge la préparation d'instructions SQL dynamiques et peut être réutilisé
.
(2) Comparé à JDBC, il réduit la quantité de code de plus de 50%, élimine une grande quantité de code redondant dans JDBC et n'a pas besoin de changer de connexion manuellement;
(3) Il est compatible avec diverses bases de données (car MyBatis utilise JDBC pour se connecter Base de données, tant que la base de données prise en charge par JDBC est prise en charge par
MyBatis).
(4) Il peut être bien intégré à Spring;
(5) Fournir des balises de mappage pour prendre en charge le mappage de relation de champ ORM entre les objets et les bases de données; fournir des balises de mappage de relation d'objet pour prendre en charge la
maintenance des composants de relation d'objet .
Inconvénients
(1) La charge de travail d'écriture des instructions SQL est relativement importante, en particulier lorsqu'il y a de nombreux champs et tables associées, les développeurs ont certaines
exigences pour écrire des instructions SQL .
(2) Les instructions SQL dépendent de la base de données, ce qui entraîne une mauvaise portabilité de la base de données, et la base de données ne peut pas être remplacée à volonté.

3. Quelle est la différence entre # {} et $ {}?

# {} est un traitement de pré-compilation, erreur d'analyse KaTeX: Attendu'EOF ', obtenu' # 'à la position 21:… remplacement de chaîne. Lorsque Mybatis traite # ̲ {}, il remplace # {} dans sql par ... {}, 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.

4. Que dois-je faire lorsque le nom d'attribut dans la classe d'entité est différent du nom de champ dans la table?

Type 1: en définissant l'alias du nom de champ dans l'instruction SQL de requête, l'alias du nom de champ est cohérent avec le nom d'attribut de la classe d'entité.

<select id=”selectorder” parametertype=int” 
resultetype=”me.gacl.domain.order”> 
select order_id id, order_no orderno ,order_price price form orders where order_id=#{
    
    id};
 </select>

Le deuxième type: à travers pour mapper la correspondance biunivoque entre le nom de champ et le nom d'attribut de classe d'entité.

5. Comment fonctionne la pagination de Mybatis? Quel est le principe du plugin de pagination?

Mybatis utilise l'objet RowBounds pour la pagination, qui est la pagination de mémoire pour le jeu de résultats ResultSet, pas la pagination physique.
Vous pouvez écrire les paramètres avec la pagination physique directement dans SQL pour terminer la fonction de pagination physique, ou vous pouvez utiliser le plug-in de pagination pour terminer la pagination physique.
Le principe de base du plug-in de pagination est d'utiliser l'interface du plug-in fournie par Mybatis pour implémenter un plug-in personnalisé, d'intercepter le SQL à exécuter dans la méthode d'interception du plug-in, puis de réécrire le SQL, selon le dialecte dialecte, d'ajouter l'instruction de pagination physique correspondante et les paramètres de pagination physique.

6. Comment Mybatis encapsule le résultat de l'exécution SQL en tant qu'objet cible et le renvoie? Quels sont les formulaires de cartographie?

La première consiste à utiliser des balises pour définir la relation de mappage entre les noms de colonne de base de données et les noms d'attribut d'objet un par un.
La seconde consiste à utiliser la fonction alias de la colonne sql pour écrire l'alias de la colonne comme nom d'attribut d'objet.
Avec la relation de mappage entre les noms de colonne et les noms d'attribut, Mybatis crée des objets par réflexion et utilise les attributs reflétés dans les objets pour les affecter et les renvoyer un par un. Les attributs qui ne peuvent pas trouver la relation de mappage ne peuvent pas être affectés.

7. Comment effectuer l'insertion par lots?

Tout d'abord, créez une instruction d'insertion simple:

<insert id=”insertname”> insert into names (name) values (#{
    
    value}) 
</insert>

Ensuite, exécutez l'insertion par lots dans le code java comme suit:

list<string> names = new arraylist(); 
names.add(“fred”); 
names.add(“barney”); 
names.add(“betty”); 
names.add(“wilma”);
// 注意这里 executortype.batch 
sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch); 
try {
    
     
namemapper mapper = sqlsession.getmapper(namemapper.class); 
for (string name : names) {
    
     
mapper.insertname(name); 
}
sqlsession.commit();
 }catch(Exception e){
    
     
 e.printStackTrace(); 
 sqlSession.rollback(); 
 throw e; 
 }
 finally {
    
     
 sqlsession.close(); 
 }

8. Dans le fichier de mappage XML, en plus des balises select | insert | updae | delete, quelles sont les autres balises?

,,,,, plus 9 balises de SQL dynamique, parmi lesquelles des balises de fragment sql, et des fragments de SQL sont introduits via des balises pour générer des balises de stratégie pour les clés primaires qui ne prennent pas en charge l'incrémentation automatique.

9. Il existe plusieurs façons de réaliser un one-to-one dans MyBatis? Comment opérer?

Il existe une requête conjointe et une requête imbriquée. La requête conjointe est une requête conjointe de plusieurs tables, qui ne peut être interrogée qu'une seule fois. Elle peut être effectuée en configurant le nœud d'association dans resultMap pour configurer une classe un-à-un; la
requête imbriquée consiste à vérifier une table en premier, selon ce tableau L'ID de clé étrangère du résultat à l'intérieur est utilisé pour interroger des données dans une autre table, qui est également configurée par association, mais la requête d'une autre table est configurée via l'attribut select.

10. Mybatis prend-il en charge le chargement différé? Dans l'affirmative, quel est son principe de mise en œuvre?

Mybatis ne prend en charge que le chargement différé des objets d'association et des objets de collection. L'association fait référence à un-à-un et la collection fait référence à des requêtes 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 l'objet proxy de l'objet cible. Lorsque la méthode cible est appelée, entrez la méthode d'intercepteur, telle que l'appel de a.getB (). GetName (), et la méthode de l'intercepteur invoke () trouve que a.getB () est valeur nulle, puis il enverra séparément la requête sql précédemment enregistrée associée à l'objet B, la requête B up, puis appellera a.setB (b), de sorte que l'attribut objet b de a a une valeur, puis complétera a.getB ( ) .getName () appel de la méthode. C'est le principe de base du chargement paresseux.

Bien sûr, non seulement Mybatis, mais presque tous, y compris Hibernate, prennent en charge le chargement paresseux selon le même principe.

11.Les caches primaire et secondaire de Mybatis:

1) Cache de niveau 1: cache local HashMap basé sur PerpetualCache, son étendue de stockage est Session. Lorsque la session est vidée ou fermée, tous les caches de la session seront vidés et le cache de niveau 1 est activé par défaut.

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

3) Pour le mécanisme de mise à jour des données de cache, lorsqu'une opération C / U / D est effectuée dans une certaine portée (Session de cache de premier niveau / Espaces de noms de cache de second niveau), tous les caches de select dans cette portée seront effacés par défaut. Réactualiser, si le cache de deuxième niveau est activé, il sera uniquement déterminé s'il faut actualiser en fonction de la configuration.

Je suppose que tu aimes

Origine blog.csdn.net/Java_Yhua/article/details/111387634
conseillé
Classement