يعرف الجميع بشكل أساسي كيفية استخدام MyBatis لتنفيذ SQL التعسفي. طريقة الاستخدام بسيطة للغاية ، على سبيل المثال ، في xxmapper.xml:
<حدد ID = "executesql" resultType = "MAP"> $ {_ parameter} </rection>يمكنك تسميته على النحو التالي:
sqlsession.selectlist ("executesql" ، "select * from sysuser حيث تم تمكين = 1") ؛أو يمكنك تحديد الطريقة التالية في واجهة xxmapper.java:
قائمة <map> executesql (String SQL) ؛
ثم استخدم الواجهة لاستدعاء الطريقة:
xxmapper.executesql ("حدد * من sysuser حيث تم تمكين = 1") ؛قد تكون جميع المحتويات المذكورة أعلاه ، وما يلي أكثر تعقيدًا بقليل بناءً على هذا.
إذا كنت ترغب في تمرير القيمة باستخدام طريقة المعلمة في SQL أعلاه ، أي ، اكتبها على أنها ممكّنة = #{Enupper} ، إذا لم تكن قد واجهت مثل هذه الاحتياجات ، فقد لا تفهم سبب كتابتك مثل هذا. على سبيل المثال ، لتنفيذ استعلام ديناميكي ، يمكنك تكوين SQL في المقدمة وتوفير بعض شروط الاستعلام لتحقيق وظيفة الاستعلام (من أجل السلامة ، يجب تطوير هذه التكوينات أو تنفيذها ، ومن المستحيل تشغيل المستخدمين قاعدة البيانات مباشرة).
لهذه الميزة ، من السهل جدًا تنفيذها باستخدام MyBatis. يجب تنفيذ تكوين SQL. يمكن تنفيذ SQL في الطريقة المذكورة أعلاه. كيفية تقديم المعلمات؟ المعلمة هي الجزء #{Enupper} في Enabled = #{Enupper}. إذا كان هناك المزيد من الشروط ، فإن SQL المكوّن هو كما يلي:
حدد * من sysuser حيث يتم تمكين = #{Enupper} واسم المستخدم مثل concat ('٪' ، #{username} ، '٪')في هذه الحالة ، كيف يمكنني استخدام MyBatis لتنفيذها؟
أولاً ، يتم تعديل XML على النحو التالي:
<حدد ID = "executesql" resultType = "MAP"> $ {SQL} </rection>يتم تعديل الطرق في الواجهة إلى:
قائمة <map> executesql (خريطة الخريطة) ؛
ثم اتصل بالطريقة:
MAP MAP = NEWHHMAP () ؛ // يتوافق SQL هنا مع $ {sql} map.put ("sql" ، "SELECT * from sysuser"+ "where enabled =#{enabled}"+ "and username like concat ('٪' ،#{username} ، '٪')") 1) ؛ //#{username} map.put ("username" ، "admin") ؛ // إدراج قائمة المكالمات <map> list = xxmapper.executesql (map) ؛ // the sqlsession method calls sqlsession.selectlist ("executesql" ، map) ؛باستخدام SQL هذا ، يمكنك توفير تمكين واسم المستخدم كظروف للمستخدم. من الواضح أن هذين الشرطين مطلوبان. إذا كان اختياريًا ، فكيف يمكنني كتابته؟
ربما فكر أحدهم فيما إذا كان من الممكن استخدام SQL الديناميكي في MyBatis ، استخدم <f> العلامات ، إلخ؟
قبل الإجابة على هذا السؤال ، دعونا نلقي نظرة على الكود في DynamicQlSource الذي يتولى SQL الديناميكي:
Override public boundsql getBoundSql (Object parameterObject) {dynamicContext context = new DynamicContext (التكوين ، parameterObject) ؛ rootsqlnode.apply (context) ؛ sqlsourceBuilder sqlsourceparser = new sqlsourceBuilder (confignytertypift =؟ object.class: parameterObject.getClass () ؛ sqlsource sqlsource = sqlsourceparser.parse (context.getsql () ، parametertype ، context.getBindings ()) ؛ boundsql = sqlsource.getboundsql (parameterObject) ؛ لـ (map.entry <string ، Object> الإدخال: context.getBindings (). interset ()) {boundsql.setAdditionalParameter (intrad.getKey () ، intradvalue ()) ؛} الإرجاع boundsql ؛}عندما يتعامل MyBatis مع SQL الديناميكي ، ستتم معالجة جميع علامات SQL الديناميكية ككائنات sqlnode (rootsqlnode هنا) ، وسيتم أيضًا معالجة تلك التي تحتوي على $ {} ككائنات textsqlnode. في أول خطين من الطريقة أعلاه ، حيث يتعامل MyBatis مع SQL الديناميكي.
لذلك ، إذا كان المحتوى الخاص بنا في $ {sql} يحتوي على علامات متداخلة مثل $ {} و <if> ، <here> ، والعلامات الأخرى ، عندما يقوم MyBatis بتحليل XML إلى كائنات sqlnode ، سيتم تحليل XML <select> فقط $ {sql} ، و $ {sql} فقط. في وقت التشغيل ، قد تحتوي سلسلة المعلمة هذه على علامات مثل $ {} و <if> ، <حيث> ، وما إلى ذلك ، ولكن هذا يحدث بعد تحليل MyBatis. لذلك ، عندما تظهر هذه المحتويات كجزء من السلسلة ، لن تتم معالجتها خصيصًا. إنها جزء فقط من SQL ، وهي مجرد إخراج كما هي (لأن قاعدة البيانات لا تتعرف عليها ، فستبلغ عن خطأ) ولا يمكن معالجتها. لذلك ، لا يمكن أن تكتب SQL الديناميكي من خلال الطريقة التي تأتي مع MyBatis.
تَلمِيح
في الكود أعلاه:
sqlSourceParser.parse (context.getsql () ، parametertype ، context.getBindings ()) ؛
تعالج قطعة الكود هذه المعلمات الديناميكية (#{}) بعد معالجة SQL الديناميكية ، بحيث يمكن استخدام هذا النوع من المعلمات في SQL.
نظرًا لأنه لا يمكنك استخدام طريقة SQL الديناميكية MyBatis ، كيفية تنفيذ Dynamic SQL؟
هذه فكرة بسيطة. استخدم لغة ترميز القالب في SQL لتنفيذ SQL الديناميكي (مثل Freemarker). قبل تسليم SQL إلى MyBatis للتنفيذ ، استخدم القوالب لمعالجة SQL لإنشاء SQL النهائي المنفذة (تحتاج إلى تجنب معالجة المعلمات #{}) ، وتسليم هذا SQL إلى MyBatis للتنفيذ.
خذ مثالًا على قالب علامة تجزئة ، ولا يزال SQL أعلاه يعتمد على:
حدد * من sysuser حيث 1 = 1 <##تمكين ؟؟ && اسم المستخدم! = ''> واسم المستخدم مثل concat ('٪' ،#{username} ، '٪') </#if>لاحظ أن <#if> هنا هو عنصر Freemarker. دون النظر في حقن SQL ، يمكن أيضًا كتابة SQL أعلاه على النحو التالي:
حدد * من sysuser حيث 1 = 1 <##تمكين ؟؟ && اسم المستخدم! = ''> واسم المستخدم مثل '٪ $ {username} ٪' </#if>الفرق هو '٪ $ {username} ٪' ، لأن Freemarker ستعالج أيضًا $ {username} وسيحل أيضًا محل المعلمات هنا بالقيمة الفعلية.
في الكود المسمى سابقًا ، يكون التعديل كما يلي:
//# {enable) map.put("eenabled "، 1) ؛ //#{username} map.put (" username "،" admin ") ؛ // sql هنا يتوافق مع $ {sql} MAP) ؛ // ضع SQL المعالجة في MAP MAP.PUT ("SQL" ، "SELECT * FROM SYSUSER"+ "حيث تمكين = #{Enupper}"+ "واسم المستخدم مثل CONCAT ('٪' ، #{username} ، '٪')")ملاحظة: تتمثل طريقة ProcessSqlbyFreemarker في معالجة سلاسل SQL بناءً على البيانات الموجودة في الخريطة ، ويمكن البحث في طريقة التنفيذ بنفسك.
في هذه المرحلة ، يتم تنفيذ وظيفة SQL ديناميكية غير معقدة للغاية.
أتساءل عما إذا كان هناك المزيد من الناس الجشعين. هل تعتقد أن القيم التي تم إرجاعها أعلاه هي كلها قائمة <map>. هل يمكنك إرجاع فئة كيان حددتها؟
على سبيل المثال في الخريطة:
map.put ("class" ، "tk.mybatis.model.sysuser") ؛هل يمكنني جعل قيمة الإرجاع تصبح نوعًا من الأناقة بهذه الطريقة؟ نظرًا لأن هذه المقالة استغرقت وقتًا طويلاً ، سأقدم حلاً هنا ، وليس متعمقًا.
يمكنك استخدام اعتراض لتنفيذه. بعد الحصول على MedpedStatement ، نسخ نسخة ، ثم تعديل سمة النوع لنتيجة ResultMap في نتائج تحديد نوع الفئة لك. من السهل القول ، ولكن في العملية الفعلية ، يمكنك الحصول على حوالي 1/10 من المكون الإضافي لترحيلات Helper.
نظرًا لأن هذا المقال كتب بناءً على طلب زوجتي ، إذا كانت زوجتي تلعب هذه الحاجة الأخيرة ، فسوف أساعد زوجتي على تنفيذ هذا المكون الإضافي ثم مشاركته.
ملاحظة: إذا كان تحديثًا ديناميكيًا ، إدراجًا ، حذفًا ، يمكنك تغيير ما ورد أعلاه <select> للتحديث (لا حاجة لاستخدام <selete> و <sert>) ، واستخدام int لقيمة الإرجاع ، وهو أمر أسهل بكثير من الاختيار.
ما سبق هو شرح مفصل لبيان SQL Dynamic Dynamic SQL الذي قدمه لك من قبل المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!