في هذه المقالة ، سأقدم المبادئ الإطارية لـ MyBatis والبرنامج التمهيدي لـ MyBatis لتحقيق إضافة المستخدم والحذف والتعديل والتفتيش. ما هي مزاياها وعيوبها وما هي العلاقة الموجودة بين MyBatis و Hibernate. آمل أن يكون ذلك مفيدًا لأصدقائي. إذا كانت هناك أي أوجه قصور ، فالرجاء إعطائي بعض النصائح.
ما هو mybatis؟
MyBatis هو مشروع مفتوح المصدر من Apache. في عام 2010 ، تم نقل هذا المشروع من مؤسسة Apache Software Foundation إلى Google Code وتم إعادة تسمية MyBatis. هاجر إلى جيثب في نوفمبر 2013.
MyBatis هو إطار طبقة استمرار ممتازة يدعم SQL المخصصة ، والإجراءات المخزنة ، ورسم الخرائط المتقدمة. يتجنب MyBatis تقريبًا جميع رمز JDBC ومعلمات الإعداد اليدوي ومجموعات النتائج. يستخدم MyBatis XML البسيط أو التعليقات التوضيحية لتكوين ورسم خريطة بدائية ورسم خرائط واجهات Java Pojos (كائنات Java القديمة العادية) في سجلات في قاعدة البيانات. ببساطة ، mybatis هو إطار طبقة ثابتة. يسمح MyBatis للبرنامج بالتركيز على SQL وإنشاء عبارات SQL بحرية ومرونة تلبي الاحتياجات من خلال طريقة التعيين التي توفرها MyBatis. يمكن لـ MyBatis إدخال خريطة إدخال معلمات الإدخال تلقائيًا لإعدادها وتعيين نتائج الاستعلام بمرونة في كائنات Java.
بعد ذلك ، دعونا نفهم مبدأ الإطار لـ MyBatis من خلال صورة:
شرح العمارة الإطارية:
أ. تحميل ملف التكوين: يأتي التكوين من مكانين ، أحدهما هو ملف التكوين والآخر هو شرح رمز Java. يتم تحميل معلومات التكوين الخاصة بـ SQL في كائنات MapPedStatement (بما في ذلك تكوين تعيين المعلمة المرتفع ، وبيانات SQL المنفذة ، وتكوين تعيين النتائج) وتخزينها في الذاكرة.
ب. SQL Parsing: عندما تتلقى طبقة واجهة API طلب المكالمات ، ستتلقى معرف SLQ الوارد والكائن الوارد (يمكن أن يكون خريطة أو نوع بيانات أساسي). ستجد MyBatis المعين المقابل بناءً على معرف SQL ، ثم تحليل MedpedStatement استنادًا إلى كائن المعلمة الواردة. بعد التحليل ، يمكنك الحصول على عبارات ومعلمات SQL ليتم تنفيذها في النهاية.
ج. تنفيذ SQL: خذ SQL النهائي والمعلمات إلى قاعدة البيانات للتنفيذ ، والحصول على نتائج تشغيل قاعدة البيانات.
د. تعيين النتائج: قم بتحويل نتائج قاعدة بيانات التشغيل وفقًا لتكوين التعيين ، والتي يمكن تحويلها إلى HashMap أو Javabean أو نوع البيانات الأساسية ، وإرجاع النتيجة النهائية.
MyBatis بدأ تحليل برنامج البدء
بعد ذلك ، سيقدم المحرر المتطلبات المحددة بالاقتران مع العرض التوضيحي ، والمتطلبات هي كما يلي:
استعلام معلومات المستخدم بناءً على معرف المستخدم ؛
استعلام معلومات المستخدم بشكل غامض بناءً على اسم المستخدم ؛
إضافة وحذف وتحديث المستخدمين.
الخطوة الأولى هي إنشاء حزم وفصول مختلفة ، دليل المشروع كما يلي:
والخطوة الثانية هي كتابة المحتوى في sqlmapconfig.xml ، وتكوين بيئة التشغيل ، ومصدر البيانات ، والمعاملات ، وما إلى ذلك من myBatis. الرمز يشبه هذا:
<span style = "font-family: comic sans ms ؛ font-size: 18px ؛"> <؟ "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-بعد دمج الربيع ، سيتم إلغاء تكوين البيئات-> <البيئات default = "developent"> <! تجمع الاتصال ، الذي تديره MyBatis -> <dataSource type = "poll -bound"> <property name = "driver" value = "$ {jdbc.driver}"/> <property name = "url" value = "$ {jdbc.url}"/> <property name = "username" value = "$ {jdbc.Username} value = "$ {jdbc.password}"/> </dataSource> </eversionments> <!-تحميل ملف الخريطة-> <mappers> resource = "sqlmap/user.xml"/> </nygles> </ispification> </span>الخطوة الثالثة هي كتابة المحتوى في user.java ، كما هو موضح أدناه:
<span style = "font-family: comic sans ms ؛ font-size: 18px ؛"> package cn.itcast.mybatis.po ؛ استيراد java.util.date ؛ /** * * <p> العنوان: المستخدم </p> * <p> الوصف: المستخدم Po </p> * Author Ding Guohua * date 31 يوليو ، 2016 15:39:04 * Version 1.0 */فئة عامة مستخدم {// اسم السمة يتوافق مع مجالات جدول قاعدة البيانات الخاصة ؛ اسم المستخدم الخاص بالسلسلة الخاصة ؛ // اسم المستخدم سلسلة جنسية خاصة ؛ // جنس تاريخ التاريخ الخاص ؛ // عنوان السلسلة الخاصة عيد ميلاد ؛ // العنوان العام int getId () {ide id ؛ } public void setId (int id) {this.id = id ؛ } السلسلة العامة getUserName () {return username ؛ } public void setusername (string username) {this.userName = username ؛ } سلسلة عامة getSex () {return sex ؛ } public void setSex (سلسلة الجنس) {this.sex = sex ؛ } التاريخ العام getBirthday () {return Birthday ؛ } public void setbirthday (Date Birthday) {this.birthday = عيد ميلاد ؛ } السلسلة العامة getAddress () {return address ؛ } public void setAddress (عنوان السلسلة) {this.address = العنوان ؛ } Override Public String ToString () {return "user [id =" + id + "، username =" + username + "، sex =" + sex + "، birthday =" + birthday + "، address =" + address + "]" ؛ }} </span>الخطوة 4: لتنفيذ وظيفة إضافة وحذف وتعديل والبحث أولاً ، اكتب المحتوى في user.xml ، كما هو موضح أدناه:
<span style = "font-family: comic sans ms ؛ font-size: 18px ؛"> <؟ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-مساحة اسم مساحة الاسم هي وظيفة تصنيف إدارة SQL وفهم عزل SQL ملاحظة: TURNING TRANTERSE TRANTERSE TRANTERSE TRANTERSE TRANTERSES TENTERSER TRATEPSURE. -> <!-المتطلبات: الاستعلام عن سجلات جدول المستخدم من خلال المعرف-> <!-تنفيذ معرف استعلام قاعدة البيانات: حدد SQL في ملف التعيين الذي يغلف عبارة SQL في كائن medpedStatement ، وبالتالي فإن المعرف يسمى معلمة المعرف: in the id id ex ex ex ex ex out} the id id id ex exe. الإدخال ، واسم المعلمة هو معرف. إذا كانت معلمة الإدخال نوعًا بسيطًا ، فقد يكون اسم المعلمة في #{} تعسفيًا ، ويمكن أن يكون قيمة أو أسماء أخرى resultType: حدد نوع كائن Java المعين لنتيجة الإخراج لـ SQL ، وحدد تحديد ResultType لتمثيل كائن Java المعمّن إلى سجل واحد. -> <select id = "findUserById" parametertype = "int" resulttype = "cn.itcast.mybatis.po.user"> حدد * من المستخدم حيث id =#{value} </select> <! سلسلة SQL ، وربط المعلمات المستلمة في SQL دون أي تعديل. استخدم $ {} لصق SQL ، مما تسبب في حقن SQL $ {value}: لتلقي محتوى معلمات الإدخال. إذا كان النوع الوارد نوعًا بسيطًا ، فيمكنك فقط استخدام القيمة في $ {}-> <select id = "findUserByName" parametertype = "java.lang.string" resultType = "cn.itcast.mybatis.po.user"> حدد * من المستخدم الذي يشبه "$ {value} ٪ ' النوع هو pojo (بما في ذلك معلومات المستخدم) حدد اسم سمة pojo في #{} ، واتصل قيمة السمة لكائن pojo ، myBatis يحصل على قيمة السمة للكائن من خلال ognl-> <insert id = "insertuser" parametertype = "cn.itcast.mybatis.po.user" last_insert_id (): احصل على قيمة المفتاح الأساسي المسجلة فقط التي تم إدراجها فيها ، والتي تنطبق فقط على مفتاح المفتاح الأساسي للذات: قم بتعيين قيمة المفتاح الأساسي للاستعلام إلى خاصية الكائن المحدد بواسطة Parametertype: حدد نوع الاختيار <sister_ins) keyproperty = "id" order = "بعد" resultType = "java.lang.integer"> حدد last_inser_id () </selectkey> إدراج في المستخدم (اسم المستخدم ، عيد ميلاد ، الجنس ، العنوان) القيمة (#{username} ،#{birthday} ،#{sex} ،#{address}) أولاً ، احصل على المفتاح الأساسي من خلال UUID ، قم بتعيين المفتاح الأساسي على سمة المعرف لكائن المستخدم ، ثم ثانياً ، عند تنفيذ الإدراج ، قم بإزالة قيمة سمة المعرف من كائن المستخدم-> <selectekey keyproperty = "id" order = "before" value (#{username} ،#{birthday} ،#{sex} ،#{address}) ؛ </insert> <!-لحذف المستخدم لحذف مستخدم استنادًا إلى المعرف ، تحتاج إلى إدخال قيمة المعرف-> <delete id = "deleteuser" parametertype = "java.lang.integer"> delete من user where id =#id} </delete> <! يحدد كائن المستخدم ، بما في ذلك المعرف وتحديث المعلومات. ملاحظة: يجب أن يكون المعرف موجودًا#{id}: احصل على قيمة سمة المعرف من كائن مستخدم الإدخال -> <update id = "updateUser" parametertype = "cn.itcast.mybatis.po.user" </samper> </span>الخطوة 5: اكتب الطريقة المحددة على النحو التالي:
<span style = "font-family: comic sans ms ؛ font-size: 18px ؛"> package cn.itcast.mybatis.first ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.util.date ؛ استيراد java.util.list ؛ استيراد org.apache.ibatis.io.resources ؛ استيراد org.apache.ibatis.session.sqlsessionfactory ؛ استيراد org.apache.ibatis.session.sqlsessionfactorybuilder ؛ استيراد org.junit.test ؛ استيراد cn.itcast.mybatis.po.user ؛ الفئة العامة MyBatisfirst {// Query Information استنادًا إلى المعرف والحصول على نتيجة سجل @test public void findUserByIdTest () يلقي IoException {// mybatis configuration file string resource = "sqlmapconfig.xml" ؛ // الحصول على تكوين ملف دفق الإدخال inputStream = sourses.getResourCeasStream (Resource) ؛ // إنشاء مصنع للجلسة ومرور في معلومات ملف التكوين myBatis SQLSessionFactory SQLSessionFactory = جديد SQLSessionFactoryBuilder () .Build (InputStream) ؛ // الحصول على sqlsession من خلال مصنع sqlsession sqlsession = sqlsessionfactory.opensession () ؛ // قم بتشغيل قاعدة البيانات من خلال SQLSession // المعلمة الأولى: معرف البيان في ملف الخريطة يساوي = اسم الاسم+ ". sqlsession.selectone ("test.finduserbyid" ، 1) ؛ System.out.println (user) ؛ // إطلاق المورد sqlsession.close () ؛ } // Query fuzzy قائمة المستخدم بناءً على اسم المستخدم test public void finduserbynametest () يلقي iOexception {// myBatis configuration file string Resource = "sqlmapconfig.xml" ؛ // الحصول على ملف التكوين inputStream inputStream = resources.getResourCeasStream (Resource) ؛ // إنشاء مصنع للجلسة ومرور في معلومات ملف MyBatis SQLSessionFactory SQLSessionFactory = جديد SQLSessionFactoryBuilder (). BUILD (InputStream) ؛ // الحصول على sqlsession من خلال مصنع sqlsession sqlsession = sqlsessionfactory.opensession () ؛ . system.out.println (list) ؛ sqlsession.close () ؛ } public void insertusertest () يلقي iOexception {// myBatis configuration file string Resource = "sqlmapconfig" ؛ // الحصول على تكوين ملف دفق الإدخال inputStream = sourses.getResourCeasStream (Resource) ؛ // إنشاء مصنع للجلسة ومرور في معلومات ملف MyBatis SQLSessionFactory SQLSessionFactory = جديد SQLSessionFactoryBuilder (). BUILD (InputStream) ؛ // الحصول على sqlsession من خلال مصنع sqlsession sqlsession = sqlsessionfactory.opensession () ؛ // أدخل مستخدم كائن المستخدم = مستخدم جديد () ؛ user.setuserName ("Ding Guohua") ؛ user.setbirthday (date ()) ؛ user.setsex ("1") ؛ user.setAddress ("anhui hefei") ؛ . // إرسال الأشياء sqlsession.commit () ؛ // أغلق الجلسة sqlsession.close () ؛ }. // الحصول على تكوين ملف دفق الإدخال inputStream = sourses.getResourCeasStream (Resource) ؛ // قم بإنشاء مصنع ومرور في معلومات ملف MyBatis SQLSessionFactory SQLSessionFactory = SQLSessionFactoryBuilder () // الحصول على sqlsession من خلال مصنع sqlsession sqlsession = sqlsessionfactory.opensession () ؛ // تمرير معرف وارد حذف المستخدم sqlsession.delete ("test.deleteuser" ، 39) ؛ // إرسال الأشياء sqlsession.commit () ؛ // أغلق الجلسة sqlsession.close () ؛ }. // الحصول على تكوين ملف دفق الإدخال inputStream = sourses.getResourCeasStream (Resource) ؛ // إنشاء مصنع للجلسة ومرور في معلومات ملف التكوين myBatis SQLSessionFactory SQLSessionFactory = جديد SQLSessionFactoryBuilder () .BUILD (InputStream) ؛ // الحصول على sqlsession من خلال مصنع sqlsession sqlsession = sqlsessionfactory.opensession () ؛ // تحديث مستخدم المستخدم = مستخدم جديد () ؛ // تحديث معرف user.setId (41) ؛ user.setuserName ("Ding Guohua") ؛ user.setbirthday (date ()) ؛ user.setsex ("2") ؛ user.setAddress ("anhui hefei") ؛ sqlsession.update ("test.updateuser" ، user) ؛ // ارتكاب معاملة sqlsession.commit () ؛ // Close Sqlsession.Close () ؛ }} </span>إيجابيات وسلبيات MyBatis
ميزة:
أ. من السهل البدء والسيطرة.
ب. SQL مكتوب في XML ، مما يسهل الإدارة الموحدة والتحسين.
ج. Decouple SQL ورمز البرنامج.
د. توفير علامات التعيين لدعم رسم خرائط علاقة حقل ORM بين الكائنات وقواعد البيانات
ه. توفير علامات تعيين علاقة الكائن لدعم بناء علاقات الكائن وصيانته
و. توفير علامات XML ودعم كتابة SQL الديناميكي.
عيب:
أ. عبء عمل SQL مرتفع للغاية ، خاصة عندما يكون هناك العديد من الحقول والعديد من الجداول ذات الصلة.
ب. يعتمد SQL على قاعدة البيانات ، مما يؤدي إلى ضعف قابلية نقل قاعدة البيانات.
ج. نظرًا لأن معرف العلامة في XML يجب أن يكون فريدًا ، فإن الطرق في DAO لا تدعم طريقة التحميل الزائد.
د. طبقة DAO بسيطة للغاية ، وعبء عمل تجميع الكائن كبير نسبيًا.
ه. يمكن أن يؤدي الاستخدام غير السليم للذاكرة التخزين المؤقت بسهولة إلى إنشاء بيانات قذرة.
مقارنة بين MyBatis و Hibernate
أوجه التشابه: يمكن لـ Hibernate و MyBatis إنشاء SessionFactory من ملف تكوين XML من خلال SessionFactoryBuilder ، ثم إنشاء جلسة من SessionFactroy. أخيرًا ، تبدأ الجلسة في تنفيذ الأشياء وبيانات SQL. دورات الحياة في SessionFactoryBuilder و SessionFactory والجلسة هي نفسها تقريبًا.
الاختلافات:
MyBatis: صغير ، مريح ، فعال ، بسيط ، مباشر ، شبه آلي ؛
السبات: قوية ، مريحة ، فعالة ، معقدة ، ظرفية ، تلقائية بالكامل ؛
MyBatis:
أ. سهلة البدء والتعلم واستخدامه في أقرب وقت ممكن. يوفر وظيفة ربط الكائن التلقائي لاستعلامات قاعدة البيانات ، ويستمر في الكثير من تجربة استخدام SQL. إنه مثالي للمشاريع التي لا تحتوي على متطلبات نموذج الكائن العالية.
ب. يمكن إجراء تحسين SQL أكثر تفصيلاً ويمكن تقليل حقول الاستعلام.
ج. العيب هو أن الإطار لا يزال بسيطًا نسبيًا وأن الوظائف لا تزال مفقودة. على الرغم من تبسيط رمز ربط البيانات ، إلا أنه يجب كتابة استعلام قاعدة البيانات الأساسي بالكامل في حد ذاته ، إلا أن عبء العمل كبير نسبيًا ، وليس من السهل التكيف مع تعديل قاعدة البيانات السريعة.
د. آلية التخزين المؤقت الثانوية سيئة.
السبات:
أ. وظائف قوية ، وقاعدة البيانات الجيدة غير ذات صلة ، وقدرات رسم الخرائط القوية O/R. إذا كنت بارعًا تمامًا في السبات وتغلف السبات بشكل صحيح ، فستكون رمز طبقة الثبات بأكملها بسيطة للغاية ، والرمز الذي يجب كتابته مرتفع للغاية ، وسرعة التطوير سريعة للغاية ، وهي رائعة للغاية.
ب. هناك آلية تخزين مؤقت ثانوية أفضل ، ويمكن استخدام التخزين المؤقت لجهة خارجية.
ج. العيب هو أن عتبة التعلم ليست منخفضة ، ويجب أن تكون بارعا فيه. كيفية تصميم رسم الخرائط O/R ، وكيفية تحقيق التوازن بين الأداء ونموذج الكائن ، وكيفية استخدام السبات جيدًا ، يتطلب تجربتك وقدرتك على أن تكون قويًا.
اسمحوا لي أن أعطيك استعارة حية:
MyBatis: الأدوات الميكانيكية سهلة الاستخدام ويمكن استخدامها في أقرب وقت ممكن ، ولكن لا يزال يتعين القيام بالعمل من قبل نفسك ، ولكن الأدوات على قيد الحياة ، لذا فإن كيفية جعلها تعتمد علي.
السبات: الروبوت الذكي ، ولكن من المكلف للغاية تطويره (التعلم ، والكفاءة) ويمكن أن يتخلص منه العمل ، ولكن فقط ما يمكن أن يفعله.
رسالة المحرر: في منشور المدونة هذا ، قدم المحرر باختصار المعرفة الأساسية لـ MyBatis ، بما في ذلك العرض التوضيحي البسيط لإضافة وحذف وتعديل والبحث ، ومزايا وعيوب MyBatis ، والمقارنة بين السبات و Mybatis. أوجه التشابه والاختلاف بينهما. MyBatis يعني ببساطة إطار طبقة الثبات. يسمح MyBatis للبرنامج بالتركيز على SQL ، وإنشاء عبارات SQL بحرية ومرونة تلبي الاحتياجات من خلال طريقة التعيين التي توفرها MyBatis. يمكن لـ MyBatis إدخال معلمات الإدخال تلقائيًا لإعدادها ، وتعيين نتائج الاستعلام بمرونة في كائنات Java.
ما ورد أعلاه هو البرنامج التعليمي التمهيدي لنظرة عامة على مبدأ MyBatis الذي قدمه المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!