Maison  >  Article  >  Java  >  Questions d'entretien de base Java haute fréquence——(8)

Questions d'entretien de base Java haute fréquence——(8)

王林
王林avant
2020-09-11 15:59:041783parcourir

Questions d'entretien de base Java haute fréquence——(8)

91. Qu'est-ce que l'ORM ?

(Recommandations pour des questions d'entretien plus connexes : questions et réponses d'entretien Java)

Le mappage objet-relationnel (ORM) est un programme conçu pour résoudre la technologie qui résout le problème d'inadéquation entre le modèle orienté objet et le modèle relationnel de la base de données ;

En termes simples, ORM utilise des métadonnées qui décrivent le mappage entre les objets et les bases de données (en Java, XML ou des annotations peuvent être utilisées), persistent automatiquement objets du programme vers une base de données relationnelle ou convertir les lignes d'une table de base de données relationnelle en objets Java. Son essence est de convertir les données d'une forme à une autre.

92. SessionFactory dans Hibernate est-il thread-safe ? La session est-elle thread-safe (deux threads peuvent-ils partager la même session) ?
SessionFactory correspond à un concept de stockage de données d'Hibernate. Il est thread-safe et est accessible simultanément par plusieurs threads. SessionFactory n'est généralement construit qu'au démarrage. Pour les applications, il est préférable d'encapsuler SessionFactory via le mode singleton pour un accès facile.

La session est un objet léger non thread-safe (la session ne peut pas être partagée entre les threads), qui représente une unité de travail qui interagit avec la base de données. La session est créée par SessionFactory et elle sera fermée une fois la tâche terminée. La session est l'interface principale fournie par le service de couche de persistance.

La session retardera l'obtention de la connexion à la base de données (c'est-à-dire qu'elle ne l'obtiendra qu'en cas de besoin). Afin d'éviter de créer trop de sessions, vous pouvez utiliser ThreadLocal pour lier la session au thread actuel, afin que le même thread obtienne toujours la même session. La méthode getCurrentSession() de SessionFactory dans Hibernate 3 peut le faire.

93. Que font les méthodes save(), update(), merge(), lock(), saveOrUpdate() et persist() de Session ? Quelle est la différence ?
Les objets Hibernate ont trois états : transitoire, persistant et détaché.

Les instances de l'état instantané peuvent devenir durables en appelant la méthode Save (), Persist () ou SaveorUpdate (); lock() ou replite() devient persistante. save() et persist() déclencheront des instructions SQL INSERT, et update() ou merge() déclencheront des instructions UPDATE.

La différence entre save() et update() est que l'un transforme un objet transitoire en un état persistant et l'autre transforme un objet libre en un état persistant. La méthode merge() peut compléter les fonctions des méthodes save() et update(). Son intention est de fusionner le nouvel état dans l'objet persistant existant ou de créer un nouvel objet persistant.

Pour la méthode persist(), suivez les instructions de la documentation officielle :

1. La méthode persist() persiste une instance transitoire, mais elle ne garantit pas que l'identifiant sera rempli dans immédiatement. Dans une instance persistante, le remplissage de l'identifiant peut être reporté jusqu'au moment du vidage

2. La méthode persist() garantit que lorsqu'elle est appelée en dehors d'une transaction, elle ne déclenchera pas d'instruction INSERT ; . Lorsque nécessaire Lors de l'encapsulation d'un long processus de session, la méthode persist() est nécessaire

3. La méthode save() ne garantit pas l'élément 2. Elle renvoie un identifiant, elle exécutera donc immédiatement l'instruction INSERT ; . Que ce soit à l'intérieur ou à l'extérieur des affaires. Quant à la différence entre la méthode lock() et la méthode update(), la méthode update() change un objet dans un état détaché qui a été transformé en un état persistant, la méthode lock() change un objet dans un état détaché ; cela n’est pas devenu un état persistant.

