Maison >Java >JavaQuestions d'entretien >Questions d'entretien sur la couche de persistance Java
Qu'est-ce qu'un ORM ? (Apprentissage recommandé : Questions d'entretien Java )
Le mappage objet-relationnel (ORM) est un modèle permettant de résoudre le modèle de relation et le modèle de base de données du programme pour les problèmes d'inadéquation mutuelle. En termes simples, ORM conserve automatiquement les objets dans le programme en utilisant des métadonnées qui décrivent le mappage entre les objets et les bases de données (XML ou les annotations peuvent être utilisées en Java) dans une base de données relationnelle ou convertissent les lignes d'une table de base de données relationnelle. en objets Java, qui convertissent essentiellement les données d'une forme à une autre.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.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 transitoires peuvent être rendues persistantes en appelant save(), persist() ou saveOrUpdate(); Les instances gratuites peuvent être rendues persistantes en appelant update(), saveOrUpdate(), lock( ) ou replicate() devient persistant. 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 ne garantit pas l'identification. . L'identifiant est immédiatement renseigné dans l'instance persistante, et le remplissage de l'identifiant peut être retardé jusqu'au moment du vidage 2. La méthode persist() garantit qu'elle ne sera pas déclenchée lors de son appel ; en dehors d'une transaction. Lorsqu'une instruction INSERT doit encapsuler 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 doit donc renvoyer un identifiant ; it L'instruction INSERT sera exécutée immédiatement, que ce soit à l'intérieur ou à l'extérieur de la transaction. Quant à la différence entre la méthode lock() et la méthode update(), la méthode update() consiste à changer un objet qui a été modifié dans un état détaché en un état persistant ; La méthode consiste à modifier un objet qui n'a pas été modifié. Un objet dans un état détaché devient un état persistant.Explique le processus de chargement des objets d'entité dans Session.
1. Avant d'appeler la fonction de requête de base de données, 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, il retournera directement ; 2. S'il n'y a aucun résultat dans le cache de premier niveau, la session recherchera alors dans l'enregistrement NonExists actuel (équivalent à une liste noire de requêtes. S'il y a des requêtes invalides répétées, un un jugement peut être fait rapidement pour améliorer les performances). Si la même condition de requête existe dans NonExists, renvoie null 3 Si la requête du cache de premier niveau échoue, interrogez le cache de deuxième niveau. niveau cache atteint, renvoie directement 4. Si avant Si aucune des requêtes n'est répondue, une instruction SQL sera émise si l'enregistrement correspondant n'est pas trouvé dans la requête, la requête sera ajoutée au. NonExists de la session à enregistrer, et null sera renvoyé ; 5 Obtenu selon la configuration du mappage et l'instruction SQL ResultSet, et créer l'objet d'entité correspondant 6. objet dans la gestion de la session (cache de niveau un) ; 7 s'il existe un intercepteur correspondant, exécutez la méthode onLoad de l'intercepteur 8. utilisez le cache de deuxième niveau, l'objet de données sera inclus dans le cache de deuxième niveau 9.# Traitez les données entrantes comme une chaîne et ajoutez automatiquement des guillemets aux données entrantes $ will Les données saisies sont directement ; affiché et généré en SQL.
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 #.
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 définie dans cet espace de noms un ID.
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.
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 des fonctionnalités SQL dynamiques pour résoudre ce problème. Les éléments utilisés pour implémenter le SQL dynamique dans MyBatis incluent principalement :
- if - choose / when / otherwise - trim - where - set - foreach
Exemples d'utilisation :
<select id="foo" parameterType="Blog" resultType="Blog"> select * from t_blog where 1 = 1 <if test="title != null"> and title = #{title} </if> <if test="content != null"> and content = #{content} </if> <if test="owner != null"> and owner = #{owner} </if> </select>
Quelles sont les lacunes de la programmation JDBC et comment MyBatis les résout Ces questions ?
1. JDBC : la création et la libération 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 considérablement 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, et les espaces réservés doivent correspondre aux paramètres. en tête-à-tête.
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 dans pojo. objets.
MyBatis : Mybatis mappe automatiquement les résultats d'exécution SQL aux objets Java.
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, mais mybatis peut configurer de manière flexible les instructions SQL à exécuter via XML ou des annotations. . Et mappez les objets Java et les instructions SQL pour générer le SQL final exécuté, et enfin mappez les résultats de l'exécution de SQL pour générer des objets 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. Il est très flexible et convient parfaitement au développement de logiciels qui ne nécessitent pas. modèles de données relationnels élevés, tels que les logiciels Internet, les logiciels d'exploitation d'entreprise, etc. Étant donné que les besoins de ce type de logiciel changent fréquemment, une fois les besoins modifiés, les résultats doivent être générés rapidement.
Mais le principe de la 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 de 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 faire un compromis entre performances et modèle objet, et. comment bien utiliser Hibernate nécessite une solide expérience et des capacités. à partir d'un environnement de ressources limité, tant que nous pouvons créer une architecture logicielle avec une bonne maintenabilité et une bonne évolutivité en fonction des besoins des utilisateurs.
(Vous pouvez également parler en fonction de votre propre compréhension ici, ne soyez pas submergé)
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 dans le cache et le renvoie sans passer par le cache. 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.
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!