عملية تنفيذ MyBatis Framework:
1. تكوين ملف تكوين MyBatis ، sqlmapconfig.xml (الاسم غير ثابت)
2. قم بتحميل بيئة تشغيل MyBatis من خلال ملفات التكوين وإنشاء مصنع جلسة SQLSessionFactory
يتم استخدام SQLSessionFactory بطريقة مفردة عند استخدامها بالفعل.
3. إنشاء sqlsession من خلال sqlsessionfactory
SQLSession هي واجهة موجهة للمستخدم (توفر طرق قاعدة بيانات التشغيل). كائن التنفيذ هو معطف مؤشر الترابط. يوصى بأن يكون سيناريو التطبيق الخاص بـ SQLSession ضمن جسم الطريقة.
4. استدعاء طريقة SQLSession لمعالجة البيانات.
إذا كنت بحاجة إلى ارتكاب معاملة ، فأنت بحاجة إلى تنفيذ طريقة الالتزام () من SQLSession.
5. إطلاق الموارد وإغلاق sqlsession
طريقة تطوير وكيل Mapper (موصى بها)
يحتاج المبرمجون فقط إلى كتابة واجهة Mapper (أي ، واجهة DAO)
يحتاج المبرمجون إلى متابعة مواصفات التطوير عند كتابة mapper.xml (ملفات التعيين) و mapper.java:
1. مساحة الاسم في mapper.xml هي المسار الكامل لفئة mapper.java.
2. معرف البيان في MapPPer.xml هو نفس اسم الطريقة في mappper.java.
3. المعلمة من البيان في mapper.xml يحدد نوع معلمة الإدخال ونوع معلمة الإدخال لطريقة mapper.java.
4. يحدد النتيجة من البيان في mapper.xml نوع الإخراج ونوع قيمة الإرجاع لطريقة mapper.java.
محتوى هذه المقالة:
تحليل نموذج بيانات المنتج.
رسم الخرائط المتقدمة: (تعلم)
قم بتنفيذ استعلام واحد إلى واحد ، والاستعلام واحد إلى كثير ، والعديد من العدد.
تأخير التحميل
ذاكرة التخزين المؤقت الاستعلام
ذاكرة التخزين المؤقت المستوى 1
ذاكرة التخزين المؤقت من المستوى 2 (فهم سيناريوهات الاستخدام من ذاكرة التخزين المؤقت لـ MyBatis Level 2)
MyBatis و Spirng Integration (Master)
الهندسة العكسية (يمكن استخدامها)
طلب نموذج بيانات المنتج
أفكار تحليل نموذج البيانات
1. محتوى البيانات المسجل في كل جدول
التعرف على المحتوى المسجل في كل جدول حسب الوحدة يعادل عملية متطلبات نظام التعلم (وظائف).
2. إعدادات الحقل المهمة لكل جدول
الحقول غير الفارغة ، حقول المفاتيح الخارجية
3. العلاقة بين جداول قاعدة البيانات
العلاقة الرئيسية الخارجية
4. علاقة العمل بين الجداول
عند تحليل علاقة العمل بين الجداول ، من الضروري تحليلها بناءً على أهمية تجارية معينة.
تحليل نموذج البيانات
مستخدم جدول المستخدم:
سجل معلومات المستخدم للمنتج المشتري
جدول الطلب: الطلبات
يسجل الطلب الذي أنشأه المستخدم (طلب شراء العناصر)
تفاصيل الطلب: OrderDetail:
سجل المعلومات التفصيلية للطلب ، وهي معلومات الشراء
قائمة المنتج: العناصر
معلومات المنتج المسجلة
علاقة العمل بين الجداول:
عند تحليل علاقة العمل بين الجداول ، من الضروري تحليلها بناءً على أهمية تجارية معينة.
قم أولاً بتحليل علاقة العمل بين الجداول التي لها علاقات بين مستويات البيانات:
USRE والأوامر:
المستخدم-> الطلبات: يمكن للمستخدم إنشاء أوامر متعددة ، واحدة إلى كثيرين
الطلبات> المستخدم: يتم إنشاء طلب من قبل مستخدم واحد فقط ، واحد إلى واحد
أوامر و OrderDetail:
الطلبات> OrderDetail: يمكن أن يتضمن الطلب تفاصيل ترتيب متعددة ، لأنه يمكن للطلب شراء عناصر متعددة ، ويتم تسجيل معلومات شراء كل عنصر في OrderDetail ، علاقة واحدة إلى العمال
OrderDetail> الطلبات: لا يمكن تضمين تفاصيل الطلب إلا في طلب واحد ، واحد إلى واحد
OrderDetail و headsm:
OrderDetail―> العناصر: تفاصيل طلب واحد فقط تتوافق مع معلومات منتج واحد ، واحد إلى واحد
العناصر> OrderDetail: يمكن تضمين منتج في تفاصيل طلب متعددة ، واحد إلى كثير
ثم قم بتحليل ما إذا كانت هناك علاقة عمل بين الجداول غير المرتبطة بمستوى قاعدة البيانات:
أوامر وعناصر:
يمكن إنشاء العلاقة بين الطلبات والعناصر من خلال جدول OrderDetail.
المستخدم والعناصر: تشكل علاقة كثيرة من خلال الجداول الأخرى
استفسار فردي
المتطلبات: معلومات طلب الاستعلام ، وربط معلومات مستخدم الاستعلام لإنشاء الطلبات
استخدم resultType للاستعلام
النظر في استخدام بيانات SQL
حدد الجدول الأساسي للاستعلام: جدول الطلب
تحديد جدول الارتباط للاستعلام: جدول المستخدم
هل يستخدم استعلام الجمعية رابطًا داخليًا أو رابطًا خارجيًا؟
نظرًا لوجود مفتاح خارجي (user_id) في جدول الطلبات ، يمكن العثور على سجل واحد فقط عن طريق الاستعلام عن جدول المستخدم من خلال ارتباط المفتاح الأجنبي ، ويمكن استخدام الروابط الداخلية.
حدد الطلبات.*، user.username ، user.sex ، user.address fromors ، user where orders.user_id = user.id
إنشاء pojo (orderscustom.java)
قم بتخطيط نتائج استعلام SQL أعلاه في Pojo ، والتي يجب أن تتضمن جميع أسماء أعمدة الاستعلام.
لا يمكن لـ Original Orders.Java تعيين جميع الحقول ، ويحتاج PoJo الذي تم إنشاؤه حديثًا.
قم بإنشاء فئة PO التي ترث فئة PO التي تتضمن الكثير من حقول الاستعلام.
OrdersMapperCustom.xml
OrdersMapperCustom.java
اكتب فصول الاختبار
انقر بزر الماوس الأيمن على ملف OrdersMapperCustom.java> حدد جديد> آخر> حالة اختبار Junit> حدد الوظيفة للاختبار
اكتب الكود التالي في ordersmapperCustomTest.java:
OrderSmapperCustomTest {private sqlsessionfactory sqlsessionfactory ؛ // هذه الطريقة هي تنفيذ setup foreforepublic void () استثناء {// create sqlsessionfactory // mybatis configuration string string = "sqlmapconfig.xml" الموارد. ordersmapperCustom ordersMapperCustom = sqlsession.getMapper (ordersmapperCustom.class) ؛ // استدعاء قائمة طريقة mapper <SrationScustom> قائمة = ordersmapperCustom.findordersUser () ؛ system.out.println (list) ؛ sqlsession.close () ؛}استخدم ResultMap للاستعلام
بيان SQL: تم تنفيذ SQL في نفس النتيجة
أفكار لاستخدام رسم الخرائط
استخدم ResultMap لتعيين معلومات الطلب في نتيجة الاستعلام إلى كائن الطلبات ، وأضف سمة المستخدم في فئة الطلبات ، وقم بتخطيط معلومات مستخدم الاستعلام المرتبطة بسمة المستخدم في كائن الطلبات.
أضف سمة المستخدم إلى فئة الطلبات
OrdersMapperCustom.xml
تحديد النتيجة
Tyep: يعني تعيين نتائج الاستعلام بأكمله إلى فئة معينة على سبيل المثال: cn.itcast.mybatis.po.orders
المعرف: يمثل المعرف الفريد لعمود الاستعلام في جدول قاعدة البيانات ، المعرف الفريد في معلومات الطلب. إذا كان هناك العديد من الأعمدة التي تشكل معرفًا فريدًا ، فقم بتكوين معرفات متعددة.
العمود: عمود تعريف فريد لمعلومات الطلب في جدول قاعدة البيانات
الخاصية: ما هي الخاصية التي يتم تعيينها للطلبات حسب عمود التعريف الفريد لمعلومات الطلب؟
الجمعية: تستخدم لتعيين المعلومات للاستعلام عن الكائنات الفردية
الخاصية: أي خاصية في الطلبات لتعيين معلومات المستخدم الخاصة بالاستعلام المرتبط بها
Javatype: أي خاصية تم تعيينها للمستخدم
<!-تقوم نتائج المستخدم المرتبطة بتعيين نتيجة الاستعلام بأكمله إلى cn.itcast.mybatis.po.orders-> <resultmap type = "cn.itcast.mybatis.po.orders" id = "ordersuserresultmap"> <! إذا كان هناك العديد من الأعمدة لتشكيل معرف فريد من نوعه ، فقم بتكوين idcolumn متعددة: عمود تحديد فريد لخاصية معلومات الطلب: أي خاصية في الطلبات يتم تعيينها بواسطة عمود المعرف الفريد لمعلومات الطلب-> <id column = "id" propert column = "note" property = note/> <!-تكوين معلومات المستخدم المرتبطة بها المعينة-> <!-الجمعية: المعلومات المستخدمة لتعيين الاستعلام المفرد المرتبط بها: أي خاصية في الطلبات لتعيين معلومات المستخدم الخاصة بالاستعلام المرتبط به-> < javatype: أي خاصية تم تعيينها إلى user -> <id column = "user_id" property = "id"/> <result column = "username" property = "username"/> <result column = "Sex"
تعريف البيان
OrdersMapperCustom.java
رمز الاختبار
testpublic void testfindordersuserresultmap () يلقي الاستثناء {sqlsession sqlsession = sqlsessionfactory.opensession () ؛ // إنشاء وكيل وكيل OrdersMapperCustom orderSmapperCustom = sqlsession.getMapper (ordersMapperCustom.class) ؛ // ordersMapperCustom.FindordersuserResultMap () ؛ system.out.println (list) ؛ sqlsession.close () ؛}regudytype و resultmap تنفيذ ملخص الاستعلام الفردي
ResultType: من السهل نسبيًا تنفيذها باستخدام ResultType. إذا لم يتم تضمين اسم عمود الاستعلام في POJO ، فأنت بحاجة إلى إضافة السمات المقابلة لاسم العمود لإكمال التعيين.
إذا لم تكن هناك متطلبات خاصة لنتائج الاستعلام ، فمن المستحسن استخدام ResultType.
ResultMap: يجب تحديد خريطة النتيجة بشكل منفصل ، وهو أمر مزعج بعض الشيء. إذا كانت هناك متطلبات خاصة لنتائج الاستعلام ، فإن استخدام ResultMap يمكنه إكمال سمات رسم خرائط الاستعلام المرتبط به.
يمكن لـ ResultMap تطبيق التحميل البطيء ، لا يمكن لـ ResultType تنفيذ تحميل كسول.
استعلام واحد إلى الرجل
المتطلبات: أوامر الاستعلام وترتيب معلومات تفاصيل.
بيان SQL
تحديد جدول الاستعلام الرئيسي: جدول الطلب
تحديد جدول الاستعلام المرتبط: جدول تفاصيل الطلب
فقط أضف رابطة قائمة تفاصيل الطلب بناءً على استعلام فردي.
SelectorSors.*، user.username ، user.sex ، user.address ، orderdetail.id orderdetail_id ، orderdetail.items_id ، orderdetail.items_num ، orderdetail.orders_idfromorders ، orderdetailwhere worders
التحليل: استخدم resultType لتعيين نتائج الاستعلام أعلاه في POJO ، ومعلومات الطلب هي ازدواجية.
المتطلبات: لا يمكن أن تحدث السجلات المكررة لرسم خرائط الطلبات.
أضف القائمة <SrideDetail> orderDetails في فئة Orders.java.
أخيرًا ، سيتم تعيين معلومات الطلب في الطلبات ، ويتم تعيين تفاصيل الطلب المقابلة للطلب في خاصية OrderDetails في الطلبات.
عدد الطلبات المسجلة في المعينة هو اثنين (لا تتكرر معلومات الطلبات)
تقوم خاصية OrderDetails في كل طلبات بتخزين تفاصيل الطلب المقابلة للطلب.
إضافة سمة تفاصيل الطلب في الطلبات. java
OrdersMapperCustom.xml
تعريف النتيجة
استخدام تمديد الميراث دون تكوين تعيين معلومات الطلب ومعلومات المستخدم في
المجموعة: استعلام عن سجلات متعددة لرسم خريطة لكائن التجميع لاستعلام الجمعية
الخاصية: خريطة الاستعلام على الجمعية إلى سجلات متعددة إلى cn.itcast.mybatis.po.orders التي يتم تعيين خاصية إلى cn.itcast.mybatis.po.orders
thortype: يحدد النوع الذي يرسم الخرائط إلى pojo في سمة مجموعة القائمة
<!-ترث النتيجة للطلبات وتفاصيل الطلب باستخدام تمتد ، ولا تحتاج إلى تكوين تعيين معلومات الطلب ومعلومات المستخدم فيه-> <resultmap type = "cn.itcast.mybatis.po.orders" id = "ordersanddradeddetaildmap تحتاج إلى تكوين تعيين معلومات الطلب ومعلومات المستخدم فيه-> <!-معلومات الطلبات المعلومات ، إن استعلام جمعية الطلبات له تفاصيل متعددة. لاستخدام مجموعة إلى مجموعة خريطة: قم بتخطيط سجلات متعددة إلى خاصية كائن المجموعة: الاستعلام عن جمعية MAP إلى سجلات متعددة إلى cn.itcast.mybatis.po.orders أي خاصية من النوع: حدد نوع خريطة pojo إلى قائمة خصائص المجموعة-> <collection property = "orderdetails" oftype = "cn.itcast.mybatis.po.orderdetail معرف تفاصيل الطلب إلى cn.itcast.mybatis.po.orderDetail-> <id column = "orderdetail_id" property = "id"/> <result column = "items_id" property = "itemitiD"/>
OrdersMapperCustom.java
رمز الاختبار:
testpublic void testfindordersandorderDetailResultMap () يلقي استثناء {sqlsession sqlsession = sqlsessionfactory.opensession () ؛ // إنشاء وكيل OrderSmapperCustom ordersMapperCustom = sqlsession.getMapper (OrdersMapperCustom.class <clabpercustom <rormpercustom) ؛ ordersMapperCustom.FindordersandDrandDetailResultMap () ؛ system.out.println (list) ؛ sqlsession.close () ؛ملخص
يستخدم MyBatis مجموعة ResultMap لتعيين سجلات متعددة للاستعلام المرتبط في خاصية مجموعة القائمة.
التنفيذ باستخدام resultType:
تحديد تفاصيل الطلب في OrderDetails في الطلبات ، تحتاج إلى التعامل معها بنفسك ، واستخدام حلقة مزدوجة لاجتياز السجلات المكررة ، ووضع تفاصيل الطلب في OrderDetails.
استفسار العديد من الرجال
المتطلبات: مستخدمي الاستعلام ومعلومات شراء المستخدم.
بيان SQL
الجدول الرئيسي للاستعلام هو: جدول المستخدم
جدول الارتباط: نظرًا لأن المستخدم والمنتج غير مرتبطان بشكل مباشر ، فهي مرتبطة من خلال الطلبات وتفاصيل الطلب ، وبالتالي جدول الارتباط: الطلبات ، OrderDetail
حدد الطلبات.*، user.username ، user.sex ، user.address ، orderdetail.id orderdetail_id ، orderdetail.items_id ، orderdetail.items_num ، orderdetail.orders_id ، items.name ، items.detail items_detail ، items.price. orders.user_id = user.id و orderdetail.orders_id = orders.id و orderdetail.items_id = items.id
رسم خرائط الأفكار
خريطة معلومات المستخدم في المستخدم.
أضف قائمة سمات قائمة الطلبات <ReserS> orderslist في فئة المستخدم لتعيين الطلبات التي أنشأها المستخدم إلى قائمة الطلبات
إضافة قائمة خصائص قائمة تفاصيل الطلب <DressDetail> OrderDetials في الطلبات إلى رسم تخطيط OrderDetials
أضف خاصية العناصر إلى OrderDetail لتعيين العناصر المقابلة لتفاصيل الطلب إلى العناصر
OrdersMapperCustom.xml
تعريف النتيجة
<!-استعل من المستخدمين والمشتراة-> <resultmap type = "cn.itcast.mybatis.po.user" id = "userAndItemSresultMap"> <!-معلومات المستخدم-> <id column = "user_id" property = "id"/> <result column = "username" propert property = "address"/> <!-اطلب معلومات يتوافق المستخدم مع أوامر متعددة ، واستخدم تعيين المجموعة-> <collection property = "orderslist" oftype = "cn.itcast.mybatis.po.orders"> <id column = "id" property = "id"/> <result "column =" user_id "propert property = "createTime"/> <result column = "note" property = "note"/> <! property = "headsnum"/> <result column = "orders_id" property = "ordersId"/> <!-معلومات المنتج تفاصيل الطلب يتوافق مع منتج-> <insivers column = "heads_detail" property = "detail"/> <result column = "items_price" property = "price"/> </sirection> </sollection> </solde> </resultmap>
OrdersMapperCustom.java
رمز الاختبار:
testpublic void testFindUserAndItemSresultMap () يلقي الاستثناء {sqlsession sqlsession = sqlsessionfactory.opensession () ؛ // إنشاء كائن proxy ordersMapperCustom mappercustom = sqlsession.getmapper (OrdersMapperCustom.Class <suls <suster> ordersmapperCustom.FindUserAndItemSultMap () ؛ system.out.println (list) ؛ sqlsession.close () ؛} ملخص استفسار كثير إلى الكثير
سيتم التحقق من القائمة التفصيلية لمعلومات المنتج التي تم شراؤها من قبل المستخدم (اسم المستخدم ، عنوان المستخدم ، اسم المنتج ، وقت الشراء ، كمية الشراء)
استجابةً للمتطلبات المذكورة أعلاه ، نستخدم ResultType لرسم خريطة سجلات الاستعلام في POJO الممتد ، وهو أمر سهل للغاية لتنفيذ وظيفة قائمة مفصلة.
واحد إلى الرجل هو حالة خاصة للعديد من العدد ، على النحو التالي:
عند الاستعلام عن معلومات المنتج التي تم شراؤها من قبل المستخدمين ، فإن العلاقة بين المستخدم والمنتج هي علاقة كثيرة.
الشرط 1:
حقول الاستعلام: حساب المستخدم ، اسم المستخدم ، جنس المستخدم ، اسم المنتج ، سعر المنتج (الأكثر شيوعًا)
القوائم التفصيلية الشائعة في تطوير المؤسسات ، قوائم مفصلة من المنتجات التي اشتراها المستخدمون ،
استخدم resultType لتعيين عمود الاستعلام أعلاه إلى إخراج POJO.
الشرط 2:
حقول الاستعلام: حساب المستخدم ، اسم المستخدم ، كمية العناصر المشتراة ، تفاصيل المنتج (الماوس على عرض التفاصيل)
استخدم ResultMap لتعيين قائمة تفاصيل المنتج التي تم شراؤها من المستخدم في كائن المستخدم.
تلخيص:
استخدام ResultMap هو لتلك الوظائف التي لها متطلبات خاصة لرسم خرائط نتائج الاستعلام ، مثل تعيين المتطلبات الخاصة في قوائم بما في ذلك قوائم متعددة.
ملخص ResultType و ResultMap
النتيجة:
تأثير:
قم بتخطيط نتائج الاستعلام في POJO وفقًا لاسم سمة عمود SQL POJOWEST.
مناسبة:
عرض شائع للسجلات التفصيلية ، مثل عندما يشتري المستخدمون تفاصيل المنتج وعرض جميع معلومات الاستعلام المرتبطة بها على الصفحة ، يمكنك استخدام ResultType مباشرة لتعيين كل سجل.
قم بإطلاق النار في Pojo ، وافقي القائمة (Pojo في القائمة) على الصفحة الأمامية.
النتيجة:
استخدم الجمعية والجمع لإكمال رسم الخرائط المتقدمة الفردية والفردية (هناك متطلبات تعيين خاصة للنتائج).
منظمة:
تأثير:
قم بتخطيط معلومات الاستعلام المرتبطة به في كائن Pojo.
مناسبة:
من أجل تسهيل الاستعلام عن المعلومات المرتبطة به ، يمكنك استخدام الارتباط لتعيين معلومات الطلب المرتبطة به في سمات POJO لكائنات المستخدم ، مثل: الاستعلام عن أوامر ومعلومات المستخدم المرتبطة بها.
لا يمكن باستخدام ResultType تعيين نتائج الاستعلام إلى سمة Pojo لكائن PoJo. اختر ما إذا كنت تريد استخدام ResultType أو ResultMap وفقًا لاحتياجات اجتياز استعلام مجموعة النتائج.
مجموعة:
تأثير:
قم بتخطيط معلومات الاستعلام المرتبطة به في مجموعة قائمة.
مناسبة:
من أجل تسهيل معلومات جمعية التمريرات ، يمكنك استخدام المجموعة لتعيين معلومات الارتباط إلى مجموعة القائمة ، مثل: الاستعلام عن وحدة نطاق إذن المستخدم والقائمة أسفل الوحدة النمطية ، يمكنك استخدام المجموعة لتعيين قائمة الوحدة النمطية لرسم خريطة لسمات قائمة القائمة لكائن الوحدة النمطية. الغرض من ذلك هو أيضًا تسهيل الاستعلام عن مجموعة نتائج الاستعلام.
إذا كنت تستخدم resultType ، لا يمكنك تعيين نتائج الاستعلام إلى مجموعة القائمة.
تأخير التحميل
يمكن لـ ResultMap تنفيذ رسم الخرائط المتقدمة (باستخدام الارتباط والجمع لتنفيذ رسم الخرائط الفردية والفردية). الجمعية والجمع لها وظائف التحميل كسول.
يحتاج:
إذا تم الاستعلام عن الطلب وترتبط معلومات المستخدم. إذا قمنا أولاً بالاستعلام عن معلومات الطلب لتلبية المتطلبات ، فسنقوم بالاستعلام عن معلومات المستخدم عندما نحتاج إلى الاستعلام عن معلومات المستخدم. يتم تأخير معلومات المستخدم عند الطلب.
تأخير التحميل: الاستعلام الأول من جدول واحد ، ثم من الجدول المرتبط عند الحاجة ، تحسين أداء قاعدة البيانات بشكل كبير ، لأن الاستعلام عن جدول واحد أسرع من الاستعلام عن جداول متعددة.
استخدم الجمعية لتنفيذ التحميل البطيء
المتطلبات: أوامر الاستعلام وربط معلومات مستخدم الاستعلام
ordresmapperCustom.xml
من الضروري تحديد البيان المقابل لطريقتي Mapper.
1. معلومات طلب الاستعلام فقط
حدد * من الطلبات
استخدم الجمعية لتأخير التحميل (تنفيذ) الرضا التالي (معلومات مستخدم الاستعلام عن الجمعية) في بيان أمر الاستعلام
2. معلومات مستخدم الاستعلام ذات الصلة
يتم استخدام user_id للاستعلام عن معلومات المستخدم باتباع user_id في استعلام معلومات الطلب أعلاه
استخدم FindUserByid في usermapper.xml
ينفذ FIRST FIRTHORDERSERLAZYLOADING ، وعندما تحتاج إلى الاستعلام عن المستخدم ، ثم يتم تنفيذ FindUserById ، ويتم تكوين التحميل والتأخر من خلال تعريف ResultMap.
تأخير التحميل نتيجة الخريطة
استخدم SELECT في الجمعية لتحديد معرف البيان المراد تنفيذه عن طريق التحميل كسول.
<!-lazy loaded resultmap-> <resultmap type = "cn.itcast.mybatis.po.orders" id = "ordersUserLazyLoadingResultMap"> <!-رسم خرائط تكوين معلومات الطلب-> <id column = "id" property = "id"/> <result user_id "property = column = "createTime" property = "createTime"/> <result column = "note" property = "note"/> <!-تعيين تكوين معلومات الطلب-> <id column = "id" property = "user_id" propert
حدد: حدد معرف البيان المراد تنفيذه للتحميل الكسول (العبارة التي تعتمد على معلومات المستخدم بناءً على user_id)
لاستخدام FindUserById في usermapper.xml لإكمال الاستعلام بناءً على معلومات المستخدم معرف المستخدم (user_id). إذا لم يكن FindUserByid في هذا الخريطة ، فأنت بحاجة إلى إضافة مساحة اسم قبل ذلك.
العمود: العمود في معلومات الطلب المرتبطة باستعلام معلومات المستخدم هو user_id
يُفهم SQL for Association Query على النحو التالي:
حدد الطلبات.*، (حدد اسم المستخدم من المستخدم WHERE ORDERS.USER_ID = user.id) اسم المستخدم ، (حدد الجنس من المستخدم حيث orders.user_id = user.id) sexfrom orders-> <Assistrict property = "user" javatype = "cn.itcast.mybatis.po.user" select = column = "user_id"> <!-قم بتنفيذ عملية تحميل كسول لمعلومات المستخدم-> </ensivand> </resultmap>
OrderesMapperCustom.java
أفكار الاختبار:
1. تنفيذ طريقة mapper أعلاه (findordersuserlazyloading) ، واتصل FindorSuserLazyLoading في cn.itcast.mybatis.mapper.ordersmapperCustom للاستعلام فقط معلومات طلب (جدول واحد).
2. في البرنامج ، تم تجارة القائمة <Resers> في الخطوة السابقة. عندما نسمي طريقة getUser في الطلبات ، نبدأ التحميل كسول.
3.
تكوين تحميل كسول
لا يمكّن MyBatis التحميل البطيء افتراضيًا ، ويجب تكوينه في sqlmapconfig.xml.
تكوين في ملف التكوين الأساسي MyBatis:
اضبط الوصف المسموح بالقيمة الافتراضية القيمة المسموح بها
LazyLoadingEnabled تعيين على مستوى العالم تحميل كسول. إذا تم ضبطها على "FALSE" ، فسيتم تهيئة جميع تلك المرتبطة وتحميلها. صحيح أو خطأ
aggressivelazyloading عند ضبطها على "True" ، قد يتم تحميل كائنات التحميل كسول بواسطة جميع الخصائص البطيئة. خلاف ذلك ، يتم تحميل كل خاصية حسب الحاجة. صحيح أو خطأ صحيح
التكوين في sqlmapconfig.xml:
رمز الاختبار
التفكير في تأخير التحميل
كيفية تحقيق التحميل كسول دون استخدام الارتباط والجمع الذي توفره MyBatis؟
طريقة التنفيذ هي كما يلي:
تحديد طريقتين من Mapper:
1. الاستعلام عن قائمة الطلبات
2. استعلام معلومات المستخدم بناءً على معرف المستخدم
أفكار التنفيذ:
تحقق أولاً من طريقة Mapper الأولى واحصل على قائمة معلومات الطلب
في البرنامج (الخدمة) ، اتصل بالطريقة الثانية من Mapper حسب الحاجة للاستعلام عن معلومات المستخدم.
باختصار: استخدم طريقة التحميل البطيئة للاستعلام عن SQL Simple (ويفضل أن يكون جدولًا واحدًا ، يمكنك أيضًا ربط الاستعلامات) ، ثم تحميل معلومات أخرى من الاستعلامات المرتبطة حسب الحاجة.
ذاكرة التخزين المؤقت الاستعلام
يوفر MyBatis ذاكرة التخزين المؤقت للاستعلام لتقليل ضغط البيانات وتحسين أداء قاعدة البيانات.
يوفر MyBaits ذاكرة التخزين المؤقت من المستوى الأول وذاكرة التخزين المؤقت من المستوى الثاني.
ذاكرة التخزين المؤقت المستوى 1 هي ذاكرة التخزين المؤقت على مستوى SQLSession. عند تشغيل قاعدة البيانات ، تحتاج إلى إنشاء كائن SQLSession ، وهناك بنية بيانات (HashMap) في الكائن لتخزين البيانات المخزنة. لا تؤثر مناطق البيانات المخزنة مؤقتًا (HashMaps) بين SQLSessions المختلفة على بعضها البعض.
ذاكرة التخزين المؤقت الثانوية هي ذاكرة التخزين المؤقت على مستوى الخرائط. تعمل SQLSessions المتعددة على بيانات SQL لنفس الخريطة. يمكن لـ SQLSessions متعددة مشاركة ذاكرة التخزين المؤقت الثانوية. ذاكرة التخزين المؤقت الثانوية هي sqlsession.
لماذا تستخدم ذاكرة التخزين المؤقت؟
إذا كانت هناك بيانات في ذاكرة التخزين المؤقت ، فلن تحتاج إلى الحصول عليها من قاعدة البيانات ، مما يحسن أداء النظام بشكل كبير.
ذاكرة التخزين المؤقت المستوى 1
مبدأ عمل التخزين المؤقت من المستوى الأول
في المرة الأولى التي بدأت فيها استعلامًا على معلومات المستخدم مع معرف المستخدم 1 ، ابحث أولاً عما إذا كانت هناك معلومات مستخدم مع معلومات المستخدم مع المعرف 1 في ذاكرة التخزين المؤقت. إذا لم يكن كذلك ، استفسر من معلومات المستخدم من قاعدة البيانات.
احصل على معلومات المستخدم وتخزين معلومات المستخدم في ذاكرة التخزين المؤقت من المستوى الأول.
إذا قام SQLSession بإجراء عمليات الالتزام (ينفذ الإدراج والتحديث وحذف) ، يقوم بمسح ذاكرة التخزين المؤقت من المستوى الأول في SQLSession. والغرض من ذلك هو جعل تخزين ذاكرة التخزين المؤقت أحدث المعلومات وتجنب القراءة القذرة.
في المرة الثانية التي بدأت فيها استعلامًا على معلومات المستخدم مع معرف المستخدم 1 ، ابحث أولاً عما إذا كانت هناك معلومات مستخدم مع معلومات المستخدم مع المعرف 1 في ذاكرة التخزين المؤقت. إذا كان هناك واحد في ذاكرة التخزين المؤقت ، فسوف أحصل مباشرة على معلومات المستخدم من ذاكرة التخزين المؤقت.
اختبار ذاكرة التخزين المؤقت المستوى 1
يدعم MyBatis التخزين المؤقت للمستوى الأول افتراضيًا ولا يلزم تكوينه في ملف التكوين.
اتبع الخطوات الرئيسية لخطوات التخزين المؤقت من المستوى أعلاه للاختبار.
//ordersmappercusntomtest.java@testpublic void testcache1 () يلقي الاستثناء {sqlsession sqlsession = sqlsessionfactory.opensession () بدأ المستخدم مع المعرف 1 هو user user user1 = usermapper.finduserbyid (1) ؛ system.out.println (user1) ؛ // إذا قام SQLSession بإجراء عمليات الالتزام (ينفذ الإدراج ، التحديث ، وحذف) ، يقوم بمسح ذاكرة التخزين المؤقت للمستوى الأول في SQLSession. والغرض من ذلك هو جعل تخزين ذاكرة التخزين المؤقت أحدث المعلومات وتجنب القراءة القذرة. // update user1 معلومات user1.setUserName ("test user22") ؛ usermapper.updateuser (user1) ؛ // تنفيذ عملية الالتزام لمسح ذاكرة التخزين المؤقت sqlsession.commit () ؛تطبيق ذاكرة التخزين المؤقت المستوى 1
التطوير الرسمي هو دمج mybatis والربيع ، والمعاملات يتم التحكم فيها في الخدمة.
تتضمن طريقة الخدمة العديد من مكالمات طريقة Mapper.
الخدمة {// عند بدء التنفيذ ، وابدأ المعاملة وإنشاء كائن SQLSession // استدعاء طريقة mapper لأول مرة FindUserById (1) // cell طريقة mapper للمرة الثانية FindUserById (1) ، جلب البيانات من مخطط التخزين المؤقت الأول // المنتهي ، sqlsession تم إغلاق}}إذا قمت بتنفيذ مكالمتين خدمة للاستعلام عن معلومات المستخدم نفسها ، فلن تذهب إلى ذاكرة التخزين المؤقت من المستوى الأول ، لأن طريقة الجلسة تنتهي ، سيتم إغلاق SQLSession وسيتم مسح ذاكرة التخزين المؤقت من المستوى الأول.
المستوى 2 ذاكرة التخزين المؤقت
مبدأ
أولاً ، قم بتمكين ذاكرة التخزين المؤقت من المستوى الثاني من MyBatis.
SQLSession1 Querys معلومات المستخدم مع معرف المستخدم 1. عند الاستعلام عن معلومات المستخدم ، سيتم تخزين بيانات الاستعلام في ذاكرة التخزين المؤقت الثانوية.
إذا قام SQLSession3 بتنفيذ SQL ضمن نفس الخريطة ، فإن تنفيذ تقديم الالتزام ويزيل البيانات في منطقة ذاكرة التخزين المؤقت الثانوية أسفل الخريطة.
SQLSession2 يسكّر معلومات المستخدم بمعرف المستخدم 1 ، ويجد ما إذا كانت هناك بيانات في ذاكرة التخزين المؤقت. إذا كانت موجودة ، يتم استرداد البيانات مباشرة من ذاكرة التخزين المؤقت.
الفرق بين ذاكرة التخزين المؤقت الثانوية والذاكرة التخزين المؤقت الأساسية أكبر. نطاق ذاكرة التخزين المؤقت الثانوية أكبر. يمكن لـ SQLSessions متعددة مشاركة منطقة ذاكرة التخزين المؤقت الثانوية في UserMapper.
لدى UserMapper منطقة ذاكرة التخزين المؤقت الثانوية (تقسيم مساحة الاسم) ، كما أن MapPppers الأخرى لديها منطقة ذاكرة التخزين المؤقت الثانوية الخاصة بهم (تقسيم مساحة الاسم).
كل Mapper مساحة اسم لديه منطقة ذاكرة التخزين المؤقت الثانية. إذا كانت مساحة اسم المحطيبين هي نفسها ، فسيكون للمحميين نفس منطقة ذاكرة التخزين المؤقت الثانية عند تنفيذ البيانات بواسطة SQL.
قم بتشغيل ذاكرة التخزين المؤقت من المستوى 2
ذاكرة التخزين المؤقت من المستوى الثاني لـ MyBaits هي مستوى نطاق Mapper. بالإضافة إلى تعيين التبديل الرئيسي للذاكرة التخزين المؤقت من المستوى الثاني في sqlmapconfig.xml ، يجب أيضًا تمكين ذاكرة التخزين المؤقت من المستوى الثاني في mapper.xml المحددة.
تمت إضافة إلى ملف التكوين الأساسي sqlmapconfig.xml
<Setting Name = "Cacheenabled" value = "true"/>
الوصف المسموح بالقيمة الافتراضية القيمة
إعدادات CacheEnabled على مستوى العالم لجميع ذاكرة التخزين المؤقت ضمن ملف التكوين هذا. صحيح أو خطأ
قم بتشغيل ذاكرة التخزين المؤقت الثانوية في usermapper.xml ، وسيتم تخزين تنفيذ SQL تحت usermapper.xml في منطقة ذاكرة التخزين المؤقت (HashMap).
اتصل بفئة Pojo لتنفيذ واجهة التسلسل
من أجل استخراج البيانات المخبأة ، يتم تنفيذ عمليات إزالة التأهيل ، لأن وسائط تخزين البيانات الثانوية المخزنة مؤقتًا متنوعة ومختلفة في الذاكرة.
اختبار ذاكرة التخزين المؤقت المستوى 2
testpublic void testcache2 () يلقي الاستثناء {sqlsession sqlsession1 = sqlsessionfactory.opensession () ؛ sqlsession sqlsession2 = sqlsessionfactory.opensession sqlsession1.getMapper (usermapper.class) ؛ // ابدأ الطلب الأول والاستعلام عن المستخدم مع user user 1 = usermapper1.finduserbyid (1) ؛ system.out.println (user1) ؛ // قم بتنفيذ العملية الوثيقة هنا وكتابة البيانات في sqlsession إلى منطقة cache الثانوية sql () تنفيذ الالتزام () عملية usermapper usermapper3 = sqlsession3 sqlsession3.commit () ؛ sqlsession3.close () ؛ usermapper usermapper2 = sqlsession2.getMapper (usermapper.class) ؛ // إرسال الطلب الثاني للاستعلام عن المستخدم باستخدام user 2 = usermapper2.finduserbyid (1) ؛ system.println (user2) ؛ sqlsession2 ؛تكوين usecache
يمكن أن يؤدي تعيين usecache = false في البيان إلى تعطيل ذاكرة التخزين المؤقت الثانوية لبيان الاختيار الحالي ، أي أن كل استعلام سيصدر SQL للاستعلام. الافتراضي صحيح ، أي أن SQL يستخدم ذاكرة التخزين المؤقت الثانوية.
<SELECT ID = "FindOrderListresultMap" resultMap = "OrdersUserMap" usecache = "false">
ملخص: لكل استعلام ، مطلوب أحدث البيانات SQL. قم بتعيينه على usecache = false وتعطيل ذاكرة التخزين المؤقت الثانوية.
تحديث ذاكرة التخزين المؤقت
فقط امسح ذاكرة التخزين المؤقت
في نفس مساحة الاسم من Mapper ، إذا كان هناك بيانات أخرى أو تحديث أو حذف بيانات التشغيل ، يجب تحديث ذاكرة التخزين المؤقت ، وإذا لم يتم تحديث ذاكرة التخزين المؤقت ، فستحدث القراءة القذرة.
اضبط خاصية FlushCache = "TRUE" في تكوين العبارة. بشكل افتراضي ، هذا صحيح ، مما يعني أن ذاكرة التخزين المؤقت تم تحديثها. إذا تم تغييره إلى خطأ ، فلن ينعش. عند استخدام ذاكرة التخزين المؤقت ، ستحدث القراءات القذرة إذا قمت بتعديل بيانات الاستعلام يدويًا في جدول قاعدة البيانات.
<insert id = "insertuser" parametertype = "cn.itcast.mybatis.po.user" flushcache = "true">
ملخص: بشكل عام ، بعد تنفيذ عملية الالتزام ، يجب تحديث ذاكرة التخزين المؤقت. FlushCache = True يعني تحديث ذاكرة التخزين المؤقت ، والتي يمكن أن تتجنب القراءة القذرة لقاعدة البيانات.
MyBatis تكامل Ehcache
ehcache是一个分布式缓存框架。
分布缓存
我们系统为了提高系统并发,性能、一般对系统进行分布式部署(集群部署方式)
不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。
mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合。
整合ehcache方法(掌握)
mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。
mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。
mybatis默认实现cache类是:
加入ehcache包
整合ehcache
配置mapper中cache中的type为ehcache对cache接口的实现类型。
加入ehcache的配置文件(在classpath下配置ehcache.xml)
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"><diskStore path="F:/develop/ehcache" /><defaultCache maxElementsInMemory="1000" maxElementsOnDisk="10000000"eternal="false" overflowToDisk="false" timeToIdleSeconds="120"timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"></defaultCache></ehcache>
属性说明:
diskStore:指定数据在磁盘中的存储位置。
defaultCache:当借助CacheManager.add(“demoCache”)创建Cache时,EhCache便会采用<defalutCache/>指定的的管理策略
以下属性是必须的:
maxElementsInMemory - 在内存中缓存的element的最大数目
maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大
eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
以下属性是可选的:
timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.
diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)
二级应用场景
对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。
二级缓存局限性
mybatis二级缓存对细粒度的数据级别的缓存实现不好,比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。