94, explique le processus de chargement des objets entité par session.
1. Avant d'appeler la fonction de requête de base de données, la session recherchera d'abord le type d'entité et la clé primaire dans le cache de premier niveau. Si la recherche dans le cache de premier niveau réussit et que l'état des données est légal, elle reviendra directement ;
2. S'il n'y a aucun résultat dans le cache de niveau. Ensuite, la session recherchera dans l'enregistrement NonExists actuel (équivalent à une liste noire de requêtes. Si des requêtes invalides répétées apparaissent, un jugement rapide peut être fait pour améliorer les performances) . Si les mêmes conditions de requête existent dans NonExists, Alors renvoie null;
3. Si la requête du cache de premier niveau échoue, interrogez le cache de deuxième niveau. Si le cache de deuxième niveau atteint, retournez directement
4. . Si la requête précédente échoue, émettez une instruction SQL. Si la requête n'est pas trouvée, pour l'enregistrement correspondant, ajoutez la requête aux NonExists de la session et enregistrez-la, et renvoyez null
5. Obtenez le ResultSet selon ; à la configuration de mappage et à l'instruction SQL, et créez l'objet d'entité correspondant ;
6. Incorporez l'objet dans la gestion de session (cache niveau 1)
7. S'il existe un intercepteur correspondant, exécutez la méthode onLoad de ; l'intercepteur ;
8. S'il est activé et configuré pour utiliser le cache de deuxième niveau, l'objet de données sera inclus dans le cache de deuxième niveau
9. Renvoie l'objet de données.

95. Quelle est la différence entre utiliser # et $ pour écrire des espaces réservés dans MyBatis ?
         # Traitez les données entrantes comme une chaîne et ajoutez automatiquement des guillemets aux données entrantes ;

Remarque : l'utilisation de l'espace réservé $ peut conduire à des attaques par injection SQL. N'utilisez pas $ où # peut être utilisé. Lors de l'écriture de la clause order by, vous devez utiliser $ au lieu de #.

96, expliquez le rôle de l'espace de noms dans MyBatis.

Dans les grands projets, il peut y avoir un grand nombre d'instructions SQL. À l'heure actuelle, il n'est pas facile de donner à chaque instruction SQL une identification (ID) unique. Afin de résoudre ce problème, dans MyBatis, vous pouvez créer un espace de noms unique pour chaque fichier de mappage, afin que chaque instruction SQL définie dans ce fichier de mappage devienne un ID défini dans cet espace de noms. Tant que nous pouvons garantir que cet ID est unique dans chaque espace de noms, même si les ID d'instruction dans différents fichiers de mappage sont les mêmes, les conflits ne se produiront plus.


(Recommandation du didacticiel vidéo :

cours java

) 97. Que signifie le SQL dynamique dans MyBatis ?

Pour certaines requêtes complexes, nous pouvons spécifier plusieurs conditions de requête, mais ces conditions peuvent exister ou non. Si nous n'utilisons pas le framework de couche de persistance, nous devrons peut-être assembler les instructions SQL nous-mêmes, mais MyBatis fournit la fonction de. SQL dynamique pour résoudre ce problème. Les principaux éléments utilisés pour implémenter le SQL dynamique dans MyBatis sont :

- if - choisir / quand / sinon - trim - où - set - foreach

Exemple d'utilisation :


< ;select id="foo" paramètreType="Blog" resultType="Blog">                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     

98. Quelles sont les lacunes de la programmation JDBC ? Comment MyBatis résout-il ces problèmes ?

1. JDBC : la création et la publication fréquentes de liens de base de données entraînent un gaspillage de ressources système et affectent les performances du système. Ce problème peut être résolu en utilisant un pool de connexions à la base de données.

MyBatis : configurez le pool de liaisons de données dans SqlMapConfig.xml et utilisez le pool de connexions pour gérer les liens de base de données.

2. JDBC : les instructions SQL sont écrites dans le code, ce qui rend le code difficile à maintenir. L'application réelle de SQL peut changer et les modifications SQL nécessitent des modifications du code Java.

