1. مقدمة وتكوين MyBatis+Spring+MySQL
1.1 مقدمة إلى MyBatis
MyBatis هو إطار طبقة الثبات يمكنه تخصيص SQL ، والإجراءات المخزنة ، والتعيينات المتقدمة. يقوم MyBatis بإلغاء معظم رمز JDBC ، وإعداد المعلمة اليدوية واسترجاع مجموعة النتائج. يستخدم MyBatis فقط XML والشروح البسيطة لتكوين وتعيين أنواع البيانات الأساسية ، وواجهات MAP ، و POJOS إلى سجلات قاعدة البيانات. بالمقارنة مع حلول ORM "One-Stop" مثل Hibernate و Apache OJB ، فإن MyBatis هو تطبيق ORM "شبه ذاتي".
حزمة الجرة التي يجب استخدامها: mybatis-3.0.2.jar (حزمة MyBatis الأساسية). mybatis-spring-1.0.0.jar (جنبًا إلى جنب مع الربيع).
عنوان التنزيل:
http://ibatis.apache.org/tools/ibator
http://code.google.com/p/mybatis/
1.2MyBatis+Spring+MySQL التكوين البسيط
1.2.1 بناء بيئة الربيع
(1) إنشاء مشروع الويب Maven ؛
(2) إضافة إطار الربيع وملفات التكوين ؛
(3) إضافة حزم الجرة المطلوبة (إطار الربيع ، mybatis ، mybatis-spring ، junit ، إلخ) إلى pom.xml ؛
(4) تغيير ملفات التكوين من web.xml و spring ؛
(5) إضافة صفحة JSP ووحدة التحكم المقابلة ؛
(6) اختبار.
للإشارة: http://limingnihao.iteye.com/blog/830409. بناء مشروع SpringMVC مع Maven من Eclipse
1.2.2 إنشاء قاعدة بيانات MySQL
إنشاء قاعدة بيانات لإدارة اختيار الدورة التدريبية.
الجدول: جدول الطالب ، جدول الفصل ، جدول المعلم ، جدول الدورة ، جدول الدورة الطالب.
علاقة منطقية: كل طالب لديه فصل ؛ كل فصل يتوافق مع مدرس الفصل ؛ يمكن أن يكون كل معلم فقط مدرس الفصل في فصل واحد ؛
استخدم SQL التالي لإنشاء قاعدة بيانات ، أولاً إنشاء جدول طالب ، وإدراج البيانات (أكثر من عنصرين).
لمزيد من SQL ، يرجى تنزيل ملف مصدر المشروع في Resource/SQL.
/* إنشاء قاعدة بيانات*/ إنشاء قاعدة بيانات student_manager ؛ استخدم student_manager ؛ / ***** إنشاء جدول الطالب *****/ إنشاء Table Student_tbl (student_id varchar (255) المفتاح الأساسي ، student_name varchar (10) not null ، student_sex varchar (10) ، student_birthday date ، class_id varchar (255)) ؛ /*أدخل بيانات الطالب*/ إدراج في Student_TBL (student_id ، student_name ، student_sex ، student_birthday ، class_id) القيم (123456 ، 'xxx' ، 'أنثى' ، '1980-08-01' ، 121546)
قم بإنشاء ملف التكوين mysql.properties المستخدم للاتصال بـ MySQL.
jdbc.driverclassname = com.mysql.jdbc.driver jdbc.url = jdbc: mysql: // localhost: 3306/student_manager؟ user = root & password = limingnihao & useUnicode = true & minualencoding = utf-8
1.2.3 بناء بيئة mybatis
الطلب غير رسمي ، والترتيب الحالي هو أنه يمكنك تعديل الملفات المكتوبة بأقل قدر ممكن.
1.2.3.1 إنشاء فئة كيان: الطالب
طالب الطبقة العامة يطالب بالتسلسل {private static final long serialversionuid = 3096154202413606831l ؛ الكلاسيكية الكلاسيكية الخاصة ؛ تاريخ خاص الطالب يوم الطالب ؛ سلسلة خاصة سلسلة خاصة للطلاب ؛ سلسلة خاصة StudentSex ؛ الكلاسيكية العامة getClassentity () {return Classentity ؛ } التاريخ العام getStudentBirthDay () {return StudentBirthday ؛ } السلسلة العامة getStudentId () {return studentId ؛ } السلسلة العامة getStudentName () {return studentName ؛ } السلسلة العامة getStudentSex () {return studentSex ؛ } public void setClassentity (Classentity Classentity) {this.classentity = Classentity ؛ ) } public void setStudentId (String studentId) {this.studentId = studentId ؛ } public void setStudentName (String StudentName) {this.studentName = studentName ؛ } public void setStudentSex (String StudentSex) {this.studentSex = studentSex ؛ }} 1.2.3.2 إنشاء واجهة الوصول إلى البيانات
واجهة DAO المقابلة لفئة الطالب: StudentMapper.
الواجهة العامة studentMapper {public studententity getStudent (String studentId) ؛ الطلاب العام getStudentAndClass (String studentId) ؛ القائمة العامة <Tudententity> getStudentall () ؛ إدراج الفراغ العام (كيان الطالب) ؛ حذف الفراغ العام (كيان الطالب) ؛ updatestudent باطل عام (كيان الطالب) ؛ }1.2.3.3 إنشاء ملف بيانات تعيين SQL
ملف SQL Class الطالب SQL ملف الطالب
علامة النتيجة: تعيين حقول الجدول والسمات.
حدد العلامة: استعلام SQL.
<؟ <resultmap type = "studententity" id = "studentresultmap"> <id property = "studentId" column = "student_id"/> <result property = "studentName column =" student_name "/> <result property =" studentsex <SELECT ID = "getStudent" parametertype = "string" resultType = "studententity" resultMap = "StudentResultMap"> <! resultType = "com.manager.data.model.studententity" resultMap = "StudentResultMap"> <!
1.2.3.4 إنشاء ملف تكوين MyBatis Mapper
إنشاء ملف تكوين MyBatis في SRC/Main/Resource: MyBatis-Config.xml.
TypeAliases علامة: أعط الاسم المستعار الفئة الاسم المستعار. يمكن استخدام com.manager.data.model.studententity فئة بدلاً من الطالب.
العلامة MAPPERS: تحميل ملف بيانات تعيين SQL لفئة الكيان في MyBatis.
<؟ type = "com.manager.data.model.studententity"/> </typealiases> <mappers> <mapper resource = "com/manager/data/maps/studentMapper.xml"/> </mappers> </ispification>
1.2.3.5 تعديل ملف تكوين الربيع
إنه يضيف بشكل أساسي حبة فئة مصنع الإنتاج من SQLSession: SQLSessionFactoryBean (في حزمة MyBatis.Spring). يتطلب تحديد موقع ملف التكوين ومصاعد البيانات.
تنفيذ الحبة المقابلة لواجهة الوصول إلى البيانات. تم إنشاؤها من خلال MapPerfactorybean. من الضروري تنفيذ الاسم الكامل لفئة الواجهة والإشارة إلى SQLSession Factory Bean.
<!-استيراد ملف تكوين خاصية-> <السياق: property-placeholder location = "classpath: mysql.properties" /> <bean id = "datasource"> <property name = "driverClassName" value = "$ {jdbc.driverclassname}" /> <propert ID = "TransactionManager"> <property name = "dataSource" ref = "datasource" /> </bean> <bean id = "sqlsessionfactory"> <property name = "configlocation value =" classPath: < /> /! id = "studentMapper"> <property name = "mapperinterface" value = "com.manager.data.studentMapper" /> <property name = "sqlsessionfactory" ref = "sqlsessionfactory" /> </bean> لا يمكنك أيضًا تحديد الفول الخريطة ، واستخدام التعليقات التوضيحية:
أضف الطالب إلى التعليق التوضيحي
repository @transactional واجهة عامة studentMapper {}الاحتياجات المقابلة هي إضافة عمليات مسح في servlet.xml dispatcher.xml:
<Bean> <property name = "enrotationClass" value = "org.springframework.stereotepee.repository"/> <property name = "basepackage"
1.2.4 اختبار الطالب
استخدم اختبارات springmvc لإنشاء اختبار testController ، وتكوين tomcat ، والوصول إلى صفحة index.do للاختبار:
controller الفئة العامة testController {Autowired Private StudentMapper StudentMapper ؛ requestmapping (value = "index.do") public void indexPage () {studententity unitity = studentMapper.getStudent ("10000013") ؛ System.out.println ("الاسم:" + entity.getStudentName ()) ؛ }}اختبار مع Junit:
Runwith (value = SpringJunit4ClassRunner.Class) contextConfiguration (value = "test-servlet.xml") فئة عامة studentMapperTest {autowired private classmapper ؛ Autowired studentMapper StudentMapper ؛ transactional public void getStudentTest () {studententity ictity = studentMapper.getStudent ("10000013") ؛ System.out.println ("" + entity.getStudentId () + entity.getStudentName ()) ؛ قائمة <Tudententity> StudentList = StudentMapper.getStudentall () ؛ لـ (entitytemp entitytemp: studentList) {system.out.println (entitytemp.getStudentName ()) ؛ }}} 2.MYBATIS 'ملف التكوين الرئيسي
عند تحديد SQLSessionFactory ، تحتاج إلى تحديد ملف التكوين الرئيسي MyBatis:
<bean id = "sqlsessionfactory"> <property name = "configlocation" value = "classpath: mybatis-config.xml" /> <property name = "datasource" ref = "datasource" /> </bean>
تتضمن العواصف الفرعية تحت التكوين في تكوين MyBatis:
التكوين |-خصائص |-الإعدادات | --- typealiases | --- TypeHandlers | --- ObjectFactory | --- الإضافات | --- البيئات | --- البيئة | --- | ---- | --- المعاملات | ---- | ---- |
2.1 خصائص الخصائص
ترتبط ملفات تكوين الخصائص بـ java.properties. قم بتكوين مورد الخصائص لتحديد مسار .properties ، ثم تكوين اسم وقيمة الخاصية ضمن علامة الخصائص. يمكنك استبدال قيمة الخاصية المقابلة في ملف .properties.
<!-استبدال الخاصية-> <properties Resource = "mysql.properties"> <property name = "jdbc.driverClassName" value = "com.mysql.jdbc.driver"/> <property name = "jdbc.url" value = "jdbc: mysql: // localhost: 3306/ value = "root"/> <property name = "password" value = "limingnihao"/> </properties>
2.2 الإعدادات
هذه خطوة مهمة لـ MyBatis لتعديل تفاصيل عملية التشغيل. يصف الجدول التالي هذه الإعدادات والمعاني والقيم الافتراضية.
إعدادات | يصف | القيم المسموح بها | القيمة الافتراضية |
Cacheenabled | جميع ذاكرة التخزين المؤقت تحت ملف التكوين هذا هي إعدادات/إيقاف عالميا. | صحيح | خطأ شنيع | حقيقي |
LazyLoadingEnabled | الإعدادات العالمية تحميل كسول. إذا تم ضبطها على "FALSE" ، فسيتم تهيئة جميع تلك المرتبطة وتحميلها. | صحيح | خطأ شنيع | حقيقي |
agressivelazyloading | عند ضبطها على "TRUE" ، قد يتم تحميل كائنات التحميل البطيئة بواسطة جميع الخصائص البطيئة. خلاف ذلك ، يتم تحميل كل خاصية حسب الحاجة. | صحيح | خطأ شنيع | حقيقي |
MultiplerSultSetSetsEndabled | السماح ولا تسمح لبيان واحد بإرجاع مجموعات بيانات متعددة (اعتمادًا على متطلبات برنامج التشغيل) | صحيح | خطأ شنيع | حقيقي |
USECOLURNINLABEL | استخدم ملصقات العمود بدلاً من أسماء الأعمدة. محركات الأقراص المختلفة لها طرق مختلفة. ارجع إلى وثائق محرك الأقراص أو اختبرها مع هذين الخيارين المختلفين. | صحيح | خطأ شنيع | حقيقي |
uSgeneratedKeys | يسمح JDBC بإنشاء مفاتيح أساسية. مطلوب دعم محرك الأقراص. إذا تم تعيين هذا الإعداد ، فسيؤدي هذا الإعداد إلى إجبار المفتاح الأساسي الذي تم إنشاؤه على ذلك ، فإن بعض محركات الأقراص غير متوافقة ولكن لا يزال من الممكن تنفيذها. | صحيح | خطأ شنيع | خطأ شنيع |
AutomabingBehavior | يحدد ما إذا كانت MyBatis تلقائيًا تقوم بتخطيط حقول جدول البيانات تلقائيًا لخصائص الكائنات. الجزئي سوف فقط خريطة تلقائيا بسيطة ، دون نتائج متداخلة. سوف تلقائيا تعيين تلقائيا جميع النتائج المعقدة. | لا أحد، جزئي، ممتلىء | جزئي |
DefaultExecutortype | تكوين وتعيين المنفذ ، ويقوم المنفذ البسيط بتنفيذ بيانات أخرى. يجوز لـ Reuse Executor إعادة استخدام بيانات بيانات البيانات المعد ، وقد يقوم المنفذ الدُفعات بتنفيذ البيانات وتحديثات الدُفعات بشكل متكرر. | بسيط إعادة الاستخدام حزمة | بسيط |
DefaultStatementTimeout | قم بتعيين حد زمني لتحديد المدة التي ينتظر فيها محرك الأقراص حتى تستجيب قاعدة البيانات إلى مهلة | عدد صحيح إيجابي | لم يتم تعيينه (باطل) |
<STEPTESS> <STETTER NAME = "Cacheenable" value = "true" /> <setting name = "lazyloadingEnabled" value = "true" /> <setting name = "multiplerSultSetsEnsable" value = "true" /> <setting name = "useColumnLabel" value = "true" </الإعدادات>
2.3 TypeAliases نوع الاسم المستعار
نوع الاسم المستعار هو اختصار أنواع Java.
يرتبط ببساطة بتكوين XML ، مختصر كاسم فئة Java مطولة. على سبيل المثال:
<Typealias> <typealias alias = "userentity" type = "com.manager.data.model.userentity" /> <typealias alias = "studententity" type = "com.manager.data.model.studentity" /> <typealias alias = "classentity" type = </typealias>
مع هذا التكوين ، يمكن استخدام "الطالب" في أي مكان بدلاً من "com.manager.data.model.studententity".
لأنواع Java العادية ، هناك العديد من الاسم المستعار من النوع المدمج. كلاهما غير حساس للحالة ، وبسبب الأسماء الزائدة ، يجب عليك الانتباه إلى التعامل الخاص مع الأنواع الأصلية.
الاسم المستعار | نوع الخريطة |
_byte | بايت |
_طويل | طويل |
_قصير | قصير |
_int | int |
_عدد صحيح | int |
_مزدوج | مزدوج |
_يطفو | يطفو |
_Boolean | منطقية |
خيط | خيط |
بايت | بايت |
طويل | طويل |
قصير | قصير |
int | عدد صحيح |
عدد صحيح | عدد صحيح |
مزدوج | مزدوج |
يطفو | يطفو |
منطقية | منطقية |
تاريخ | تاريخ |
عشري | BigDecimal |
BigDecimal | BigDecimal |
هدف | هدف |
رسم خريطة | رسم خريطة |
هاشماب | هاشماب |
قائمة | قائمة |
ArrayList | ArrayList |
مجموعة | مجموعة |
المتكرر | المتكرر |
2.4 TypeHandlers Type Handle
ما إذا كان MyBatis يقوم بتعيين معلمة في بيان المعالجة المسبقة أو يأخذ قيمة من مجموعة النتائج ، يتم استخدام معالج النوع لتحويل القيمة التي تم الحصول عليها إلى نوع Java بالطريقة المناسبة. يصف الجدول التالي معالج النوع الافتراضي.
اكتب معالج | أنواع جافا | نوع JDBC |
Booleantypehandler | منطقية ، منطقية | أي قيمة منطقية متوافقة |
byteTypeHandler | بايت ، بايت | أي رقم متوافق أو نوع بايت |
ShortTypeHandler | قصير ، قصير | أي شكل رقمي أو قصير متوافق |
IntegerTypeHandler | عدد صحيح ، int | أي رقمية وتكوين صوتية متوافقة |
LongtypeHandler | طويل ، طويل | أي نموذج رقمي أو طويل متوافق |
floattypehandler | تعويم ، تعويم | أي نوع من النقطة العائمة الرقمية أو الدقة الواحدة |
doubletypeHandler | مزدوج ، مزدوج | أي نوع من النقطة الرقمية أو الدقة المزدوجة متوافقة |
BigDecimaltypeHandler | BigDecimal | أي نوع عشري أو عشري متوافق |
StringTypeHandler | خيط | أنواع char و varchar |
clobtypehandler | خيط | أنواع كلوب و Longvarchar |
nstringtypehandler | خيط | أنواع nvarchar و nCHAR |
nclobtypehandler | خيط | نوع NCLOB |
bytearraytypehandler | بايت [] | أي نوع من دفق البايت المتوافق |
blobtypehandler | بايت [] | الأنواع النقطية والطويلة |
DateTypeHandler | التاريخ (java.util) | نوع الطابع الزمني |
DateOnlyTypeHandler | التاريخ (java.util) | نوع التاريخ |
TimeOnlyTypeHandler | التاريخ (java.util) | نوع الوقت |
SqlTimestamptypeHandler | الطابع الزمني (java.sql) | نوع الطابع الزمني |
sqldateTypeHandler | التاريخ (java.sql) | نوع التاريخ |
sqltimetypehandler | الوقت (java.sql) | نوع الوقت |
ObjectTypeHandler | أي | نوع آخر أو غير محدد |
enumtypehandler | نوع التعداد | varchar - أي نوع سلسلة متوافق ، مخزنة كرمز (غير مفهرس). |
الطبقة العامة limingStringTyPeHandler تنفذ typehandler {Override public void setParameter (preparedStatement PS ، int I ، معلمة الكائن ، jdbctype jdbctype) يلقي sqlexpection {system.out.println ("setParameter - parameter:" jdbctype.type_code) ؛ Ps.SetString (I ، ((سلسلة) المعلمة)) ؛ } Override Public Object GetResult (resultset rs ، string columnname) يلقي sqlexception {system.out.println ("getResult - ColumnName:" + columnname) ؛ إرجاع rs.getString (اسم العمود) ؛ } Override Public Object GetResult (Collablestatement CS ، int columnIndex) يلقي sqlexception {system.out.println ("getResult - ColumnIndex:" + columnIndex) ؛ إرجاع cs.getString (ColumnIndex) ؛ }}أضف علامة TypeHandler في TypeHandlers في ملف التكوين.
<TypeHandlers> <typeHandler javatype = "string" jdbctype = "varchar" handler = "liming.student.manager.type.limingStringTypeHandler"/> </typehandlers>
2.5 مصنع كائن ObjectFactory
في كل مرة يقوم MyBatis بإنشاء مثيل جديد لكائن النتيجة ، يتم استخدام ObjectFactory. لا يختلف الكائن الافتراضي عن إنشاء مثيل باستخدام مُنشئ الفئة الهدف. إذا كانت هناك معلمات تم تعيينها بالفعل ، فمن الممكن أيضًا استخدام مُنشئ مع معلمات.
إذا قمت بإعادة كتابة التشغيل الافتراضي لـ ObjectFactory ، فيمكنك إنشاء خاص بك عن طريق وراثة org.apache.ibatis.reflection.factory.defaultObjectFactory.
واجهة ObjectFactory بسيطة. أنه يحتوي على طريقتين لإنشاء ، إحداها هي التعامل مع المنشئ الافتراضي ، والآخر هو التعامل مع مُنشئ المعلمات. في النهاية ، يمكن استخدام طريقة setProperties لتكوين ObjectFactory. بعد تهيئة مثيل ObjectFactory الخاص بك ، سيتم تمرير الخصائص المحددة في جسم العنصر الكائن إلى طريقة setProperties.
الطبقة العامة LimingObjectFactory يمتد DefaultObjectFactory {private Static Final Long SerialVersionuid = -399284318168302833L ؛ Override Public Object Create (نوع الفئة) {return super.create (type) ؛ } Override Public Object Create (نوع الفئة ، قائمة <Class> ConstructorArgTypes ، قائمة <Object> constructorargs) {system.out.println ("إنشاء - النوع:" + type.toString ()) ؛ return super.create (type ، constructorArgTypes ، BuildRuctorArgs) ؛ } Override public void setProperties (خصائص الخصائص) {system.out.println ("setProperties - الخصائص:" + properties.toString () + "، someProperty:" + properties.getProperty ("someProperty")) ؛ super.setProperties (الخصائص) ؛ }}إضافة علامة ObjectFactory إلى ملف التكوين
<objectfactory type = "liming.student.manager.configuration.limingObjectFactory"> <property name = "someProperty" value = "100"/> </oubjectfactory>
2.6 المكونات الإضافية
يتيح لك MyBatis اعتراض المكالمات التي يتم تنفيذها بواسطة عبارات تم تعيينها في مرحلة معينة. بشكل افتراضي ، يسمح MyBatis بالمكونات الإضافية لاعتراض مكالمات طريقة:
يمكن العثور على تفاصيل الأساليب في هذه الفئات من خلال النظر في توقيع كل طريقة ، ويتوفر رمز المصدر الخاص بهم في حزمة توزيع MyBatis. يجب أن تفهم سلوك أساليبك الغالبة ، على افتراض أنك تقوم بأكثر من مراقبة المكالمات. إذا حاولت تعديل أو تجاوز طريقة معينة ، فيمكنك كسر جوهر MyBatis. هذه فئة وطريقة منخفضة المستوى ، ويجب عليك استخدام الإضافات بحذر.
استخدام الإضافات هو القوة البسيطة للغاية التي توفرها. التنفيذ البسيط لواجهة التقاطع ، وحدد التوقيع المحدد الذي تريد اعتراضه.
2.7 البيئات
يمكن تكوين MyBatis مع بيئات متعددة. يمكن أن يساعدك ذلك على تعيين SQL لتتوافق مع قواعد بيانات متعددة ، إلخ.
2.8 Mapper Mapper
فيما يلي بيان يخبر MyBatis أين تبحث عن رسم خرائط SQL. يمكنك استخدام مرجع المورد في ClassPath ، أو استخدام الأحرف لإدخال مرجع عنوان URL الدقيق.
على سبيل المثال:
<mapper resource = "com/manager/data/maps/usermapper.xml"/> <mapper resource = "com/manager/maps/studentMapper.xml"/> <mapper resource = "com/manager/maps/classmapper.xml"/> </mappers>