مقدمة إلى MyBatis
MyBatis هو إطار طبقة استمرار ممتازة يدعم استعلامات SQL العادية والإجراءات المخزنة ورسم الخرائط المتقدمة. يقوم MyBatis بإلغاء الإعدادات اليدوية لجميع كود JDBC تقريبًا والمعلمات وتغليف البحث في مجموعة النتائج. يمكن لـ MyBatis استخدام XML البسيط أو التعليقات التوضيحية للتكوين والتعيين الأصلي ، ورسم الخرائط وواجهات Java (كائنات Java القديمة) في سجلات في قاعدة البيانات.
تنقسم بنية MyBatis الوظيفية إلى ثلاث طبقات (يتم استعارة الصورة من موسوعة Baidu):
1) طبقة واجهة API: توفر واجهات برمجة التطبيقات للواجهة للاستخدام الخارجي ، حيث يعالج المطورون قواعد البيانات. بمجرد استلام طبقة الواجهة لطلب المكالمات ، ستقوم باستدعاء طبقة معالجة البيانات لإكمال معالجة البيانات المحددة.
2) طبقة معالجة البيانات: مسؤولة عن بحث SQL محدد ، تحليل SQL ، تنفيذ SQL ومعالجة تعيين نتائج التنفيذ ، وما إلى ذلك. الغرض الرئيسي منه هو إكمال عملية قاعدة البيانات بناءً على طلب المكالمة.
3) طبقة الدعم الأساسية: مسؤولة عن الدعم الوظيفي الأساسي ، بما في ذلك إدارة الاتصال وإدارة المعاملات وتحميل التكوين ومعالجة ذاكرة التخزين المؤقت. هذه كلها أشياء شائعة ، تستخرجها كأبنية المكونات. يوفر الدعم الأساسي للطبقة العليا لطبقة معالجة البيانات.
عند تحديد رسم الخرائط في MyBatis ، يمكن استخدام نوع الإرجاع مع ResultType أو ResultMap. تمثل ResultType مباشرة نوع الإرجاع ، في حين أن ResultMap هي إشارة إلى النتيجة الخارجية ، ولكن لا يمكن وجود ResultType و ResultMap في نفس الوقت. عندما يقوم MyBatis بالاستعلام عن التعيين ، في الواقع ، يتم وضع كل استعلام سمة في خريطة مقابلة ، حيث يكون المفتاح هو اسم السمة والقيمة هي قيمتها المقابلة. عندما تكون سمة نوع الإرجاع المتوفرة هي resultType ، ستأخذ MyBatis أزواج القيمة الرئيسية في الخريطة وتعيينها إلى السمات المقابلة للكائن المحدد بواسطة ResultType. لذلك في الواقع ، فإن نوع العودة لكل خريطة استعلام لـ MyBatis هو نتيجة. ومع ذلك ، عندما تكون سمة نوع الإرجاع التي نقدمها هي resultType ، يقوم MyBatis تلقائيًا بتعيين القيمة المقابلة إلى سمات الكائن المحدد بواسطة ResultType. عندما يكون نوع الإرجاع الذي نقدمه هو resultmap ، لأن الخريطة لا يمكن أن تمثل نموذج المجال جيدًا ، نحتاج إلى تحويله إلى كائن مقابل لأنفسنا ، والذي غالبًا ما يكون مفيدًا للغاية في الاستعلامات المعقدة.
يوجد مثل هذا ملف blog.java
استيراد java.util.list ؛ مدونة الفئة العامة {private int id ؛ عنوان السلسلة الخاصة ؛ محتوى السلسلة الخاصة ؛ مالك السلسلة الخاصة ؛ القائمة الخاصة <some> التعليقات ؛ public int getId () {refered id ؛} public void setId (int id) {this.id = id ؛ Content ؛} public void setContent (محتوى السلسلة) {this.content = content ؛} السلسلة العامة getOwner () {return owner ؛} public void setowner (string owner) {this.Owner = owner ؛} public list <comment> getComments () {return comments ؛} public void setComments (list> comments) ------------------ 博客 -----------------/n id: " + id +"/n العنوان: " + title +"/n content: " + content +"/n owner: " + own ؛}}يحتوي جدول قاعدة البيانات المقابل على سمات المعرف والعنوان والمحتوى وسمات المالك. عندما نؤدي تعيين الاستعلام التالي
<typealias alias = "blog" type = "com.tiantian.mybatis.model.blog"/> <!-ملف التكوين من mybatis mybatis_config.xml-> <select id = "selectblog" parametertype = "int" resulttype = "blog" blogmapper.xml->
ستقوم MyBatis تلقائيًا بإنشاء كائن ResultMap ، ثم تغليف زوج قيمة المفاتيح بناءً على اسم السمة الموجود. بعد ذلك ، سترى أن نوع الإرجاع هو كائن مدونة ، ثم قم بإخراج زوج القيمة الرئيسي المقابل لكائن المدونة من ResultMap وتعيينه.
كما أنه مفيد للغاية عندما يكون نوع الإرجاع مباشرة خريطة ، يتم استخدامها بشكل أساسي لاستعلامات المفصل المعقدة ، لأنه ليس من الضروري إجراء استعلامات بسيطة. دعونا أولاً نلقي نظرة على استعلام بسيط مع خريطة Return Type ، ثم ننظر إلى استخدام الاستعلامات المعقدة.
كيف تكتب استعلامًا بسيطًا
<resultmap type = "blog" id = "blogresult"> <id column = "id" property = "id"/> <result column = "title" property = "title"/> <result column = "content" property = "content"/> <result column = "owner" property = "owner" property = "owner"/> <</resultmap> <select id = "selectblog" parametertype = "int" resultmap = "blogresult"> select * from t_blog where id = #{id} </revels>قيمة resultmap في خريطة SELECT هي معرف خريطة النتيجة الخارجية ، مما يشير إلى النتيجة التي تم تعيينها إليها. تشير سمة النوع لنتيجة النتيجة الخارجية إلى نوع نتيجة النتيجة. إليكم نوع المدونة ، لذلك سوف يخرج MyBatis ككائن مدونة. يتم استخدام معرف عقدة الطفل لعقدة ResultMap لتحديد معرف الكائن ، في حين يتم استخدام العقدة الفرعية للطفل لتحديد بعض الخصائص البسيطة. تمثل خاصية العمود السمات التي تم الاستعلام عنها من قاعدة البيانات ، وتمثل الخاصية الخاصية الخصائص التي يتم تعيين القيمة المقابلة للخاصية التي تم الاستعلام عليها إلى كائن الكيان. هذه هي كيفية كتابة ResultMap للاستعلام البسيط. بعد ذلك ، دعونا نلقي نظرة على استعلام أكثر تعقيدًا.
هناك فصل تعليق ، يحتوي على مرجع مدونة ، يشير إلى المدونة التي هي عليها. عند الاستعلام عن التعليق ، يجب علينا أيضًا معرفة المدونة المقابلة وتعيينها إلى سمة المدونة الخاصة بها.
استيراد java.util.date ؛ تعليق الفئة العامة {private int id ؛ محتوى السلسلة الخاصة ؛ commentdate date date = new date () ؛ المدونة العامة ؛ public int getId () {return id ؛} public void setId (int id) {return commentDate ؛} public void setCommentDate (date commentDate) {this.commentDate = commentDate ؛} المدونة العامة getBlog () {return blog ؛} public void setBlog (blog blog) {this.blog = blog ؛ "/n commentDate:" + commentDate ؛}}إنه مكتوب مثل هذا
<!-من ملف commentMapper.xml-> <resultmap type = "comment" id = "commentResult"> <ensivand property = "blog" select = "selectBlog" column = "blog" javatype = "blog"/> </resultmap> <select id = "selectcomment" parametertype = "int id = "selectblog" parametertype = "int" resultType = "blog"> select * from t_comment where id = #{id} </select> <select id = "selectblog" parametertype = "int" resulttype = "blog"> select * from id = #id} </select>وضع الوصول مثل هذا. أولاً ، تطلب خريطة تحديد مع معرف SelectComment ، ثم تحصل على كائن ResultMap مع معرف CommentResult. يمكننا أن نرى أن نوع الإرجاع لنتيجة النتيجة المقابلة هو كائن تعليق ، والذي يحتوي على عقدة ارتباط واحدة فقط ، ولا يوجد معرف ونتيجة للعقدة الطفل المقابلة للاستعلام البسيط المذكور أعلاه ، لكنه سيظل يعين المعرف المقابل والسمات الأخرى لكائن التعليق. هذا ما ذكره MyB سابقًا. ATIS لديه وظيفة التغليف التلقائي. طالما أنك تقدم نوعًا من الإرجاع ، فسيستخدم MyBatis نتائج الاستعلام لتغليف الكائن المقابل وفقًا لحكمه. لذلك ، في الاستعلام البسيط أعلاه ، إذا لم تشير بوضوح إلى الحقل الذي يتوافق مع المعرف والمجال الذي يتوافق مع العنوان في ResultMap ، فإن MyBatis سيغلفه أيضًا وفقًا لحكمه. حكم MyBatis هو مقارنة مجال الاستعلام أو الاسم المستعار المقابل مع سمات كائن الإرجاع. إذا كان يتطابق مع النوع يتطابق أيضًا ، فسيقوم MyBatis بتعيينه. ترتبط سمة المدونة في النتيجة المقابلة أعلاه ، ونوع Java المقابل هو مدونة. في طريقة الكتابة أعلاه ، يرتبط الكائن المرتبط به من خلال الفخات الفرعية ، وبالطبع ، يمكن أيضًا ربطه مباشرة من خلال استعلام الجمعية. في عقدة الطفل المذكورة أعلاه ، تشير سمة الممتلكات إلى الخاصية المرتبطة هي نوع إرجاع ResultMap. على سبيل المثال أعلاه ، سمة المدونة التي تديرها التعليق ؛ يشير SELECT إلى أي MAP لتحديد MAP لتحديد السمة المرتبطة المقابلة ، أي أنه سيطلب خريطة تحديد مع القيمة المقابلة للتحديد للاستعلام عن كائن السمة المرتبط ؛ يشير العمود إلى زوج القيمة الرئيسية المقابلة لـ ResultMap مع معرف التعليقات. سيتم استخدام زوج القيمة الرئيسية هذا كمعلمة للاستماع الفرعي للكائن المرتبط ، أي أن قيمة استعلام سمة المدونة في SelectComment يتم تمريرها كمعلمة للاستراحة الفرعية لمدونة الكائن المرتبطة بالمساع الفرعي لمدونة الكائن المرتبطة ؛ يشير Javatype إلى نوع الكائن الحالي المرتبط به في Java.
يقدم ما ورد أعلاه استعلامًا لعلاقة فردية أو واحدة إلى طرف واحد في حالة شخص واحد. في التطبيقات الفعلية ، هناك تطبيق آخر يستخدم بشكل متكرر. من الضروري معرفة المزيد من الأطراف المقابلة من خلال طرف واحد. عند إخراج المزيد من الأطراف ، يجب أن يرتبط طرف واحد أيضًا مع طرف واحد. وهذا هو ، في المثال أعلاه ، عند إخراج كائن المدونة ، يتم إخراج جميع التعليقات المقابلة. عند إخراج التعليق ، لا يزال يتعين عليهم إخراج المدونة المقابلة. يتم أخذ هذا من خلال طلب في جافا. طريقة الكتابة كما يلي:
<!-من ملف blogmapper.xml-> <resultmap type = "blog" id = "blogresult"> <id column = "id" property = "id"/> <collection property = "comments select =" selectommentsblog "compley =" id "oftype =" comment "> </soldemap> <desultmap type = javatype = "blog" column = "blog" select = "selectblog"/> </sultreseg id = "selectblog" parametertype = "int resultMap = "CommentResult"> حدد * من t_comment حيث blog = #{blogid} </select>إدخال الطلب أعلاه هو خريطة محددة مع تحديد المعرف ، ونتيجة الإرجاع هي نتيجة مع ID blogresult. نوع blogresult هو المدونة ، والتي تحدد سمات وحقول الهوية. سيكون تحديد المعرف تأثير كبير على البناء الداخلي لـ MyBatis. ويرتبط بكائن التعليقات. نظرًا لأن المدونة يمكن أن تحتوي على العديد من التعليقات ، وهي مجموعة ، لذلك يتم تعيينها بمجموعة مجموعة. يشير SELECT إلى الإشارة الفرعية التي يتم تنفيذها للاستعلام عن التعليقات المقابلة. يعني العمود أي قيمة الحقل الموجودة أعلاه تنتقل إلى الاسم الفرعي كمعلمة. يمثل Oftype أيضًا نوع الإرجاع. نوع الإرجاع هنا هو النوع داخل المجموعة. السبب في استخدام Offype بدلاً من الكتابة هو أنه يتم استخدامه داخل MyBatis لتمييزه عن جمعية الارتباط.
رمز الاختبار:
testpublic void void selectcommentsblogtest () {sqlsession session = util.getsqlsessionfactory (). opensession () ؛ commentMapper commentMapper = session.getMapper التعليقات) system.out.println (comment) ؛ session.close () ؛}/*** Query سجل واحد*/@testpublic void blogmapper.selectblog (6) ؛ قائمة <some> التعليقات = blog.getComments () ؛ if (التعليقات! = null) {system.out.println ("---------------- size --------------" + comments.size ()) ؛ for (تعليق التعليق: التعليقات)ما سبق هو نظرة عامة موجزة على ResultMap في MyBatis الذي قدمه لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!