بشكل عام ، يعد تعديل الكود المصدري للإطار محفوفًا بالمخاطر للغاية ، ولا تعدله ما لم يكن ضروريًا للغاية. لكنني اليوم أعيد بناء فئة SQLSessionFactorybean التي قدمتها MyBatis رسميًا ، والتي تم دمجها مع الربيع. أولاً ، لديها عقلية تجربة وخطأ ، وثانياً ، لها احتياجات واقعية.
اسمحوا لي أن أشرح نقطتين أولاً:
بشكل عام ، تشير إعادة البيع إلى تحسين الكود دون تغيير الوظيفة ، لكن إعادة النية المذكورة في هذه المقالة تتضمن أيضًا إضافة وظائف.
حزم الجرة الرئيسية (الإصدارات) المستخدمة في هذه المقالة: الربيع-*-4.3.3.release.jar ، mybatis-3.4.1.jar ، mybatis-spring-1.3.0.jar
لنبدأ بتكامل MyBatis و Spring.
1. دمج mybatis والربيع
<bean id = "sqlsessionfactory" p: datasource-ref = "datasource" p: configlocation = "classpath: mybatis/mybatis-config.xml"> <property name = "mapperlocations"> <Sray> classpath*: **/.
الفئة الرئيسية للتكامل هي org.mybatis.spring.sqlsessionfactorybean ، وهي عبارة عن فول مصنع تستخدم لإنشاء MyBatis Global Session Factory SqlSessionFactory (أي الفول المصنع الذي يولد مصنع الجلسة) ، و sqlsessionfactory يستخدم لتوليد كائن جلسة sqlsession (SQLSATIN يعادل الاتصال).
حيث الخصائص (التي تم تكوينها باستخدام مساحة الاسم أو عنصر الطفل الخاص بالممتلكات):
DataSource هو مصدر بيانات ، يمكن تكوينه باستخدام DBCP و C3P0 و Druid و JNDI-Lookup وطرق أخرى.
ConfigLocation هو تكوين عالمي لمحرك MyBatis ، يستخدم لتعديل سلوك MyBatis.
MapPerlocations هو ملف تكوين البرنامج النصي SQLMapper (الوضع) الذي يحتاج MyBatis إلى تحميله.
بالطبع ، هناك العديد من السمات الأخرى ، لذلك لن أعطي مثالاً هنا.
2. لماذا إعادة البناء
1. تحسين رمز المصدر
وظيفة SQLSessionFactoryBean هي توليد SQLSessionFactory. دعونا نلقي نظرة على هذه الطريقة (sqlsessionfactorybean.java خط 384-538): /*** بناء {code sqlsessionfactory}. 1.3.0 ، يمكن تحديد مثيل {link configuration} مباشرة (بدون ملف التكوين). ** return sqlsessionfactory* throws ioException إذا فشل تحميل ملف التكوين*/محمي sqlsessionfactory buildsqlsessionfactory () trows ioexception (this.configuration! = null) {configuration = this.configuration ؛ if (configuration.getVariables () == null) {configuration.setVariables (this.configurationProperties) ؛ (this.configlocation! = null) {xmlConfigBuilder = new xmlConfigBuilder (this.configlocation.getInputStream () ، null ، this.configurationProperties) ؛ configuration = xmlConfigBuilder.getConfiguration () ؛ {logger.debug ("الخاصية` configuration` أو "configlocation" غير محدد ، باستخدام تكوين myBatis الافتراضي ") ؛} التكوين = configuration (this.objectWrapperFactory! = null) {configuration.setObjectWrapperFactory (this.objectWrapperFactory) ؛} if (this.vfs! = null) {configuration.setvfsimpl (this.vfs) ؛ TokenizetoStringArray (this.typealiasespackage ، configuRablePlicationContext.config_location_delimiters) ؛ لـ (String packagetoscan: tamealiaspackagearray) {configuration.gettypealiasregistry (). registerAliases (packagetoscan ، typealiaseStupertype == null؟ object.class: typealiasessupertype) ؛ if (logger.isdebugenabled () {logger.debug (" الأسماء المستعار ") ؛}}} if (! isempty (this.typealiases)) {for (class <؟> typealias: this.typealiases) {configuration.gettypealiasregistry (). "" ") ؛}}} if (! isempty (this.plugins)) {for (interceptor plugin: this.plugins) {configuration.addInterceptor (plugin) ؛ if (logger.isdebugenabled ()) (haslength (this.typehandlerspackage)) {string [] typeHandlersPackageArray = tokenizetoStringArray (this.typehandlerspackage ، configuRableApplicationContext.config_location_delimiters) ؛ لـ (String packagetoscan: typeHandlersPackageArray) {configuration.getTyPeHandlerRegistry (). التسجيل (packagetoscan) ؛ if (logger.isdeBugenabled ()) (! isempty (this.typehandlers))) {for (typeHandler <؟> typeHandler: this.typehandlers) {configuration.getTyPeHandlerRegistry (). register (typehandler) ؛ if (logger.isdeBugenabled ()) {logger.debug ( (this.databaseidprovider! = null) {// fix #64 set databaseid قبل تحليل mapper xmlstry {configuration.setDatabaseId (this.databaseidprovider.getDatabaseId (this.datasource) ؛ (this.cache! = null) {configuration.addcache (this.cache) ؛} if (xmlConfigBuilder! = null) {try {xmlConfigBuilder.parse () "" "") ؛}} catch (استثناء ex) {رمي nestedioException جديد ("فشل في تحليل المورد التكوين:" + this.configlocation ، ex) ؛} أخيرًا {errorcontext.instance (). repret () ؛ SpringManagedTransActionFactory () ؛} configuration.setEnvironment (بيئة جديدة (هذا. {xmlmapperBuilder xmlmapperBuilder = new XmlMapperBuilder (mapperlocation.getInputStream () ، configuration ، mapperlocation.toString (} ، configuration.getsqlfragments ()) ؛ xmlmapperbuilder.parse () المورد: "" + mapperlocation + "" "، e) ؛} أخيرًا {errorcontext.instance (). reset () ؛} if (logger.isdebugenabled ()) {logger.debug (" filed mapper: " + mapperlocation +" '' '' ') {logger.debug (لم يتم تحديد "Property 'mapperlocations" أو لا توجد موارد مطابقة لموارد ") ؛}} إرجاع هذا.على الرغم من أن MyBatis يعد إطارًا ممتازًا لطبقة الثبات ، لكي نكون صادقين ، فإن هذا الرمز ليس جيدًا جدًا ولديه مجال كبير لإعادة الإعمار والتحسين.
2. التوسع الوظيفي
(1) استخدم المخطط للتحقق من sqlmapper
<!-وضع DTD-> <؟ مساحة الاسم = "org.dysd.dao.mybatis.config.iexampledao"> </mapper> <!-وضع المخطط-> <؟ xmlns = "http://dysd.org/schema/sqlmapper" xsi: schemalocation = "http://dysd.org/schema/sqlmapper http://dysd.org/schema/sqlmapper.xsd "namepace =" org.dysd.dao.mybatis.config.iexampledao "> </pamper>
للوهلة الأولى ، يكون استخدام المخطط أكثر تعقيدًا ، ولكن إذا تم دمجه مع IDE ، فإن المطالبات التلقائية لاستخدام المخطط أكثر ودية وأن معلومات التحقق أكثر وضوحًا. في الوقت نفسه ، يفتح أيضًا نافذة للمطورين الآخرين للسماح لهم بتخصيص مساحة الاسم بناءً على مساحة الاسم الموجودة ، مثل تقديم علامة <ognl> ، باستخدام تعبيرات ognl لتكوين عبارات SQL ، إلخ ، إلخ.
(2) تخصيص التكوين. قدمت SQLSessionFactoryBean المزيد من المعلمات للتكوين المخصص ، ولكن لا يزال من الممكن أن تتطلب إعدادات أكثر تخصيصًا ، مثل:
أ. قم بتعيين نوع النتيجة الافتراضية. بالنسبة لعناصر <select> التي لا تحدد ResultType و ResultMap ، يمكنك تعيين نوع الإرجاع الافتراضي على الخريطة بعد التحليل ، وبالتالي تبسيط تكوين SQLMapper.
<!-قبل التبسيط-> <حدد ID = "SELECT" resultType = "MAP"> حدد * من table_name where field1 = #{field1 ، jdbctype = varchar} </select> <!-بعد تبسيط-> <تحديد معرف = "حدد"ب. تمديد تحليل المعلمة الأصلي لـ MyBatis. تطبيق التحليل الأصلي هو DefaultParameterHandler. يمكن أن يكون هذا التنفيذ ورثًا وتوسيعًا. على سبيل المثال ، بالنسبة إلى التعبير عن الخاصية ، بادئة SPEL: ، استخدم SPEL لتقييم القيمة.
(3) للحصول على امتدادات أخرى ، يرجى الرجوع إلى المدونة السابقة للمؤلف حول ملحق MyBatis
3. جدوى إعادة الإعمار
(1) من حيث نطاق تأثير الكود
فيما يلي هيكل الميراث لـ SQLSessionFactoryBean
من هذا يمكننا أن نرى أن نظام الميراث SQLSessionFactoryBean ليس معقدًا ، ولا يرث فئات الوالدين الأخرى. إنه ينفذ فقط ثلاث واجهات في الربيع (يعد eventlistener في JDK مجرد شعار). بالإضافة إلى ذلك ، يستهدف SQLSessionFactoryBean مستخدم التطوير النهائي ، مع عدم وجود فئات فرعية ولا توجد فئات أخرى تسميها ، لذلك فهي صغيرة جدًا من حيث نطاق تأثير الكود.
(2) في تنفيذ إعادة الإعمار ، يمكنك إنشاء SchemasQlSessionFactoryBean جديد ، ثم الكود ينسخ بالكامل sqlsessionfactorybean في البداية ، وتعديل اسم الحزمة واسم الفئة ، ثم استخدام هذا كأساس لإعادة الإعمار. هذا بسيط نسبيا.
(3) في التطبيقات المتكاملة ، تحتاج فقط إلى تعديل سمات الفصل في التكوين المتكامل والربيع.
ما سبق هو إعادة تمثيل sqlsessionfactorybean المدمجة مع mybatis والربيع المقدمة لك. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!