لقد استخدمت MyBatis مؤخرًا. لقد استخدمت ibatis من قبل. بشكل عام ، إنه مشابه ، لكنني ما زلت واجهت العديد من المشاكل. سوف أسجلها مرة أخرى.
على سبيل المثال ، الفرق بين استخدام Transmission #{} و $ {}
استخدم # لتمرير المعلمة ، وسيقوم تحليل عبارة SQL بإضافة "" ، على سبيل المثال ، حدد * من الجدول WHERE NAME = # {name} ، الاسم الذي تم تمريره هو Xiao Li
حدد * من الجدول حيث name = 'xiao li' ، وسيتم تحليله كسلسلة. من الواضح أن هذا أفضل من دولار. يمكن أن تمنع تمرير المعلمة #{} حقن SQL. إذا كانت المعلمة التي تنقلها هي علامات اقتباس واحدة ، فإذا كنت تستخدم $ {} ، فستبلغ هذه الطريقة عن خطأ.
سيناريو آخر هو أنه إذا كنت تريد القيام بالفرز الديناميكي ، مثل الطلب حسب العمود ، تأكد من استخدام $ {} في هذا الوقت ، لأنه إذا كنت تستخدم #{} ، فسيكون المطبوع
حدد * من ترتيب الجدول عن طريق "الاسم" ، هذا عديم الفائدة ،
في الوقت الحاضر ، إذا كنت تستطيع استخدام #، فلا تستخدم $.
الفرق بين # و $ في mybatis
1. # تعامل مع جميع البيانات الواردة كسلسلة ، وأضف عروض أسعار مزدوجة إلى البيانات الواردة تلقائيًا. على سبيل المثال: اطلب بواسطة #user_id #، إذا كانت القيمة التي تم تمريرها هي 111 ، فإن القيمة عند التحليل في SQL هي أمر "111". إذا كانت القيمة التي تم تمريرها هي معرف ، فإن التحليل في SQL هو أمر من خلال "ID".
2. $ يعرض البيانات التي تم تمريرها مباشرة وإنشاءها في SQL. على سبيل المثال: اطلب بواسطة $ user_id $ ، إذا كانت القيمة التي تم تمريرها هي 111 ، فإن القيمة عند تحليلها في SQL يتم طلبها بواسطة user_id. إذا كانت القيمة التي تم تمريرها هي معرف ، فإن التحليل في SQL هو أمر حسب المعرف.
3. يمكن أن تمنع طريقة # بشكل كبير حقن SQL.
4. طريقة $ لا يمكن أن تمنع حقن SQL.
5. يتم استخدام طريقة $ بشكل عام لتمرير كائنات قاعدة البيانات ، مثل تمرير أسماء الجدول.
6. عمومًا ، إذا كنت تستطيع استخدام #، فلا تستخدم $.
عند استخدام الطلب حسب المعلمات الديناميكية عند فرز MyBatis ، تحتاج إلى الانتباه إلى استخدام $ بدلاً من #
استبدال السلسلة
بشكل افتراضي ، يؤدي استخدام بناء جملة Format #{} إلى إنشاء خاصية بيان معالجة مسبقًا وتعيين قيمة آمنة معها كخلفية (مثل؟). هذا آمن وسريع ، وأحيانًا تريد فقط إدخال سلسلة لا تتغير مباشرة إلى عبارة SQL. على سبيل المثال ، مثل الترتيب ، يمكنك استخدامه مثل هذا:
اطلب بواسطة $ {columnName}
هنا لن يقوم MyBatis بتعديل أو سلاسل الهروب.
هام: ليس من الآمن قبول إخراج المحتوى من المستخدم وتوفيره لسلسلة غير متغيرة في البيان. يمكن أن يؤدي ذلك إلى هجمات حقن SQL المحتملة ، لذلك يجب ألا تسمح للمستخدمين بدخول هذه الحقول ، أو عادةً ما يهربون ويفحصونها بنفسك.
ملخص موجز للفرق بين $ و # في mybatis
منذ وقت ليس ببعيد ، جاء شخص ما إلى شركتنا لإجراء مقابلة. طرح مديرنا هذا السؤال. لم يكن لدي سوى القليل من الفهم ، لذلك ذهبت إلى بايدو.
في الواقع ، الفرق بسيط للغاية. سوف تفهمه بمثال. اكتب جملة SQL-for مثال: حدد * من user_role حيث user_code = "100" ؛
في هذه الجملة ، يجب كتابتها على أنها حدد * من $ {tableName} حيث user_code = #{usercode}
لذلك ، يتم تهجئة حرف $ في SQL مباشرة ، بينما سيتم تهجئة الحرف # مع SQL في شكل سلسلة.