MyBatis : configurez l'instruction SQL dans le fichier XXXXmapper.xml et séparez-la du code Java.
3. JDBC : il est difficile de transmettre des paramètres à l'instruction SQL, car la condition Where de l'instruction SQL n'est pas nécessairement certaine, elle peut être plus ou moins grande et les espaces réservés doivent correspondre aux paramètres un à un. -un.

MyBatis : Mybatis mappe automatiquement les objets Java aux instructions SQL.
4. JDBC : il est difficile d'analyser l'ensemble de résultats. Les modifications SQL entraînent des modifications dans le code d'analyse, et il doit être parcouru avant l'analyse. Il serait plus pratique d'analyser les enregistrements de la base de données en objets pojo.

MyBatis : Mybatis mappe automatiquement les résultats d'exécution SQL aux objets Java.

99. Quelles sont les différences entre MyBatis et Hibernate ?

1. Mybatis est différent d'hibernate. Ce n'est pas entièrement un framework ORM, car MyBatis nécessite que les programmeurs écrivent eux-mêmes des instructions SQL. Cependant, mybatis peut configurer de manière flexible les instructions SQL à exécuter via XML ou des annotations. utiliser java L'objet et l'instruction SQL sont mappés pour générer le SQL exécuté final, et enfin le résultat de l'exécution SQL est mappé pour générer un objet Java.
2. Mybatis a un faible seuil d'apprentissage et est facile à apprendre. Les programmeurs peuvent écrire directement du SQL original, qui peut contrôler strictement les performances d'exécution du SQL et une grande flexibilité. Il est très approprié pour le développement de logiciels qui n'ont pas d'exigences élevées en matière de relationnel. modèles de données, tels que les logiciels Internet et les logiciels opérationnels d'entreprise, etc., car les exigences de ce type de logiciel changent fréquemment, une fois les exigences modifiées, les résultats doivent être générés rapidement. Cependant, le principe de flexibilité est que mybatis ne peut pas être indépendant 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 représente une lourde charge de travail. ​ ​ ​ ​ 3. Hibernate possède de fortes capacités de mappage objet/relationnel et une bonne indépendance de base de données. Pour les logiciels ayant des exigences élevées en matière de modèles relationnels (tels que les logiciels personnalisés avec des exigences fixes), si vous utilisez Hibernate pour le développer, vous pouvez économiser beaucoup. du code et améliorer l’efficacité. Cependant, l'inconvénient d'Hibernate est que le seuil d'apprentissage est élevé, et le seuil de maîtrise est encore plus élevé. De plus, comment concevoir le mappage O/R, comment peser les performances et le modèle objet, et comment bien utiliser Hibernate nécessite. forte expérience et capacité.
En bref, tant que les besoins de l'utilisateur peuvent être satisfaits dans un environnement de ressources limitées, l'architecture logicielle avec une bonne maintenance et une bonne évolutivité est une bonne architecture, donc le framework n'est que le meilleur.

(Vous pouvez également parler en fonction de votre propre compréhension ici, ne soyez pas submergé)

100, parlez brièvement du cache de premier niveau et du cache de deuxième niveau de MyBatis ?

Mybatis interroge d'abord l'ensemble de résultats dans le cache. S'il n'y a pas d'ensemble de résultats, il interroge la base de données. S'il y en a, il récupère l'ensemble de résultats du cache et le renvoie sans accéder à la base de données. Le cache de stockage interne de Mybatis utilise un HashMap et la clé est l'instruction hashCode+sqlId+Sql. value est l'objet Java généré par le mappage à partir de la requête
Le cache de deuxième niveau de Mybatis est le cache de requêtes. Sa portée est l'espace de noms d'un mappeur, c'est-à-dire qu'une requête SQL dans le même espace de noms peut obtenir des données du cache. Le cache de deuxième niveau peut s'étendre sur SqlSession.

Tutoriels associés recommandés : Tutoriel d'introduction à Java

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer