English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

وظيفة الاستعلام البيني في mybatis

يُعرف الاستعلام المثني بأنه عند استعلام بيانات جدول، نحتاج إلى استعلام بيانات جداول أخرى.

 الحاجة

    أولاً دعونا نحديث عن احتياج صغير يستخدم الاستعلام المثني: افترض أننا نحتاج إلى استعلام معلومات الطلب ونحتاج أيضًا إلى استعلام معلومات المستخدم الذي أنشأ هذا الطلب. نموذج الجدول كالتالي (

 ResultType

  كتابة جملة SQL

    أولاً، يجب أن نحلل احتياجاتنا. 1. يجب علينا تحديد الجداول التي تحتاج إلى التشغيل في هذا الطلب، وجدول هو الجدول الرئيسي وجدول هو الجدول المرتبط. كيف يمكن تحديد ذلك، يرجى النظر في الطلب - الطلب الخاص بنا هو أن نستعلام الطلبات وفقًا للمستخدمين الذين قاموا بإنشاء هذه الطلبات. لذلك، من الواضح أن جدول الطلبات هو جدول الطلبات (orders). وجدول المستخدمين هو جدول المستخدمين (user).

    في هذه اللحظة، يمكننا كتابة جملة SQL مثل هذا:

select * from orders

    في هذه اللحظة، يجب أن نفكر في هذا السؤال: في الاستعلام المرتبط، يجب أن نستخدم الاتصال الداخلي؟ أم الاتصال الخارجي؟ بالنسبة للذين ليس لديهم فهم واضح للفرق بين الاتصال الداخلي والخارجي، سأقدم شرحًا بسيطًا هنا، وسأكتب تدوينة مفصلة لاحقًا: الاتصال الداخلي يظهر فقط ما يلبي الشروط. يُقسم الاتصال الخارجي إلى اتصال خارجي يسارًا وأيمنًا: يظهر الاتصال الخارجي يسارًا جميع العناصر بالإضافة إلى العناصر المتطابقة في اليمين؛ يظهر الاتصال الخارجي الأيمن جميع العناصر في اليمين بالإضافة إلى العناصر المتطابقة في اليسار.

  لدينا احتياجات لربط المستخدمين من خلال الطلبات، وبسبب وجود مفتاح خارجي في جدول orders (userId). عند استعلام بيانات جدول user المرتبط من خلال المفتاح الخارجي، فإن userId هو المفتاح الرئيسي لجدول user. في هذه الحالة، يمكن العثور على معلومات user واحدة فقط، وسيؤدي هذا السجل إلى عدم تغيير نتائج الاستعلام الرئيسي. لذلك، نختار الاستعلام الداخلي. في هذه اللحظة، سيكون جملة SQL الخاصة بنا مثل هذا:

 select * from orders, user where orders.user_id = user.id

    بعد إكمال الاستعلام، سيظهر النتيجة كما يلي:

    في هذه اللحظة، ظهرت مشكلة، وجدنا أن هناك اثنين من ids، مما يؤدي إلى مشكلة في تعبئة البيانات عند إخراجها إلى الكائن. بالإضافة إلى ذلك، يكرر عمود User_id بيانات id المستخدمين الخاصة بنا. يجب تحسين SQL الخاصة بنا. كيف نحسنها؟

    بسبب أن بيانات الجدول الرئيسي الخاصة بنا يجب أن تكون استعلامت بالكامل، بينما نحتاج إلى معلومات username, sex, adress هذه الثلاثة فقط من جدول المستخدمين (هذا مجرد افتراض، لا تحتاج إلى القلق بشأن المعلومات التي نحتاج إليها). لذلك، يجب علينا تحديد مجال استعلام جملة SQL الخاصة بنا يدويًا:    

SELECT 
 orders.*,
 USER.username,
 USER.sex,
 USER.address 
FROM
 orders,
 USER 
WHERE orders.user_id = user.id

    هذه الأشياء الأولى هي في أدوات الاتصال الخاصة بنا SQL، عند ظهور قاعدة البيانات التي نحتاجها، يتم تحديد جملة SQL الخاصة بنا. في هذه المرحلة، يجب أن نبدأ بالخطوة التالية:

   创建pojo

    إنشاء pojo

    نحن بحاجة إلى تعبئة البيانات المكتشفة من خلال إطار العمل mybatis إلى العناصر المحددة.إذن، ما الذي سيقوم باستقبال هذه البيانات؟إذا كنا نريد تحويل نتائج هذا sql إلى pojo، فإن pojo يجب أن يشمل جميع أسماء الحقول البحثية.لكن سواء كان فئة Orders أو فئة User، لا يمكنهما تحويل جميع الحقول.في هذه الحالة، لدينا حل بسيط: بناء فئة جديدة بناءً على الحقول المعدة، ثم يمكن لهذه الفئة استقبال مجموعة النتائج.

    هناك تقنية صغيرة، في pojo الجديد، لا تحتاج إلى كتابة جميع الحقول، يمكننا أن نرث pojo الذي يحتوي على عدد كبير من حقول النتيجة من هذا، ثم يمكننا كتابة البيانات المطلوبة في هذا الفرع.

    mapper.xml

    بعد إنشاء pojo، يجب علينا أن نتبع المعايير لإنشاء ملفات التحقق والكتابة في الطرق الموجودة في الواجهة.

 واجهة mapper.java

    ResultMap

  على مستوى جملة sql، يتم تطبيق resultType وresultMap بنفس الطريقة، لذا سأقوم بتحقيق هذا.

    استراتيجية تطبيق resultMap

    نحن نعلم أن عند استخدام pojo، يمكننا تعبئة بعض البيانات في خصائص العنصر الخاص بنا، يمكن أن تكون هذه الخصائص أنواع بسيطة أو أي pojo آخر.في هذه الحالة، يمكننا القيام بما يلي:

    إضافة الخاصية user إلى فئة Orders

  mapper.xml

    عند استخدام طرق resultMap لتحويل مجموعة النتائج، يجب علينا إجراء إثنين من العمليات، الأولى هي تعريف resultMap وتحديد خصائص العنصر الذي يحتوي على كل عمود من مجموعة النتائج.هذا أمر معقد بعض الشيء ولكنه ليس صعبًا.والثانية هي تعريف statement الخاص بنا.

   resultMap

    نحن قد تحدثنا عن المفهوم الأساسي لـ resultMap. وقد أضفنا أيضًا خصائص جديدة إلى فئة orders pojo.والآن، يجب علينا كتابة resultMap لتناسب النتائج الكاملة للبحث مع فئة Orders.في هذا السياق، يأتي أولاً تطابق أوامر الطلب.هذا يمكن القيام به ببساطة باستخدام id وresult العلامات لتوصيل كلاهما بشكل متكامل.ثم يأتي تطابق معلومات المستخدم المرتبطة، عند ذلك يجب استخدام علامة association، مما يوفر تحديد حقل user في فئة orders مع فئة User، ثم يمكن استخدام id وresult العلامات في الداخل لتحويل البيانات البحثية مع خصائص User.

    الكود المحدد كما يلي:}}   

