الفرق بين # و $ في mybatis
1. # تعامل مع جميع البيانات الواردة كسلسلة ، وأضف عروض أسعار مزدوجة إلى البيانات الواردة تلقائيًا. على سبيل المثال: اطلب بواسطة #user_id #، إذا كانت القيمة التي تم تمريرها هي 111 ، فإن القيمة عند التحليل في SQL هي أمر "111". إذا كانت القيمة التي تم تمريرها هي معرف ، فإن التحليل في SQL هو أمر من خلال "ID".
2. $ يعرض البيانات التي تم تمريرها مباشرة وإنشاءها في SQL. على سبيل المثال: اطلب بواسطة $ user_id $ ، إذا كانت القيمة التي تم تمريرها هي 111 ، فإن القيمة عند تحليلها في SQL يتم طلبها بواسطة user_id. إذا كانت القيمة التي تم تمريرها هي معرف ، فإن التحليل في SQL هو أمر حسب المعرف.
3. يمكن أن تمنع طريقة # بشكل كبير حقن SQL.
4. طريقة $ لا يمكن أن تمنع حقن SQL.
5. يتم استخدام طريقة $ بشكل عام لتمرير كائنات قاعدة البيانات ، مثل تمرير أسماء الجدول.
6. عمومًا ، إذا كنت تستطيع استخدام #، فلا تستخدم $.
منع حقن SQL
ملاحظة: لا تكتب عبارات SQL كـ SELECT * من T_STU حيث S_NAME مثل "٪ $ name $ ٪" ، وهو أمر معرض للغاية لهجمات الحقن.
ستشارك المعلمات في التنسيق "$ {xxx}" مباشرة في تجميع SQL ، وبالتالي منع هجمات الحقن. ومع ذلك ، عندما يتعلق الأمر بأسماء الجدول الديناميكية وأسماء الأعمدة ، يمكنك فقط استخدام تنسيقات المعلمة مثل "$ {xxx}".
عند كتابة عبارات تعيين MyBatis ، حاول استخدام التنسيق "#{xxx}". إذا كان عليك استخدام معلمات مثل "$ {xxx}" ، فيجب عليك القيام بعمل جيد في التصفية يدويًا لمنع هجمات حقن SQL.
مثال
<sql id = "inction_where" "> <isnotempty property =" CompanyName "prepend =" و "> t1.company_name مثل # companyname # </isnotempty> </sql>
يشبه رمز Java الخاص بك الأصلي ، ولكن لا حرج في ذلك. إذا كنت تعتقد أنه من المقلق أن نغلف الحكم الفارغ و "٪" في طريقة واحدة.
if (! stringUtil.isempty (this.companyname)) {table.setCompanyname ("٪" + this.companyname + "٪") ؛ }ما سبق هو مناقشة موجزة حول الفرق بين # و $ في MyBatis وطريقة منع حقن SQL. آمل أن يدعم الجميع wulin.com أكثر ~