Im vorherigen Artikel habe ich den Unterschied zwischen den Parametern # {} und $ {} und den Unterschied zwischen # und $ in mybatis eingeführt. Wenn Sie es brauchen, können Sie sich darauf verweisen.
$ und # einfache Beschreibung:
# entspricht dem Hinzufügen von Doppelzitaten zu den Daten und $ entspricht der direkten Anzeige der Daten.
1. Zusammenfassung
Bei Verwendung von SQLMAP für SQL -Abfrage in MyBatis ist es häufig erforderlich, Parameter dynamisch zu übergeben. Dynamic SQL ist eines der leistungsstarken Merkmale von MyBatis und ein wichtiger Grund, warum es anderen Orm -Frameworks überlegen ist. Vor der Vorkompetenz der SQL -Anweisung wird MyBatis die SQL dynamisch analysiert und in ein BoundSQL -Objekt analysiert, das auch hier verarbeitet wird. In der dynamischen SQL Parsing -Phase haben #{} und $ {} unterschiedliche Leistungen, und #{} wird in einen Parametermarker für eine vorkompilierte JDBC -Anweisung analysiert.
A #{} wird in einen Parameter -Platzhalter analysiert? . $ {} ist nur ein reiner String -Ersatz, und während der dynamischen SQL -Parsing -Stufe wird ein variabler Ersatz durchgeführt.
2. Fehlerbeschreibung
Front-End-Parameter:
Überspringen: 0
Nehmen Sie: 10
REGELAME: A, B, c
Geschäftsschichtverarbeitung:
Paket SQL;/*** Escape Front-End-Multi-Select-Parameter als SQL-Anweisungsinhalt*/public class SQLUTIL {private endgültige statische String-String-Ersetzungs-Streicher-String-String-String-String-String-String-String-String-String-String-String-String-String. "Abc"; QueryStr) {if (null == querystr || "" .Equals (querystr.trim ()) return null; querystr = querystr.replaceall (SQLUTIL.REPLACECHAR_COMMA, ") .Replaceall (SuspeplaceCarl (Supendaryechar_Semicolon,"); "). queryStr.split ("// s+");} private statische String queryInStr (String [] queryStrs) {if (null == queryStrs || 0 == queryStrs.Length) return null; StringBuffer bufer bufer = new StringBuffer (); buf.append (","); buf.append ("'"). append (querystrs [i]). append ("'");} return buf.toString ();}} Mapper -Schichtverarbeitung:
// Fehlerbehandlung <if test = "relumeName! = Null und relumeName!
Protokollbeschreibung:
[DEBUG] [2016-08-02 17:42:42.226] [qtp1457334982-157] java.sql.Connection - ==> Preparing: SELECT a.id, a.is_valid, a.rule_lable, a.rule_name, a.type, b.sp_id, b.sp_name, a.rule_content, c.user_name, a.gmt_modified, a.ordering FROM idc_logistics_assign_rules a LEFT JOIN app_user c on c.work_no=a.modifier and c.is_deleted='n', idc_sp_info b WHERE a.is_deleted = 'n' AND b.is_deleted = 'n' AND a.sp_id = b.sp_id AND a.rule_name IN (?) ORDER BY ordering asc limit ?, ? [Debug] [2016-08-02 17: 42: 42.226] [QTP1457334982-157] Java.sql.PrepararedStatement-==> Parameter: 'A', 'B' (String), 0 (integer), 10 (Integer)
Ergebnisse Analyse: Die Mapper -Schicht hat SQL vorkompiliert, und es gibt Platzhalter für #? , aber es wird direkt für $ ersetzt.
PS: Wenn Sie die Bestellung nach dynamischen Parametern beim Sortieren von MyBatis verwenden, müssen Sie darauf achten, $ anstelle von # zu verwenden
Saitenersatz
Die Verwendung der #{} -Format -Syntax führt standardmäßig zu MyBatis, um eine vorverarbeitete Anweisung Eigenschaft zu erstellen und einen sicheren Wert damit als Hintergrund festzulegen (z. B.?). Dies ist sicher und schnell, und manchmal möchten Sie nur eine Zeichenfolge einfügen, die nicht direkt in die SQL -Anweisung ändert. Zum Beispiel können Sie wie Order by es so verwenden:
Die Codekopie lautet wie folgt:
Bestellung von $ {columnName}
Hier wird MyBatis keine Zeichenfolgen ändern oder entkommen.
Wichtig: Es ist nicht sicher, die Inhaltsausgabe vom Benutzer zu akzeptieren und eine unveränderte Zeichenfolge in der Anweisung zu geben. Dies kann zu potenziellen SQL -Injektionsangriffen führen, sodass Sie den Benutzern nicht erlauben sollten, diese Felder zu betreten oder normalerweise selbst zu entkommen und selbst zu überprüfen.