نظرًا لوجود العديد من طرق التكامل في عملية دمج MyBatis ، وخاصة مصدر البيانات. غالبًا ما أرى طرق تكوين مختلفة وأشعر دائمًا بالفوضى ، لذلك لدي وقت لتلخيصها اليوم.
1. استخدم org.mybatis.spring.mapper.MappersCannerConfigurer
في الواقع ، هذه هي نفس الطريقة الهندسة العكسية
1. ملف تكوين مصدر البيانات
2. ملف داو
حزمة com.jdd.mapper ؛ استيراد com.jdd.pojo.employee ؛ استيراد java.util.list ؛ الواجهة العامة olderveemapper {الموظف العام getEmployeById (int id) ؛ القائمة العامة <evelope> bindAllemplyEes () ؛ }3. ملف mapper.xml
<؟ xml الإصدار = "." الترميز = "utf-"؟> <! doctype mapper public "-// mybatis.org//dtd mapper .//en" "http://mybatis.org/dtd/mybatis--mapper.dtd"> <mapper namepace = "com.jdd.mapper.employeEmeEmed parametertype = "int" resultType = "com.jdd.pojo.employee"> <! ]> </select> <select id = "findallemployees" resultType = "com.jdd.pojo.employee"> <! ]]> </select> </pamper>
وبهذه الطريقة ، يمكنك حقن واجهة DAO مباشرة في فئة الخدمة
حزمة com.jdd.service.impl ؛ استيراد com.jdd.mapper.employeMapper ؛ استيراد com.jdd.pojo.employee ؛ استيراد com.jdd.service.employeService ؛ استيراد org.springframework.beans.factory.annotation.autowired ؛ استيراد org.springframework.stereotype.service ؛ استيراد java.util.list ؛ service ("stufferervice") الطبقة العامة للموظفين تنفيذ الموظفين {autowired private extremeEmapper evelyeMapper ؛ Override الموظف العام getEmployeById (int id) {return evelyeEmapper.getEmployeById (id) ؛ } Override Public List <Sepameee> bindAllemployees () {return evelyeEmapper.FindAllEmployeS () ؛ }}2. استخدم الطبقة المجردة org.mybatis.spring.support.sqlsessiondaosupport لحقنها في sqlsessionfactory.
1. ملف تكوين مصدر البيانات
<؟ xml الإصدار = "." الترميز = "utf-"؟> <beans xmlns = "http://www.springframework.org/schema/beans xmlns: p = "http://www.springframework.org/schema/p" XSI: Schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/sphns/spring-beans-..xsd http://www.springframework.org/sctxt http://www.springframework.org/schema/Aop http://www.springframework.org/schema/tx/spring-tx-..xsd -> <السياق: property-placeholder location = "classpath: Resource /*. properties" /> <!-قاعدة بيانات قاعدة البيانات-> <bean id = "dataSource" destroy-method = "close" value = "$ {jdbc.username}" /> <property name = "password" value = "$ {jdbc.password}" /> <property name = "maxaveal" value = "" /> <property name = "minidle" value = "" /> </bean> <! value = "classpath: mybatis/sqlmapconfig.xml"> </spurstrential> <property name = "datasource" ref = "dataSource2
حزمة com.jdd.dao ؛ استيراد org.apache.ibatis.session.sqlsessionfactory ؛ استيراد org.mybatis.spring.support.sqlsessiondaosupport ؛ استيراد javax.annotation.Resource ؛ يمتد الفئة المجردة العامة المستندة إلى sqlsessiondaosupport {resource public void setSqlSessionFactory (sqlsessionfactory sqlsessionfactory) {super.setsqlsessionfactory (sqlsessionfactory) ؛ }}3.
حزمة com.jdd.dao ؛ استيراد com.jdd.pojo.employee ؛ استيراد java.util.list ؛ الواجهة العامة exerieedao {effecteee getEmployeById (int id) ؛ قائمة <evelope> bindAllEmployees () ؛ }4. DAO ينفذ فئة efereneeedaoimpl
حزمة com.jdd.dao.impl ؛ استيراد com.jdd.dao.basedao ؛ استيراد com.jdd.dao.employeedao ؛ استيراد com.jdd.pojo.employee ؛ استيراد org.springframework.stereotePe.Repository ؛ استيراد java.util.list ؛ repository ("emosteedao") فئة publiciedaoimpl يمتد على أساس الأدوات الموظفة {Override الموظف العام getEmployeByID (int) {return this.getsqlsment (). } Override Public List <Employee> bindAllEmployees () {return this.getsqlsession (). }}5. وبهذه الطريقة ، يمكنك حقن Employeedao في فئة الخدمة.
3. استخدم org.mybatis.spring.sqlsessionTemplate فئة القالب
1. ملف مصدر البيانات
<؟ xml الإصدار = "." الترميز = "utf-"؟> <beans xmlns = "http://www.springframework.org/schema/beans xmlns: p = "http://www.springframework.org/schema/p" XSI: Schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/sphns/spring-beans-..xsd http://www.springframework.org/sctxt http://www.springframework.org/schema/Aop http://www.springframework.org/schema/tx/spring-tx-..xsd -> <السياق: property-placeholder location = "classpath: Resource /*. properties" /> <!-قاعدة بيانات قاعدة البيانات-> <bean id = "dataSource" destroy-method = "close" value = "$ {jdbc.username}" /> <property name = "password" value = "$ {jdbc.password}" /> <property name = "maxaveal" value = "" /> <property name = "minidle" value = "" /> </bean> <! value = "classpath: mybatis/sqlmapconfig.xml"> </reprentive> <property name = "dataSource" ref = "dataSource"> </property> <property name = "mapperlocations" value = "classpath: com/jdd/mapper/*. index = "" ref = "sqlsessionfactory"/> </bean> </bans>2
حزمة com.jdd.dao ؛ استيراد org.mybatis.spring.sqlsessionTemplate ؛ استيراد javax.annotation.Resource ؛ Public Abstract Class inventao {public sqlsessionTemplate sqlsessionTemplate ؛ Resource public void setSqlSessionTemplate (sqlsessionTemplate sqlsessionTemplate) {this.sqlsessionTemplate = sqlsessionTemplate ؛ }} 3.
حزمة com.jdd.dao ؛ استيراد com.jdd.pojo.employee ؛ استيراد java.util.list ؛ الواجهة العامة exerieedao {effecteee getEmployeById (int id) ؛ قائمة <evelope> bindAllEmployees () ؛ }4. DAO ينفذ فئة efereneeedaoimpl
حزمة com.jdd.dao.impl ؛ استيراد com.jdd.dao.basedao ؛ استيراد com.jdd.dao.employeedao ؛ استيراد com.jdd.pojo.employee ؛ استيراد org.springframework.stereotePe.Repository ؛ استيراد java.util.list ؛ repository ("emosteedao") الطبقة العامة الموظفين extractedaoiMpl يمتد على أساس الأدوات الموظفة {Override الموظف العام getEmployeById (int id) {return sqlsessiontemplate.selectone ( } Override Public List <Employee> bindAllemplyEes () {return sqlsessionTemplate.SelectList ("com.jdd.dao.employeedao.findallemplyeees") ؛ }}5. الآن يمكنك حقن Employeedao مباشرة في فئة الخدمة لاستخدامها.
ملاحظة: إن حقن المستندة إلى هنا هو أكثر مرونة. يمكنك أيضًا ضخ SQLSessionFactory ، ثم إنشاء SQLSessionTemplate في طريقة Setter ، على النحو التالي:
حزمة com.jdd.dao ؛ استيراد org.apache.ibatis.session.sqlsessionfactory ؛ استيراد org.mybatis.spring.sqlsessionTemplate ؛ استيراد javax.annotation.Resource ؛ Public Abstract Class inventao {public sqlsessionTemplate sqlsessionTemplate ؛ Resource public void setSqlSessionFactory (sqlsessionfactory sqlsessionfactory) {sqlsessionTemplate = new SqlSessionTemplate (sqlsessionfactory) ؛ }}في الواقع ، سواء كانت طريقة ورث فئة SQLSessionDaoSupport ، أو ضخ SQLSessionFactory ، أو حقن SQLSessionTemplate مباشرة ، فهو نفس الشيء.
إذا قمت بحقن SQLSessionFactory ، فإنه يخلق أيضًا SQLSessionTemplate من خلال SQLSessionFactory في القاع ، ثم يعمل من خلال واجهة برمجة التطبيقات الخاصة به.
إذا كنت لا تصدق ذلك ، اسمحوا لي أن أرى الكود المصدري لـ sqlsessiondaosupport:
// // رمز المصدر الذي تم إنشاؤه من ملف .class بواسطة intellij Idea // (مدعوم من Fernflower decompiler) // package org.mybatis.spring.support ؛ استيراد org.apache.ibatis.session.sqlsession ؛ استيراد org.apache.ibatis.session.sqlsessionfactory ؛ استيراد org.mybatis.spring.sqlsessionTemplate ؛ استيراد org.springframework.dao.support.daosupport ؛ استيراد org.springframework.util.assert ؛ يمتد SQLSessionDaOsupport التجريدي التجريدي العام daosupport {private sqlsession sqlsession ؛ BOOLEAN SEOVERALSQLSession ؛ public sqlsessiondaosupport () {} public void setSqlSessionFactory (sqlsessionfactory sqlsessionFactory) {if (! }} public void setSqlSessionTemplate (sqlsessionTemplate sqlsessionTemplate) {this.sqlsession = sqlsessionTemplate ؛ this.externalsqlsession = true ؛ } sqlsession getSqlSession () {return this.sqlsession ؛ } محمية void checkdaoconfig () {assert.notnull (this.sqlsession ، "property 'sqlsessionfactory' أو 'sqlsessionTemplate' ') ؛ }}وبالمثل ، يرث SQLSessionTemplate واجهة SQLSession ، وبالتالي فإن التأثير هو نفسه بغض النظر عن العملية.
// // الكود المصدري الذي تم إنشاؤه من ملف .class بواسطة intellij Idea // (مدعوم من fernflower decompiler) // package org.mybatis.spring ؛ استيراد java.lang.reflect.invocationHandler ؛ استيراد java.lang.reflect.method ؛ استيراد java.lang.reflect.proxy ؛ استيراد java.sql.connection ؛ استيراد java.util.list ؛ استيراد java.util.map ؛ استيراد org.apache.ibatis.exceptions.persistenceException ؛ استيراد org.apache.ibatis.executor.BatchResult ؛ استيراد org.apache.ibatis.reflection.exceptionUtil ؛ استيراد org.apache.ibatis.session.configuration ؛ استيراد org.apache.ibatis.session.executortype ؛ استيراد org.apache.ibatis.session.resulthandler ؛ استيراد org.apache.ibatis.session.rowbounds ؛ استيراد org.apache.ibatis.session.sqlsession ؛ استيراد org.apache.ibatis.session.sqlsessionfactory ؛ استيراد org.springframework.dao.support.persistenceExceptionTranslator ؛ استيراد org.springframework.util.assert ؛ الطبقة العامة sqlsessionTemplate تنفذ sqlsession {private final sqlsessionfactory sqlsessionfactory ؛ executortype executortype التنفيذي النهائي ؛ SQLSession SQLSession SQLSessionProxy ؛ PROSSICTENCESEXCEPTIONTRANSLATRATORSLATOR. SQLSessionTemplate (SQLSessionFactory SQLSessionFactory) {هذا (SQLSessionFactory ، SQLSessionFactory.getConfiguration (). GetDefaultExecutortype ()) ؛ } SQLSessionTemplate (SQLSessionFactory SQLSessionFactory ، ExecutorType ExecutorType) {this (SQLSessionFactory ، ExecutorType ، New MyBatisexceptionTranslator (sqlsessionfactory.getConfiguration (). getEnvironment (). } SQLSessionTemplate (SQLSessionFactory SQLSessionFactory ، ExecutorType ExecutorType ، PersistenceExceptionTranslator SentireTranslator) {Assert.notnull (SqlSessionFactory ، "Property 'sqlsessionfactory' Assert.notnull (ExecutorType ، "Property" ExecutorType "مطلوب") ؛ this.sqlsessionFactory = sqlsessionFactory ؛ this.executortype = executorType ؛ this.exceptionTransLator = استثناء translator ؛ this.sqlsessionproxy = (sqlsession) proxy.newproxyinstance (sqlsessionfactory.class.getclassloader () ، فئة جديدة [] } sqlsessionfactory getSqlSessionFactory () {return this.sqlsessionFactory ؛ } Public ExecutorType getExecutorType () {return this.executortype ؛ } pretersenceExceptionTranslator getPersistenceExceptionTransLator () {return this.exceptionTranslator ؛ } public <t> t selectone (string string) {return this.sqlsessionproxy.selectone (state) ؛ } public <t> t selectone (عبارة سلسلة ، معلمة الكائن) {return this.sqlsessionproxy.selectone (بيان ، المعلمة) ؛ } public <k ، v> map <k ، v> selectmap (string string ، string mapkey) {return this.sqlsessionproxy.selectmap (بيان ، mapkey) ؛ } public <k ، v> map <k ، v> selectMap (عبارة سلسلة ، معلمة الكائن ، سلسلة mapkey) {return this.sqlsessionproxy.selectmap (عبارة ، معلمة ، mapkey) ؛ } public <k ، v> map <k ، v> selectmap (عبارة سلسلة ، معلمة الكائن ، سلسلة mapkey ، rowbounds rowbounds) {return this.sqlsessionproxy.selectmap (عبارة ، معلمة ، mapkey ، rowbounds) ؛ } public <e> list <E> select (string string) {return this.sqlsessionproxy.selectlist (state) ؛ } public <e> list <e> select (string string ، parameter) {return this.sqlsessionproxy.selectlist (state ، parameter) ؛ } public <e> list <e> selectlist (عبارة سلسلة ، معلمة الكائن ، rowbounds rowbounds) {return this.sqlsessionproxy.selectlist (بيان ، المعلمة ، rowbounds) ؛ } public void select (string string ، resulthandler handler) {this.sqlsessionproxy.select (بيان ، معالج) ؛ } public void select (عبارة سلسلة ، معلمة الكائن ، معالج resulthandler) {this.sqlsessionproxy.select (بيان ، معلمة ، معالج) ؛ } public void select (string string ، parameter ، rowbounds rowbounds ، resulthandler handler) {this.sqlsessionproxy.select (بيان ، معلمة ، rowbounds ، handler) ؛ } public int insert (string string) {return this.sqlsessionproxy.insert (state) ؛ } int insert (عبارة سلسلة ، معلمة الكائن) {return this.sqlsessionproxy.insert (عبارة ، معلمة) ؛ } public int update (string string) {return this.sqlsessionproxy.update (state) ؛ } تحديث int العام (عبارة سلسلة ، معلمة الكائن) {إرجاع this.sqlsessionproxy.update (بيان ، المعلمة) ؛ } public int delete (string string) {return this.sqlsessionproxy.delete (بيان) ؛ } public int delete (عبارة سلسلة ، معلمة الكائن) {return this.sqlsessionproxy.delete (بيان ، المعلمة) ؛ } public <t> t getMapper (class <t> type) {return this.getConfiguration (). getMapper (type ، this) ؛ } الالتزام الفراغ العام () {رمي جديد UnsupportedOperationException ("الالتزام اليدوي غير مسموح به خلال sqlsession المدارة في الربيع") ؛ } الالتزام الفراغ العام (القوة المنطقية) {رمي جديد غير مدعوم ("الالتزام اليدوي غير مسموح به خلال فترة SQLSession المدارة في الربيع") ؛ } public void Rollback () {رمي جديد غير مدعوم ("لا يُسمح بالتراجع اليدوي خلال فترة sqlsession المدارة في الربيع") ؛ } public void Rollback (Boolean Force) {رمي جديد غير مدعوم ("لا يُسمح بالتراجع اليدوي خلال فترة SQLSession المدارة في الربيع") ؛ } public void close () {رمي جديد غير مدعوم ("لا يُسمح بالإغلاق اليدوي على مدار sqlsession المدير الربيع") ؛ } public void clearCache () {this.sqlsessionproxy.clearcache () ؛ } التكوين العام getConfiguration () {return this.sqlsessionfactory.getConfiguration () ؛ } connection getConnection () {return this.sqlsessionproxy.getConnection () ؛ } القائمة العامة <BatchResult> flushStatements () {return this.sqlsessionproxy.flushStatements () ؛ } الفئة الخاصة sqlsessionInterceptor تنفذ InvocationHandler {private sqlsessionInterceptor () {} الكائن العام استدعاء (وكيل الكائن ، طريقة الطريقة ، الكائن [] args) رمي {sqlsession sqlsession = sqlsessionutils.getsqlsession sqlsessionTemplate.This.executortype ، sqlsessionTemplate.Tis.ExceptionTranslator) ؛ كائن غير ملفوف. جرب {object result = method.invoke (sqlsession ، args) ؛ إذا (! sqlsessionUtils.issqlSessionTransActional (sqlsession ، sqlsessionTemplate.This.SqlSessionFactory)) {sqlsession.commit (true) ؛ } unrapped = النتيجة ؛ } catch (throwable var) {untprapped = inspeciedUtil.unwrapthrowable (var) ؛ if (sqlsessionTemplate.This.ExceptionTranslator! = null && united exateof persistenceException) {sqlsessionutils.clossqlsession (sqlsession ، sqlsessionTemplate.Tis.SqlSessionFactory) ؛ sqlsession = فارغة ؛ ترميح مترجمة = sqlsessionTemplate.Tis.ExceptionTranslator.translateExceptionIfpossible ((persistenceException) غير مغلفة) ؛ if (مترجم! = null) {unrapped = transled ؛ }} رمي (رمي) غير مغلفة ؛ } أخيرًا {if (sqlsession! = null) {sqlsessionutils.clossqlsession (sqlsession ، sqlsessionTemplate.This.SqlSessionFactory) ؛ }} الإرجاع غير ملفوف ؛ }}}}لخص
ما سبق هو العديد من طرق التكوين لدمج مصادر البيانات في فصل الربيع في MyBatis المقدمة لك. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، يرجى ترك رسالة لي. سوف يرد المحرر إليك في الوقت المناسب!