لقد كنت أستخدم ORM Framework MyBatis ، وقد استخدمت بعض الوظائف الشائعة في MyBatis. اليوم ، في تطوير المشروع ، هناك عمل يتطلب تقييد المستخدمين من الاستعلام عن الحقول في جداول معينة وما إذا كان يتم عرض حقول معينة ، مثل بعض الحقول في جدول معين لا يُسمح بالاستعلام عنها من قبل المستخدمين. في هذه الحالة ، من الضروري إنشاء SQL لتمرير أسماء الجدول وأسماء الحقول ديناميكيًا. الآن سألخص الحل ، وآمل أن يكون مفيدًا لشركائي الذين يواجهون نفس المشكلة.
Dynamic SQL هي واحدة من الميزات القوية لـ MyBatis. قبل توحيد عبارات SQL ، ستقوم MyBatis بتحليل SQL بشكل ديناميكي وتحليلها في كائن BODEDSQL ، والذي تتم معالجته أيضًا هنا. دعنا نتعرف أولاً على استخدام #{} و $ {} في MyBatis:
في عملية تحليل SQL الديناميكية ، تختلف تأثيرات #{} و $ {}:
#{} تم تحليلها كعلامة معلمة لبيان JDBC مسبق.
كما هو موضح في بيان SQL التالي
حدد * من المستخدم حيث name = #{name} ؛سيتم تحليلها على النحو التالي:
حدد * من المستخدم أين الاسم =؟ ؛
هل يمكنك رؤية #{} يتم تحليلها في عنصر نائب للمعلمة؟ .
$ {} هو مجرد استبدال السلسلة الخالصة. سيتم إجراء استبدال متغير خلال مرحلة تحليل SQL الديناميكية ، مثل عبارة SQL التالية:
حدد * من المستخدم حيث name = $ {name} ؛عندما نمر المعلمة "Sprite" ، سوف SQL تحليلًا على النحو التالي:
حدد * من المستخدم حيث name = "sprite" ؛
يمكنك أن ترى أن عبارة SQL قبل precompilation لم تعد تحتوي على اسم متغير.
باختصار ، تكون مرحلة الاستبدال للمتغير $ {} في مرحلة تحليل SQL الديناميكية ، في حين أن استبدال متغير #{} في DBMS.
يمكن تلخيص الفرق بين #{} و $ {} ببساطة على النحو التالي:
#{} يعامل المعلمة التي تم تمريرها كسلسلة ويضيف اقتباسًا مزدوجًا إلى المعلمة التي تم تمريرها
ستعرض $ {} مباشرة المعلمات التي تم تمريرها في SQL ، وسيتم إضافة أي علامات اقتباس
#{} يمكن أن يمنع حقن SQL في Chengdu ، لكن $ {} لا يمكنه منع حقن SQL
تم استبدال $ {} بمتغيرات قبل الولادة المسبقة ، مما يشكل خطر حقن SQL. كما يلي SQL
حدد * من $ {tableName} حيث الاسم = $ {name}إذا كان المعلمة Tablename التي تم تمريرها هو المستخدم ؛ حذف المستخدم ؛ -، ثم بعد التحليل الديناميكي SQL ، ستصبح SQL قبل prepompilation:
حدد * من المستخدم ؛ حذف المستخدم ؛ - أين الاسم =؟ ؛
-لن تعمل البيانات اللاحقة كتعليقات ، وأصدقائي أنا وأصدقائي! ! ! هل رأيت أن بيان الاستعلام الأصلي يحتوي سراً على SQL الذي يحذف بيانات الجدول ، وهو حذف وحذف وحذف! ! ! قلت أشياء مهمة ثلاث مرات ، ويمكنك أن تتخيل كم هي خطر كبير.
يستخدم $ {} بشكل عام لنقل اسم الجدول واسم الحقل وما إلى ذلك من قاعدة البيانات.
حاول عدم استخدام $ {} حيث يمكنك استخدام #{}
الذهاب إلى الموضوع ، من خلال التحليل أعلاه ، أعتقد أنه قد يكون لديك بعض الأفكار حول كيفية استدعاء أسماء الجدول وأسماء الحقول ديناميكيًا. الأمثلة على النحو التالي:
<select id = "getUser" resultType = "java.util.map" parametertype = "java.lang.string" stateTyType = "state"> حدد $ {أعمدة} من $ {tablename} حيث company_remark = $ {company} </select>لتنفيذ أسماء جدول المكالمات الديناميكية وأسماء الحقول ، لا يمكن استخدام premompilation. تحتاج إلى إضافة stateTyType = "بيان" ".
stateTytype: أي من البيان (غير المُعين) أو إعداده (مسبقًا) أو قابلاً للاستدعاء ، والذي يخبر MyBatis باستخدام البيان أو الجهة المعد أو callablestateMent على التوالي. الافتراضي: أعدت. من الواضح أنه لا يمكن استخدام premompilation هنا ، يجب تغييره إلى غير مُعد.
ثانياً ، قيمة المتغير في SQL هي $ {xxx} ، وليس #{xxx}.
نظرًا لأن $ {} هو عرض المعلمات التي تم تمريرها مباشرة لإنشاء SQL ، على سبيل المثال ، فإن المعلمات التي تم تمريرها في $ {xxx} هي بيانات سلسلة ، وينبغي إضافة علامات الاقتباس قبل تمرير المعلمة ، مثل:
string name = "sprite" ؛ name = "" " + name +" '"؛
لخص
ما ورد أعلاه هو الحل لاسم جدول الاتصال الديناميكي MyBatis واسم الحقل الذي قدمه لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!
تم استنساخ هذه المقالة من: http://www.yuanrengo.com/index.php/mybatis1021.html