مقدمة: ما هو MyBatis؟
(سابقًا Ibatis) MyBatis هو إطار طبقة الثبات يمكنه تخصيص SQL ، والإجراءات المخزنة ، والتعيينات المتقدمة. يزيل MyBatis الإعداد اليدوي لجميع كود ومعلمات JDBC تقريبًا واسترجاع مجموعة النتائج. يمكن لـ MyBatis استخدام XML البسيط أو التعليقات التوضيحية للتكوين والتعيين الأصلي ، ورسم الخرائط وواجهات Java (كائنات Java القديمة) في سجلات في قاعدة البيانات.
1. معلمة طبقة الخريطة هي خريطة ، وطبقة الخدمة مسؤولة عن التحميل الزائد.
بسبب مشاكل الآلية ، لا يمكن زيادة تحميل الخريطة. يتم تعيين المعلمات عمومًا على خريطة ، ولكن هذا سيجعل المعلمات ضبابية. إذا كنت ترغب في توضيح الكود ، فيمكنك تحقيق الغرض من التحميل الزائد من خلال طبقة الخدمة. تكون طبقة الخدمة المقدمة إلى الخارج محملة ، لكن طرق الخدمة الزائدة هذه هي في الواقع لضبط نفس الخريطة ، لكن المعلمات المقابلة ليست متسقة.
ربما قد يتساءل بعض الناس ، فلماذا لا يضبطونه على رسم خريطة في طبقة الخدمة؟ أنا شخصياً لا أوصي بهذا. على الرغم من أنني تبنت هذه الطريقة في مشاريعي السابقة للراحة ، إلا أنها ستؤدي بوضوح إلى مشكلة في أعمال الصيانة المستقبلية. لأن القيام بذلك سيجعل MVC بالكامل يعتمد على نموذج الخريطة. هذا النموذج هو في الواقع جيد للغاية ومريح لإنشاء إطار عمل ، ولكن هناك مشكلة: مجرد النظر إلى توقيع الطريقة ، لا تعرف الرقم والنوع ومعنى كل معلمة تمثلها الخريطة.
فقط تخيل ، إذا قمت فقط بتغيير طبقة الخدمة أو طبقة DAO ، فيجب أن تكون واضحًا بشأن المعلمات التي تم تمريرها بواسطة الخريطة في العملية بأكملها. ما لم تعلق أو لديك وثائق جيدة ، يجب أن تفهم رمز كل طبقة بوضوح قبل أن تعرف المعلمات التي يتم تمريرها. بالنسبة إلى MVC البسيط ، هذا جيد ، ولكن إذا كان المستوى معقدًا ، فسيصبح الرمز معقدًا للغاية ، وإذا أضفت معلمة ، فأنا بحاجة إلى إضافة التعليقات لكل طبقة. مقارنة بالتعليقات ، من الممكن استخدام توقيعات الطريقة لضمان إمكانية التحكم في هذا الكود ، لأن التعليقات قد تكون قديمة ، ولكن من غير المرجح أن تكون توقيعات الطريقة أمرًا غير مرغوب فيه.
2. حاول الاستخدام إذا كان الاختيار والبيانات الأخرى أقل ما يمكن لتقليل صعوبة الصيانة.
عند تكوين SQL في MyBatis ، حاول استخدام ملصقات أقل مثل IF IF. إذا كان من الممكن استخدام SQL لتحديد الحكم ، فحاول استخدام SQL (حالة عندما تكون ، إلخ ، إلخ) للصيانة اللاحقة. خلاف ذلك ، بمجرد أن تنفخ SQL ، فهي غثيان فائقة. إذا كنت بحاجة إلى تصحيح SQL في MyBatis ، فأنت بحاجة إلى إزالة عدد كبير من بيانات الحكم ، وهو أمر مزعج للغاية. من ناحية أخرى ، فإن عددًا كبيرًا من الأحكام ستؤدي إلى احتواء SQL تم إنشاؤها على عدد كبير من المساحات ، مما سيزيد من وقت نقل الشبكة ، وهو أمر غير مرغوب فيه أيضًا.
علاوة على ذلك ، فإن عددًا كبيرًا من البيانات إذا اخترت ، حتماً ، سيكون SQL الذي تم إنشاؤه غير متناسق في كل مرة ، مما سيؤدي إلى عدد كبير من التحليل الصعب لأوراكل ، وهو ما لا ينصح به أيضًا.
لنلقي نظرة على SQL مثل هذا:
<code style = "padding: 0.5em ؛ margin: 0px ؛ display: block ؛ color: rgb (101،123،131) ؛ overflow-x: auto ؛ background: rgb (253،246،227)"> <span style = "padding: 0px ؛ margin: 0px"> <span style = Color: RGB (133،153،0) " style = "padding: 0px ؛ margin: 0px ؛ color: rgb (42،161،152)"> 1 </span> = <span style = "padding: 0px ؛ margin: 0px ؛ color: rgb (42،161،152)"> 1 </span> <span style = "padding: 0px: 0px ؛ Color: RGB (133،153،0) style = "padding: 0px ؛ margin: 0px ؛ color: rgb (42،161،152)"> "startDate! = null and startDate! = '' and enddate! = null and end! = '' '</span> style =" padding: 0px ؛ #{startDate} <span style = "padding: 0px ؛ الهامش: 0px ؛ اللون: RGB (133،153،0) "> و </ span> publishTime <= #{enddate} </ <span style =" padding: 0px ؛ الهامش: 0px ؛ اللون: RGB (133،153،0) "> إذا كان </span> <Love> <span style =" padding: 0px ؛ الهامش: 0px ؛ اللون: RGB (133،153،0) "> و </span> publishTime> = <span style =" padding: 0px ؛ الهامش: 0px ؛ اللون: RGB (133،153،0) "> sysdate </span> - <span style =" padding: 0px ؛ الهامش: 0px ؛ اللون: RGB (42،161،152) "> 7 </span> <span style =" padding: 0px ؛ الهامش: 0px ؛ اللون: RGB (133،153،0) "> و </span> publishTime <= <span style =" padding: 0px ؛ الهامش: 0px ؛ اللون: RGB (133،153،0) "> sysdate </span> </romeal> </<span style =" padding: 0px ؛ الهامش: 0px ؛ اللون: RGB (133،153،0) "> sysdate </span> </romeal> </<span style =" padding: 0px ؛ الهامش: 0px ؛ اللون: RGB (133،153،0) "> اختر </span>> </span>مثل إذا كان الحكم في الواقع غير ضروري تماما. يمكننا ببساطة استخدام Decode لحل مشكلة القيمة الافتراضية:
<code style = "padding: 0.5em ؛ margin: 0px ؛ display: block ؛ color: rgb (101،123،131) ؛ overflow-x: auto ؛ background: rgb (253،246،227)"> <span style = "padding: 0px ؛ margin: 0px"> <span style = اللون: RGB (133،153،0) " <span style = "padding: 0px ؛ margin: 0px ؛ color: rgb (133،153،0)"> decode </span> (#{startDate} ، <span style = "padding: 0px ؛ margin: 0px"> null </span> ، <span style = "padding: 0px ؛ Color: RGB (133،153،0) اللون: RGB (133،153،0) "> و </span> publishtime <= span style =" padding: 0px ؛ الهامش: 0px "> null </span> ، <span style =" padding: 0px ؛ الهامش: 0px ؛ الهامش: 0px ؛ اللون: RGB (133،153،0) "> sysdate </span> ،#{enddate}) </span> </code>بالطبع ، قد يعتقد بعض الأشخاص أن تقديم حالة وفك الشفرة سوف تتطلب تحليل وظيفة Oracle ، مما سيؤدي إلى إبطاء وقت تنفيذ SQL. يمكن للطلاب المهتمين العودة وإجراء اختبار لمعرفة ما إذا كان هناك تأثير كبير. فيما يتعلق بالتجربة الشخصية ، لم أجد أي تباطؤ في SQL بسبب تحليل الوظائف. بشكل عام ، العمليات مثل الانضمام ، والترتيب من خلال ، متميزة ، من قبل ، وما إلى ذلك ، والتي ترتبط بشكل عام ارتباطا وثيقا بتصميم بنية الجدول. بالمقارنة مع درجة تأثير الكفاءة على هذه ، يجب أن يكون تأثير تحليل الوظيفة على سرعة تنفيذ SQL ضئيلًا.
نقطة أخرى هي أنه بالنسبة لبعض تعيينات القيمة الافتراضية ، مثل SQL أعلاه ، الإعدادات الافتراضية إلى التاريخ الحالي ، وما إلى ذلك ، يمكنك بالفعل ذكر طبقة الخدمة أو طبقة وحدة التحكم للمعالجة. يجب استخدام هذه الأحكام أقل في MyBatis. لأنه ، في هذه الحالة ، من الصعب معالجة ذاكرة التخزين المؤقت. إذا كان STARTDATE فارغًا واستخدام sysdate الديناميكي على SQL ، فمن المستحيل تحديد ما يجب أن يكون عليه مفتاح بدء ذاكرة التخزين المؤقت. لذلك ، من الأفضل التعامل مع المعلمات قبل نقلها إلى MyBatis ، بحيث يمكن لطبقة MyBatis أيضًا تقليل بعض العبارات إذا كانت مريحة أيضًا لمعالجة ذاكرة التخزين المؤقت.
بالطبع ، ليس من المطلق استخدام إذا اخترت. في بعض الأحيان ، من أجل تحسين SQL ، إذا كان لا بد من حلها ، مثل العبارات مثل. بالطبع ، لا ينصح بشكل عام. ومع ذلك ، إذا كان هناك سيناريوهات للاستخدام ، فقم بإزالة مثلما لا تحتاج إلى استخدامه ، مثل الاستعلام عن عنوان المقالة لتحسين كفاءة الاستعلام. أفضل طريقة هي استخدام محركات البحث مثل لحل مشكلة الفهرسة النصية الكاملة هذه.
بشكل عام ، إذا كان من المستحيل إزالة الفرع تمامًا ، ولكن يوصى باستخدام الطريقة الأصلية لـ SQL لحل بعض المشكلات الديناميكية ، بدلاً من الاعتماد بالكامل على mybatis لإكمال حكم الفروع الديناميكية ، لأن فرع الحكم معقد للغاية ويصعب الحفاظ عليه.
3. استبدل تعليقات SQL بتعليقات XML.
حاول ألا تحتفظ بتعليقات MyBatis Central SQL. سوف تسبب التعليقات بعض المشاكل. إذا كنت بحاجة إلى استخدام التعليقات ، فيمكنك استخدام <!--> في XML لشرح التأكد من عدم وجود تعليقات SQL في SQL المتولدة ، مما يقلل من إمكانية المشكلات. ميزة أخرى للقيام بذلك هي أنه يمكن أن يميز التعليقات التوضيحية بوضوح عن SQL في IDE.
الآن دعنا نتحدث عن المشكلات الناجمة عن التعليقات. في مشروع أعمل عليه ، يعتمد مكون ترقيم الصفحات على MyBatis. سوف يضع طبقة أخرى من Count Count (*) Rownum_ من (......) خارج البرنامج النصي SQL الذي كتبته لحساب إجمالي عدد السجلات. في الوقت نفسه ، هناك اختيار متداخل آخر من (...) حيث Rownum> 10 و Ronnum <10 * 2 إنشاء معلومات الترحيل. إذا كان هناك تعليق على السطر الأخير في البرنامج النصي الخاص بك ، فسيصبح الجزء المضافة جزءًا من التعليق وسيتم الإبلاغ عن خطأ. بالإضافة إلى ذلك ، قد تتسبب بعض الشروط في تجاهل بعض الشروط ، مثل ما يلي:
<code style = "padding: 0.5em ؛ margin: 0px ؛ display: block ؛ color: rgb (101،123،131) ؛ overflow-x: auto ؛ background: rgb (253،246،227)"> <span style = "padding: 0px ؛ margin: 0px ؛ color: rgb (133،153،0) style = "padding: 0px ؛ margin: 0px ؛ color: rgb (133،153،0)"> من </span> test <span style = "padding: 0px ؛ margin: 0px ؛ color: rgb (133،153،0)"> حيث </span> col1> اللون: 42،161،152) A! = '</span >> "</span >> الهامش: 0px "> إذا </span >> </span> </code>
حتى لو كانت هناك معلمات مقابلة في المعلمات التي تم تمريرها ، فلن يكون هناك أي تأثير في الواقع ، لأن المحتوى التالي يتم التعليق عليه تمامًا. من الصعب اكتشاف هذا النوع من الخطأ دون اختبار دقيق. بشكل عام ، يمكن أن تحل تعليقات XML محل تعليقات SQL تمامًا ، لذلك يجب حظر هذا السلوك.
4. استخدم #{} كلما كان ذلك ممكنًا ، وليس $ {}.
حاول عدم استخدام $ {} في MyBatis. إنه مناسب جدًا للقيام بذلك. ومع ذلك ، هناك مشكلة في أن قدرًا كبيرًا من الاستخدام سيؤدي إلى تحليل صعب لأوراكل ، مما يؤدي إلى إبطاء أداء قاعدة البيانات. كلما زاد أداء أداء قاعدة البيانات ، كلما كان أداء قاعدة البيانات أسوأ. للمعالجة العامة لسلسلة متعددة ins ، يمكنك الرجوع إلى الحل التالي: http://www.myexception.cn/sql/849573.html ، والتي يمكن أن تحل بشكل أساسي معظم $ {}.
بخصوص $ {} ، يشبه سوء الاستخدام الآخر. لدي حالة أخرى هنا: على سبيل المثال ، بعض قوائم الأشجار ، سيتم تصميم العقد على أنها "01" ، "0101" ، ويتم استخدام العقد ثنائية بت لتمييز التسلسلات الهرمية. في هذا الوقت ، إذا كنت بحاجة إلى الاستعلام عن جميع العقد تحت العقدة 01 ، فإن أبسط SQL هو: SELECT * من شجرة حيث معرف مثل "01 ٪". هذا النوع من SQL أمر مفهوم فعليًا ، لأنه يمكنه أيضًا استخدام الفهارس ، لذلك لا يتطلب معالجة خاصة ، فقط استخدمها مباشرة. ولكن إذا كان هذا هو عنوان المقالة ، فأنت بحاجة إلى إيلاء اهتمام إضافي: حدد * من T_News_Text حيث العنوان مثل "٪ OSC ٪" ، وهذا ليس وسيلة لاستخدام الفهرسة. كما ذكر أعلاه ، من الأفضل استخدام البحث عن النص الكامل. ولكن إذا لم تتمكن من القيام بدون مثل ، فأنت بحاجة إلى الانتباه إلى طريقة الاستخدام: معرف مثل #{id} || "٪" بدلاً من معرف مثل "$ {id} ٪" لتقليل إمكانية التحليل الصعب.
بعض الناس يعتقدون أن استخدام || سوف تزيد من الوقت لمعالجة أوراكل. أعتقد أنه لا تأخذ أوراكل غبي للغاية. على الرغم من أنه في بعض الأحيان يكون غبيًا حقًا ، إلا أنه يمكنك تلخيص الغباء وليس القمامة عندما يكون لديك وقت ، ولكن بعد اختبار قليل ، ستعرف أن طريقة الاتصال هذه يجب أن تكون ضئيلة للغاية في تحليل وتنفيذ SQL بأكمله.
بالطبع ، هناك بعض الحالات الخاصة التي لا يمكن معالجتها ، مثل الحقن الديناميكي لأسماء الأعمدة وأسماء الجدول ، وما إلى ذلك بالنسبة لهذه المواقف ، يتم العثور على وسائل صعبة وليس أكثر ملاءمة. نظرًا لأن هذا الموقف أقل عرضة للحدوث ، فإن استخدام $ {} لن يكون له أي تأثير كبير. بالطبع ، إذا كان لديك مراضة رمز ، فيمكنك استخدام آلية تنفيذ SQL الديناميكية من Oracle تنفذ فوريًا ، بحيث يمكنك تجنب إمكانية $ {} تمامًا. سيقدم هذا نماذج أكثر تعقيدًا ، وفي هذا الوقت ، تحتاج إلى اتخاذ خيارات.
استجابة للمشاكل الناجمة عن SQL الديناميكي أعلاه ، فإن الطريقة الأكثر تطرفًا هي استخدام الإجراءات المخزنة وحلها بطريقة أصلية لتسهيل التنمية وتصحيح الأخطاء. بالطبع ، سوف يجلب أيضًا مشاكل: ستكون هناك متطلبات أعلى للمطورين ، وإدارة الإجراءات المخزنة ، وما إلى ذلك. لم يتبنى مشروعي هذه الطريقة ، لذلك لن أتوسع أكثر هنا.
5. الاستخدام البسيط من mybatis.
وظيفة MyBatis ضعيفة نسبيًا ، وتفتقر إلى العديد من المكتبات المساعدة اللازمة ، ومعالجة السلسلة ، وما إلى ذلك ، ومن الصعب أيضًا التوسع ، لذلك من الممكن عمومًا معالجة بعض العوائد. لذلك ، من الأفضل استخدامه كملف تكوين SQL بسيط وإطار ORM بسيط. لا تحاول أن تفعل الكثير من SQL الديناميكي في MyBatis ، وإلا فإنه سيؤدي إلى أن تكون الصيانة التالية مثيرة للاشمئزاز للغاية.
ما سبق هو ملخص التعلم MyBatis الذي قدمه لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!