Maison > Article > base de données > Quelle est la différence entre #{} et ${} dans Mybatis ?
Je suis allé dans une entreprise pour un examen écrit il y a quelques jours, et l'une des questions était "Quelle est la différence entre #{} et ${} dans Mybatis ?". Pour être honnête, je n'étais vraiment pas très clair à l'époque, car je n'avais pas moi-même appris grand-chose sur mybatis. Bien que mybatis ait été utilisé dans les projets récents, cela impliquait uniquement l'ajout, la suppression, la modification et la requête les plus élémentaires, entre plusieurs. les tableaux. La corrélation n’est presque jamais utilisée. Alors que #{} n'est utilisé que dans les fichiers de mappage du mappeur, ${} est utilisé dans les pages JS et JSP frontales. Plus tard, j'ai vérifié en ligne et j'ai découvert qu'il y avait encore une grande différence entre les deux. Maintenant, je résume les informations que j'ai trouvées comme suit pour faciliter la discussion et l'étude de chacun.
De manière générale, la différence entre les deux peut se résumer aux 6 points suivants :
(1) # Will Les données entrantes sont traitées comme une chaîne et un guillemet double est ajouté automatiquement aux données entrantes. Par exemple : trier par #user_id#, si la valeur transmise est 111, alors la valeur analysée dans SQL est triée par "111", si la valeur transmise est id, le SQL analysé est trié par " id ".
(2)$ affichera et générera directement les données entrantes en SQL. Par exemple : trier par $user_id$, si la valeur transmise est 111, alors la valeur analysée dans SQL est triée par user_id. Si la valeur transmise est id, le SQL analysé est trié par identifiant.
(3) La méthode # peut empêcher l'injection SQL dans une large mesure.
(4) La méthode $ ne peut pas empêcher l'injection SQL.
(5) La méthode $ est généralement utilisée pour transmettre des objets de base de données, tels que des noms de tables.
(6) Si vous pouvez généralement utiliser #, n'utilisez pas $.
ps : lors de l'utilisation de mybatis, j'ai également rencontré l'utilisation de . Les instructions contenues dans ce symbole ne seront pas traitées comme des chaînes, mais directement comme des instructions SQL. exécuter une procédure stockée.
Explication des exemples :
SQL dynamique est l'une des principales fonctionnalités de mybatis Une fois les paramètres définis dans le mappeur transmis au XML, mybatis les analysera dynamiquement avant l'interrogation. mybatis nous fournit deux syntaxes prenant en charge le SQL dynamique : #{} et ${}.
Dans l'instruction suivante, si la valeur de name est zhangsan, il n'y a aucune différence entre les deux méthodes :
select * from user where name = #{name};
select * from user where name = ${name};
Les résultats après analyse sont tous
select * from user where name = 'zhangsan';
Mais #{} et ${} sont traités différemment lors de la précompilation. #{} Lors du prétraitement, la partie paramètre sera remplacée par un espace réservé ? pour remplacer et devenir l'instruction SQL suivante :
select * from user where name = ?;
Et ${} n'est qu'un simple remplacement de chaîne Lors de l'étape d'analyse dynamique, l'instruction SQL sera analysée dans
select * from user where name = 'zhangsan';
ci-dessus, #{ Substitution de paramètre. of } se produit dans le SGBD, tandis que ${} se produit lors de l'analyse dynamique.
Alors, quelle méthode doit-on utiliser lors de l'utilisation ?
La réponse est : Utilisez d'abord #{}. Parce que ${} provoquera des problèmes d'injection SQL.
Regardez l'exemple suivant :
select * from ${tableName} where name = #{name}
Dans cet exemple, si le nom de la table est
utilisateur, supprimez l'utilisateur ; - -
Le SQL après l'analyse dynamique est le suivant :
select * from user; delete user; -- where name = ?;
--Les instructions suivantes sont commentées et l'instruction originale pour interroger les utilisateurs devient une interrogation toutes les instructions Users Information + qui suppriment les tables utilisateur causeront des dommages importants à la base de données et entraîneront très probablement un temps d'arrêt du serveur.
Mais lorsque le nom de la table est passé en paramètre, seul ${} peut être utilisé. Cela nous rappelle également de faire attention aux problèmes d'injection SQL dans cette utilisation.
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!