في المقالة السابقة ، قدمت الفرق بين المعلمات # {} و $ {} والفرق بين # و $ في myBatis. إذا كنت في حاجة إليها ، يمكنك الرجوع إليها.
وصف $ و # بسيط:
# يعادل إضافة عروض أسعار مزدوجة إلى البيانات ، و $ يعادل عرض البيانات مباشرة.
1. ملخص
عند استخدام SQLMAP لاستعلام SQL في MyBatis ، غالبًا ما يكون من الضروري تمرير المعلمات ديناميكيًا. Dynamic SQL هي واحدة من الميزات القوية لـ MyBatis وسبب مهم لتفوق أطر ORM الأخرى. قبل تجميع بيان SQL ، ستقوم MyBatis بتحليل SQL وتحليلها في كائن BODEDSQL ، والذي تتم معالجته أيضًا هنا. في مرحلة تحليل SQL الديناميكية ، سيكون لدى #{} و $ {} أداء مختلف ، وسيتم تحليل #{} في علامة معلمة لبيان JDBC مسبق.
يتم تحليل #{} في عنصر نائب للمعلمة؟ . $ {} هو مجرد استبدال السلسلة الخالصة ، وسيتم إجراء استبدال متغير خلال مرحلة تحليل SQL الديناميكية.
2. وصف الخلل
المعلمات الواجهة الأمامية:
تخطي: 0
خذ: 10
اسم القواعد: أ ، ب ، ج
معالجة طبقة الأعمال:
حزمة SQL ؛/*** Escape Front-Endency Multi-Select Parameters كمحتوى عبارة SQL*/الفئة العامة SQLUTIL {private Final Static String REPLACECHAR_COMMA = "،" ؛ "abc" ؛ system.out.println ("مفصولة الفاصلة:" + formatinstr (s1)) ؛ system.out.println ("مفصل الفضاء:" + formatinstr (s2)) ؛} سلسلة ثابتة خاصة (static staticstr (String Querystr) {return queryinstr (spiletreystr (querystr) ؛ QueryStr) {if (null == QueryStr || "" .equals (Querystr.trim ())) return null ؛ Querystr = Querystr.Replaceall (sqlutil.replacechar_comma ، "") .Replaceall (reprapechar_semicolon ، QueryStr.split ("// s+") ؛} QueryIntr QueryIntr QueryIntr (String [] QueryStrs) {if (null == QueryStrs || 0 == QueryStrs.length) return null ؛ stringbuffer buf = new StringBuffer () ؛ for (int i = 0 ؛ buf.append ("،") ؛ buf.append ("''). إلحاق (QueryStrs [i]). معالجة طبقة Mapper:
// معالجة الأخطاء <if test = "rulename! = null و ruleName! = ''"> و a.rule_name in (#{rulename}) </if if> // الصحيح معالجة <test = "rulename! = null و rulename! = ''" وصف السجل:
[Debug] [2016-08-02 17: 42: 42.226] [qtp1457334982-157] java.sql.connection-==> التحضير: Select A.ID ، A.IS_Valid ، a.rule_lable ، a.rule_name ، A.Type ، B.Sp_D ، a.gmt_modified ، a.ordering من idc_logistics_assign_rules انضمام اليسار app_user c على c.work_no = a.modifier و c.is_deleted = 'n' ، idc_sp_info b where a.is_delet = 'n' و b.edleted = 'n' و a.sp_id = ؟ [Debug] [2016-08-02 17: 42: 42.226] [QTP1457334982-157]
تحليل النتائج: تحتوي طبقة Mapper على SQL مسبقًا ، وهناك أصحاب نائبة لـ #؟ ، ولكن سيتم استبداله مباشرة مقابل دولار.
ملاحظة: عند استخدام الطلب بواسطة المعلمات الديناميكية عند فرز myBatis ، تحتاج إلى الانتباه إلى استخدام $ بدلاً من #
استبدال السلسلة
بشكل افتراضي ، يؤدي استخدام بناء جملة Format #{} إلى إنشاء خاصية بيان معالجة مسبقًا وتعيين قيمة آمنة معها كخلفية (مثل؟). هذا آمن وسريع ، وأحيانًا تريد فقط إدخال سلسلة لا تتغير مباشرة إلى عبارة SQL. على سبيل المثال ، مثل الترتيب ، يمكنك استخدامه مثل هذا:
نسخة الكود كما يلي:
اطلب بواسطة $ {columnName}
هنا لن يقوم MyBatis بتعديل أو سلاسل الهروب.
هام: ليس من الآمن قبول إخراج المحتوى من المستخدم وتوفيره لسلسلة غير متغيرة في البيان. يمكن أن يؤدي ذلك إلى هجمات حقن SQL المحتملة ، لذلك يجب ألا تسمح للمستخدمين بدخول هذه الحقول ، أو عادةً ما يهربون ويفحصونها بنفسك.