Dans l'article précédent, j'ai introduit la différence entre les paramètres # {} et $ {} et la différence entre # et $ dans mybatis. Si vous en avez besoin, vous pouvez vous y référer.
$ et # Description simple:
# équivaut à ajouter des devis doubles aux données, et $ équivaut à afficher directement les données.
1. Résumé
Lorsque vous utilisez SQLMAP pour la requête SQL dans MyBatis, il est souvent nécessaire de transmettre dynamiquement les paramètres. Dynamic SQL est l'une des caractéristiques puissantes de MyBatis et une raison importante pour laquelle il est supérieur aux autres cadres ORM. Avant de précompir l'instruction SQL, MyBatis analysera dynamiquement le SQL et l'analysera dans un objet BoundsQL, qui est également traité ici. Dans l'étape d'analyse SQL dynamique, # {} et $ {} auront des performances différentes, et # {} sera analysé dans un marqueur de paramètre pour une instruction précompilée JDBC.
Un # {} est analysé dans un espace réservé de paramètre? . $ {} est juste un remplacement de chaîne pur et le remplacement variable sera effectué pendant l'étape d'analyse SQL dynamique.
2. Description du bogue
Paramètres frontaux:
sauter: 0
Prendre: 10
Nom de règle: a, b, c
Traitement des couches commerciales:
package sql; / *** Escape les paramètres multi-sélections frontaux en tant que contenu de instruction SQL * / classe publique Sqlutil {private final static string remplacechar_comma = ","; private final static string remplacechar_semicolon = ";"; public static void main (string [] args) {string s1 = "a, b, c"; String s2 = "ABC"; System.out.println ("comma-séparé:" + formatinstr (s1)); System.out.println ("Space-Separated:" + Formatinstr (S2));} private Static String Formatinstr (String Querrystr) {return QueryInstr (SLALTQUERYS (QuerySTr));} STATIC STATIC STATIC (SLALTQUERYS (QuerySTR));} STATIC STATIC STATIC (SLALTQUERYS (QuerySTR));} STRATIC PRIVÉT QueryStr) {if (null == QueryStr || "" .equals (queryStr.trim ())) return null; queryStr = queryStr.replaceAll (sqlutil.replacechar_comma, "") .replaceall (rechaceChar_semicolon, ""); Static String QueryInStr (String [] QueryStrs) {if (null == QueryStrs || 0 == QueryStrs.Length) renvoie null; stringBuffer buf = new StringBuffer (); for (int i = 0; i <queterystrs.Length; i ++) {if (i! = 0) buf.append (","); buf.append ("'"). append (queyrystrs [i]). Traitement de la couche de mappeur:
// Gestion d'erreur <if test = "rulename! = Null et rulename! = ''"> Et a.rule_name dans (# {rulename}) </ if> // manipulation correcte <if test = "rulename! = Null et rulename! = '' '"> Et a.rule_name dans ($ {rulename}) </ if> Description du journal:
[Debug] [2016-08-02 17: 42: 42.226] [QTP1457334982-157] Java.Sql.Connection - ==> Préparation: SELECT A.ID, A.IS_VALID, A.RULE_LABLE, A.RULE_NAMENT, A.TYPE, B.SP_ID, B.SP_NAME, A.RULE_CONTENT, C.USER_NED, B.SP_NAME, A.RULE_CONT a.gmt_modified, A.Sorger à partir de idc_logistics_assign_rules a gauche jointe app_user c on c.work_no = a.modificier et c.is_deleted = 'n', idc_sp_info b où a.is_eleted = 'n' et b.is_deleted = 'n' et a.sp_id = b.sp_id et a.rule_name dans (?) ? [DEBUG] [2016-08-02 17: 42: 42.226] [QTP1457334982-157] Java.Sql.PreparedStatement - ==> Paramètres: 'A', 'B' (String), 0 (entier), 10 (entier)
Analyse des résultats: la couche de mappeur a précompilé SQL, et il y a des espaces réservés pour #? , mais il sera remplacé directement pour $.
PS: Lorsque vous utilisez l'ordre par paramètres dynamiques lors du tri MyBatis, vous devez faire attention à l'utilisation de $ au lieu de #
Remplacement des cordes
Par défaut, l'utilisation de la syntaxe de format # {} fait que MyBatis crée une propriété d'instruction prétraitée et définit une valeur de sécurité avec l'arrière-plan (tel que?). C'est sûr et rapide, et parfois vous voulez simplement insérer une chaîne qui ne change pas directement en instruction SQL. Par exemple, comme Order By, vous pouvez l'utiliser comme ceci:
La copie de code est la suivante:
Commande par $ {Columnname}
Ici, Mybatis ne modifiera ni ne s'échappera pas des chaînes.
Important: il n'est pas sûr d'accepter la sortie de contenu de l'utilisateur et de le fournir à une chaîne inchangée dans l'instruction. Cela peut conduire à des attaques d'injection SQL potentielles, vous ne devez donc pas permettre aux utilisateurs d'entrer ces champs, ou généralement de les échapper et de les vérifier vous-même.