<!-- resultMap لاستعلام الطلب المرتبط للمستخدم
 تمثيل النتيجة الكاملة للاستعلام في cn.mybatis.po.Orders
  -->
 <resultMap type="cn.mybatis.po.Orders" id="OrdersUserResultMap">
  <!-- تكوين معلومات الطلب المرتبطة
  <!-- id: تحديد العلامة المخصصة في عمود الاستعلام، العلامة المخصصة لمعلومات الطلب، إذا كانت العلامة المخصصة تتكون من عدة أعمدة، تكوين عدة id
   column: عمود العلامة المخصصة لمعلومات الطلب
   property: عمود العلامة المخصصة لمعلومات الطلب الذي يتم تمثيله في Orders
   -->
  <id column="id" property="id"/>
  <result column="user_id" property="userId"/>
  <result column="number" property="number"/>
  <result column="createtime" property="createtime"/>
  <result column="note" property=note/>
  <!-- تكوين معلومات المستخدم المرتبط للخريطة التوضيحية
  <!-- association: تستخدم لتوصيف معلومات استعلام مرتبط لمسجل واحد
  property: تحديد معلومات المستخدم المستطلع في الاستعلام المرتبط لتمثيلها في Orders
   -->
  <association property="user" javaType="cn.mybatis.po.User">
   <!-- id: العلامة المخصصة لاستعلام المستخدم المعين
   column: تحديد عمود معين يعرف معلومات المستخدم
   javaType: ي映射 إلى أي خاصية من user
    -->
   <id column="user_id" property="id"/>
   <result column="username" property="username"/>
   <result column="sex" property="sex"/>
   <result column="address" property="address"/>
  </association>
 </resultMap>

   الجملة

    الجملة statement بسيطة، وهي تغيير طريقة التحويل للمجموعة الناتجة إلى resultMap. ثم يمكن تحديد النوع العائدة إلى resultMap الذي قمنا بإنشائه للتو.

  mapper.java    

 الفرق بينهما

    بعد أن تمت مناقشة طرق البحث المزدوج، دعنا نتحلل الآن في اختلافاتهم، وأفضلياتهم.

    أولاً، يجب تعديل pojo، إما إضافة pojo جديد أو تعديل حقل pojo. أعتقد أن هذا يعكس مبدأ المرونة والغلاء في تصميم الأنماط. يعتبر resultType أفضل من resultMap.

    ثانيًا، من حيث البساطة، يمكن تحقيق resultType بشكل بسيط. من هذا المنظور، يكون resultType أفضل من resultMap.

    لكن resultMap يمكن تحقيق التحميل المتأخر، بينما لا يمكن تحقيق resultType التحميل المتأخر. من هذا المنظور، يكون resultMap أفضل من resultType.

    لذلك: يُنصح بالاستخدام resultType إذا لم يكن لديك متطلبات خاصة للبحث.

ما تم ذكره أعلاه هو ميزة البحث المزدوج التي قدمها المحرر للجميع، نأمل أن تكون مفيدة للجميع. إذا كان لديك أي أسئلة، فلا تتردد في ترك تعليق، وسأقوم بالرد على أسئلتك في أقرب وقت. وأنا أتمنى أيضًا أن تكون قد دعمتم موقع呐喊 التعليمي!

إعلان: محتوى هذا المقال تم جمعه من الإنترنت، ويحق لصاحب الحقوق أن يكون المسؤول عنه، ويتم جمع المحتوى من قبل المستخدمين عبر الإنترنت بشكل تلقائي، ويتم تحميله على هذا الموقع دون امتلاك حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال #بـ @) لتقديم الشكوى، وتقديم الدليل، وسيتم حذف المحتوى المزعوم بسرعة إذا تم التحقق منه.

أعجبك ذلك