1. بناء بيئة تنمية
1.1. قم بإنشاء مشروع ويب مع Maven
تنفيذ الأمر التالي:
انسخ الكود كما يلي: mvn archetype: إنشاء -dgroupid = me.gacl -dartifactid = spring4 -mybatis3 -darchetypeartifactid = maven -archetype -webapp -dinteractivemode = false
كما هو مبين في الشكل أدناه:
المشروع الذي تم إنشاؤه كما يلي:
تحرير ملف pom.xml
<project xmlns = "http://maven.apache.org/pom/ .. http://maven.apache.org/maven-v__.xsd "> <Dodeversion> .. </modelversion> <roupiD> me.gacl </rougeid> <StifactId> spring-mybatis </stiftid> <cloating> WAR </placing> <Url> http://maven.apache.org </url> <ependencies> <reperence> <roupiD> junit </rougeid> <trintifactid> junit </tefactid> <splent> .. </version> <spear> اختبار </scope>
قم بتعديل <name> spring4-mybatis3 maven webapp </mame> وقم بإزالة المحتوى الذي يحتوي على مسافات في "maven webapp". خلاف ذلك ، عندما يقوم Maven بتجميع المشروع ، ستحدث بعض الأخطاء التي لا يمكن تفسيرها بسبب المسافات ، وتعديلها إلى: <name> spring4-mybatis3 </same> .
أيضا ، احذف ما يلي:
<Rependency> <roupeD> Junit </rougiD> <StifactId> Junit </stifactid> <splement> .. </version> <scope> اختبار </scope> </prement>
هذا الجزء هو معلومات تبعية حزمة JAR من Junit. هذا الإصدار منخفض للغاية. نحن لا نستخدم إصدار اختبار Junit هذا. محتوى pom.xml المعدل هو كما يلي:
<project xmlns = "http://maven.apache.org/pom/ .. http://maven.apache.org/maven-v__.xsd "> <Dodeversion> .. </modelversion> <rougiD> me.gacl </rougeid> <StifactId> spring-mybatis </stifactid> <backaging> حرب </packaging> <Url> http://maven.apache.org </url> <تبعية> </تبعية> <build> <ninalname> spring-mybatis </initalname> </build> </project>
1.2. استيراد المشروع الذي تم إنشاؤه إلى myeclipse
يتم عرض خطوات التشغيل المحددة في الشكل أدناه:
قم بإنشاء ثلاثة مجلدات مصدر يدويًا: [src/main/java] ، [src/test/resources] ، و [src/test/java] ، كما هو موضح في الشكل أدناه:
في هذه المرحلة ، تم الانتهاء من جميع أعمال بناء المشروع.
2. قم بإنشاء قواعد البيانات والجداول (لـ MySQL)
البرنامج النصي SQL كما يلي:
إنشاء قاعدة بيانات spring4_mybatis3 ؛ استخدم spring4_mybatis3 ؛ جدول إسقاط إذا كان موجودًا t_user ؛ إنشاء جدول T_USER (user_id char (32) not null ، user_name varchar (30) default null ، user_birthday date default null ، user_salary double double null ، key user_id) = innodb default ؛
قاعدة البيانات والجدول التي تم إنشاؤها هي كما يلي:
3. استخدم أداة المولد لإنشاء رمز
لقد وجدت أداة مولد عبر الإنترنت يمكنها إنشاء فئات كيان ، وملفات رسم الخرائط SQL و DAO المقابلة لجدول MyBatis استنادًا إلى جدول قاعدة البيانات الذي تم إنشاؤه ، والعثور على ملف Generator.xml في الدليل الجذر لأداة المولد. يتم استخدام هذا الملف لتكوين قواعد توليد الكود ، كما هو موضح في الشكل أدناه:
قم بتحرير ملف المولد. xml ، المحتوى كما يلي:
<؟ xml الإصدار = "." الترميز = "utf-"؟> <! doctype generatorConfiguration public "-// mybatis.org//dtd myBatis configuration .//en" "http://mybatis.org/dtd/mybatis-generator-config__.dtd الموقع = "e:/ropository/mysql/mysql-connector-java /../ mysql-connector-java -... jar"/> <!-<classpathentry location = "c:/oracle/product /../ db_/jdbc/lib/ojdbc.jar"/> <SOMENGERERATOR> <property name = "cumpressallcomments" value = "true"/> </commentGenerator> <!-URL LINK DATABASE ، اسم المستخدم ، كلمة المرور-> <JDBCConnection DriverClass = "com.mysql.jdbc.driver" connectionUrl = "jdbc: // localhost: <!-<jdbcconnection driverclass = "oracle.jdbc.driver.oracledriver" connectionUrl = "jdbc: oracle: thin:@localhost :: orcl" userid = "msa" password = "msa">-> < /jdbcconnection> <javatyperes> </javatyperesolver> <!- قم بإنشاء اسم الحزمة وموقع فئة الكيان. هنا يتم وضع فئة الكيان التي تم إنشاؤها تحت الحزمة me.gacl.domain-> <javamodelgeneratorator targetpackage = "me.gacl.domain" targetproject = "c:/user/gacl/spring-mybatis/src/main/java </javamodelgenerator> <!- اسم حزمة ملف خريطة SQL تم إنشاؤه. هنا ، ضع ملف MAP SQL الذي تم إنشاؤه ضمن حزمة me.gacl.mapping-> <sqlmapgenerator targetpackage = "me.gacl.mapping" targetproject = "c:/user/gacl/spring-mybatis/src/main/java اسم وموقع DAO. هنا ، ضع فئة DAO التي تم إنشاؤها تحت الحزمة ME.GACL.DAO-> <JavacLientGenerator Type = "XmlMapper" TargetPackage = "me.gacl.dao" targetproject = "c:/user/gacl/spring-mybatis/src/main/java </javaclientgenerator> <!-لإنشاء تلك الجداول (تغيير اسم TablenObjectName)-> <table tablename = "t_user" domainObjectName = "user" enableCountByexample = "false" enablexypdateExamex = "false" enippereletebyexample = falseedexample = "false" </sultext> </generatorConfiguration>
افتح نافذة سطر الأوامر ، ثم قم بالتبديل إلى الدليل الجذر لأداة المولد ، وقم بتنفيذ الأمر التالي:
java -jar mybatis -generator -core -1.3.2.jar -Configfile generator.xml -overwrite
كما هو مبين في الشكل أدناه:
الآن فقط ، قمنا بتكوين ملف الرمز الذي تم إنشاؤه وملف SQL في ملف conderator.xml لوضع الرمز الذي تم إنشاؤه وملف رسم الخرائط SQL في الدليل "C:/user/gacl/spring4-mybatis3/src/main/java". هذا الدليل هو الدليل الذي يوجد فيه مشروع Spring4-Mybatis3. نقوم بتحديث دليل SRC/Main/Java ويمكنك رؤية رمز ورسم الخرائط الذي تم إنشاؤه ، كما هو موضح في الشكل أدناه:
لا يلزم تغيير الكود الذي تم إنشاؤه وملف التعيين في سطر ، ويمكن تطبيقه مباشرة على المشروع. دعنا نلقي نظرة على الكود ورسم الخرائط التي تم إنشاؤها بواسطة أداة المولد:
1. فئة داو التي تم إنشاؤها
حزمة ME.GACL.DAO ؛ استيراد me.gacl.domain.user ؛ الواجهة العامة usermapper {int deletebermaryKey (سلسلة userId) ؛ int insert (سجل المستخدم) ؛ int insertSeerTive (سجل المستخدم) ؛ المستخدم selectByPrimaryKey (سلسلة userId) ؛ int updateByPrimaryKey (سجل المستخدم) ؛ }usermapper التي تم إنشاؤها هي واجهة تحدد بعض الطرق لإضافة وحذف وتعديل وبحث جدول T_USER.
2. فئة الكيان المولدة
حزمة me.gacl.domain ؛ استيراد java.util.date ؛ مستخدم الفئة العامة {private string userId ؛ اسم المستخدم الخاص بالسلسلة الخاصة ؛ التاريخ الخاص userbirthday ؛ المستخدمين المزدوج الخاص ؛ السلسلة العامة getUserId () {return userId ؛ } public void setUserId (String userId) {this.userId = userId == null؟ null: userId.trim () ؛ } السلسلة العامة getUserName () {return username ؛ } public void setusername (string username) {this.username = username == null؟ null: username.trim () ؛ } التاريخ العام getUserBirthday () {return userBirthday ؛ ) } public double getusersalary () {return usserSalary ؛ } public void setusersalary (double usersalary) {this.usersalary = userSalary ؛ }}فئة المستخدم هي فئة الكيان المقابلة لجدول T_USER. تتوافق السمات المحددة في فئة المستخدم مع الحقول في جدول T_USER واحدًا تلو الآخر.
3. ملف تعيين SQL الذي تم إنشاؤه
<؟ xml الإصدار = "." الترميز = "utf-"؟> <! doctype mapper public "-// mybatis.org//dtd mapper .//en" "http://mybatis.org/dtd/mybatis--mapper.dtd"> <mapper nampace = "me.gacl.dao type = "me.gacl.domain.user"> <id column = "user_id" property = "userId" jdbctype = "char" /> <result column = "user_name" property = "username" column = "user_salary" property = "usersalary" jdbctype = "double"/> </sroperemap> <sql id = "base_column_list"> user_id ، user_name ، user_birthday ، user_salary </sql> <selectbyprimarykey parametertype = "java.lang.string"> حدد <تضمين refid = "base_column_list" /> من t_user حيث user_id = #{userid ، jdbctype = char} < /select> <delete id = "deletebyPrimary" parametertype = "java.lang.string" #{userId ، jdbctype = char} </delete> <insert id = "insert" parametertype = "me.gacl.domain.user"> insert in t_user (user_id ، user_name ، user_birthday ، user_salary) ( #{userid ، jdbctype = char} ، #{username ، jdbctype = varchar} ، #{userbirthday ، jdbctype = date} ، #{usersalary ، jdbctype = double}) </insert> <insert id = "insertSelective" parametertype = "me.gacl.domain.user"> suffixoverrides = "،"> <test = "userId! = null"> user_id ، </for> <if test = "username! = null"> user_name ، <///if test = "userbirthday! = null"> user_birthday ، </if test> aboursalary! supply = ")" suffixoverrides = "،"> <test = "userid! = null"> #{userId ، jdbctype = char} ، </if> <if test = "username! = null"> #{username ، jdbctype = varchar} ، </if> </ #{userbirthday ، jdbctype = date} ، </if> <if test = "usserSalary! = null"> #{userSalary ، jdbctype = double} ، <///red> </insert> <update id = "updateByPrimaryKeySelective" parametertype = test = "username! = null"> user_name = #{username ، jdbctype = varchar} ، </if> <test = "userbirthday! = null"> user_birthday = #{userbirthday ، jdbctype = date} ، </if> if test = #{userSalary ، jdbctype = double} ، </if> </set> حيث user_id = #{userId ، jdbctype = char} </uptuday> <update id = "updateByPrimary" parametertype = "me.gacl.domain.user"> update t_user set user_name = user_birthday = #{userbirthday ، jdbctype = date} ، user_salary = #{usersalary ، jdbctype = double} حيث user_id = #{userid ، jdbctype = char} </update> </mapper>محتوى ملف usermapper.xml هو كتابة عبارات SQL التي تعمل على تشغيل جدول T_USER. دعونا نركز على بعض التفاصيل الصغيرة التي يجب الانتباه إليها في تكوين usermapper.xml:
1. يجب أن تكون مساحة اسم علامة <mapper> الخاصة بـ usermapper.xml هي الاسم الكامل لواجهة usermapper ، أي <mapper namepace = "me.gacl.dao.usermapper">
2. تعريف usermapper.xml يجب أن تكون قيمة سمة المعرف لقاعدة بيانات العملية متسقة مع اسم الطريقة المحددة بواسطة واجهة UserMapper ، كما هو موضح في الشكل أدناه:
سبب المتطلبات المذكورة أعلاه هو أن MyBatis يمكنه تلقائيًا تنفيذ الطرق ذات الصلة المحددة في واجهة UserMapper استنادًا إلى واجهة UserMapper وملف usermapper.xml ، بحيث لم نعد بحاجة إلى كتابة رمز تنفيذ محدد لواجهة UserMapper.
4. دمج الربيع و mybatis
أولاً ، نحتاج إلى إضافة حزم الجرة ذات الصلة التي نحتاجها للمشروع. يمكننا الذهاب إلى مستودع Maven المركزي: http://search.maven.org/ للعثور على حزم الجرة ذات الصلة التي نريدها ، كما هو موضح في الشكل التالي:
نحتاج فقط إلى إدخال اسم حزمة JAR التي نبحث عنها في مربع البحث والنقر فوق الزر [Search] للعثور على حزمة JAR التي نبحث عنها.
4.1. أضف ربيع و mybatis حزم الجرة
1. أضف نورًا من النور ، أدخل كلمة رئيسية للنورس للبحث ، كما هو موضح في الشكل أدناه:
ابحث عن معلومات وصف التبعية حول النور الربيعي ، كما هو موضح في الشكل التالي:
سوف
<Rependency> <roupeD> org.springframework </rougeid> <StifactId> spring-core </stifactid> <soph> 4.1.4
انسخ إلى ملف pom.xml الخاص بالمشروع على النحو التالي:
<project xmlns = "http://maven.apache.org/pom/4.0.0" http://maven.apache.org/maven-v4_0_0.xsd "> <dormversion> 4.0.0 </modelversion> <roupiD> me.gacl </roucidid> </attifactid> spring4-mybatis3 </shintifactid> </packaging> <name> spring4-mybatis3 </mame> <Url> http://maven.apache.org </url> <تبعية> <!-إضافة حزمة core spring4.1.4-> <redepency> <roupiD> org.springframework </rougiD> </artifactid </atspactid </spert> </sependencies> <build> <initalName> spring4-mybatis3 </initalname> </build> </project>
وبهذه الطريقة ، ستساعدنا Maven تلقائيًا في تنزيل حزمة الجرة الربيعية من مستودع Maven المركزي إلى مستودعنا المحلي ، ثم إضافة حزمة جرة الربيع وتبعياتها ذات الصلة بمشروعنا ، كما هو موضح أدناه:
يمكن البحث في حزم الجرة ذات الصلة التي تتطلبها Spring4.x و MyBatis3.x في الطريقة المذكورة أعلاه ثم إضافتها إلى المشروع. بعد إضافة حزم الجرة ذات الصلة المتعلقة بـ spring4.x و mybatis3.x ، يكون محتوى ملف pom.xml على النحو التالي:
<project xmlns = "http://maven.apache.org/pom/ .. http://maven.apache.org/maven-v__.xsd "> <Dodeversion> .. </modelversion> <rougiD> me.gacl </rougeid> <StifactId> spring-mybatis </stifactid> <backaging> حرب </packaging> <Url> http://maven.apache.org </url> <تبعية> <!-إضافة حزمة نور الربيع-> <reperency> <roupled> org.springframework </rougiD> <spring-contex> spring-core </stifactid <roughid> org.springframework </rougiD> <StifactId> spring-context </shintifactid> <الإصدار> ... الإصدار </version> </dependency> <!-أضف حزمة spring-tx-> <redency> <roupencid> org.springframework </groupid> حزمة spring-jdbc-> <reperency> <roupiD> org.springframework </rougiD> <StifactId> spring-jdbc </shintifactid> <الإصدار> ... الإصدار </repreadencor <StifactId> spring-jdbc </artifactId> <soph> ... الإصدار </version> </repreadency> <!-لتسهيل اختبار الوحدة ، أضف حزمة اختبار الربيع-> <redence> <roupiD> org.springframework </groupiD> <Rependency> <roupEd> org.springframework </rougiD> <StifactId> spring-web </stifactid> <splection> ... الإصدار </version> </dependency> <!-إضافة جانب acpleaver-> </repondency> </groupid> org.aspectj </groupid> </shantifactid> <!-أضف حزمة MyBatis الأساسية-> <redency> <roupiD> org.mybatis </rougiD> <StifactId> mybatis </shintifactid> <sophip> .. </version> </sependency> <!-إضافة حزم MyBatis الأساسية المدمجة مع Spring-> <predencid> <StifactId> mybatis-spring </stifactid> <sophy> .. </version> </sependency> <!-إضافة servlet.core package-> <redence> <roupiD> javax.servlet </groupid> </attifactid> javax.servlet-api </artifactid> <roughid> javax.servlet.jsp </rougiD> <StifactId> javax.servlet.jsp </stifactid> <splection> ..- b </version> </repreadency> حزمة برنامج تشغيل MySQL-> <reperency> <roupiD> mysql </rougiD> <ArtifactId> mysql-connector-java </shintifactid> <splement> .. </version> </redenced> <!-حزمة اتصال Druid-> <reperence> <croupid> com.alibaba> </reperency> <!-إضافة حزمة اختبار وحدة JUNIT-> <Rependency> <roupeD> Junit </rougiD> <StifactId> Junit </stifactid> <splection>.
4.2. اكتب ملفات التكوين ذات الصلة
1. dbconfig.properties
قم بإنشاء ملف dbConfig.Properties في دليل SRC/Main/Resources لكتابة المعلومات ذات الصلة حول الاتصال بقاعدة بيانات MySQL. محتوى dbconfig.properties كما يلي:
DriverClassName = com.mysql.jdbc.drivervalidationQuery = select 1jdbc_url = jdbc: mysql: // localhost: 3306/spring4_mybatis3؟ useUniCode = true & directionding = utf-8 & zerodateTimeBehavior =
2. Spring.xml (ملف تكوين إطار الربيع)
قم بإنشاء ملف spring.xml في دليل SRC/Main/Resources. ملف spring.xml هو ملف التكوين الأساسي المكتوب لإطار الربيع. محتوى spring.xml كما يلي:
<؟ xmlns: context = "http://www.springframework.org/schema/context" XSI: Schemalocation = "http://www.springframework.org/schema/beanshttp://www.springframework.org/sche Ma/Beans/Spring-Beans-3.0.xsdhtp: //www.springframework.org/schema/context/spring-context-3.0.xsd "> <!-تقديم ملف خاصية dbConfig.Properties-> <السياق: property-placeholder location = "classpath: dbConfig.properties" /> <!-تقديم ملف خاصية dbConfig.properties-> <context: property-placeholder location = "classpath: dbconfig.properties حزمة وجميع الفئات المشروحة مع شرح خدمة @من الفصل-> <السياق: مكون المسح القاعدة package = "me.gacl.service" /> < /beans>
تكوين ملف spring.xml بسيط للغاية ، لا يوجد سوى تكوينان.
3. Spring-mybatis.xml (ملف التكوين متكامل مع Spring و MyBatis)
قم بإنشاء ملف spring-mybatis.xml في دليل SRC/Main/Resources. ملف Spring-mybatis.xml هو ملف تكوين مكتوب لدمج إطار عمل الربيع وإطار عمل MyBatis. محتوى spring-mybatis.xml كما يلي:
<؟ xmlns: tx = "http://www.springframework.org/schema/tx" http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/Aop <bean id = "dataSource"> <property name = "jndiname" value = "$ {jndiname}"> </property> </bean>-> <!- ========================================================== ========================================================== ========================================================== ========================================================== ========================================================== ========================================================== ========================================================== ========================================================== name = "username" value = "$ {jdbc_username}" /> <property name = "password" value = "$ {jdbc_password}" /> <!-تهيئة حجم الاتصال-> <property name = "initialsize" value = "0" /> <! مجاني-> <property name = "maxidle" value = "20" /> <!-الحد الأدنى لعدد الاتصالات مجانًا-> <property name = "minidle" value = "0" /> <! name = "maxpoolPrepedStateMentPerConnectionize" value = "33" /> -> <property name = "ValidationQuery" value = "$ {ValidationQuery}" /> <property name = "testOnBore" value = "false" /> <property name = "testOnBorrow value = "true" /> <!-قم بتكوين المدة التي يستغرقها إجراء فاصل زمني للكشف للكشف عن الاتصال الخمول الذي يجب إغلاقه ، بالمللي ثانية-> <property name = "timeBetweenevictionRunsmillis" value = "60000" /> <! value = "25200000" /> <!-قم بتشغيل وظيفة removaBandoned-> <property name = "requovaBandoned" value = "true" /> <!-1800 seconds ، أي 30 دقيقة-> <property name = "readovandonedTimeOut" value = "1800" /> <! مراقبة قاعدة بيانات-> <!-<property name = "filters" value = "stat" />-> <property name = "filters" value = "mergestat" /> </bean> <!- ================================================================================================================================= ==================================================================================================================================== ==================================================================================================================================== ==================================================================================================================================== =============================================================== =============================================================== =============================================================== =============================================================== =============================================================== =============================================================== =============================================================== =============================================================== احفظ قيمة التكوين اليدوي = "ClassPath: ME/GACL/Mapping/*. value = "classpath: Me/Gacl/Mapping/*. value = "sqlsessionfactory" /> </bean> <!- ========================================================== ========================================================== ========================================================== ========================================================== ========================================================== ========================================================== ========================================================== ========================================================== المعاملات-manager = "TransactionManager" />-> <!-تكوين التقاطع-> <tx: excloy id = "TransactionAdvice" Transaction-Manager = "TransactionManager"> <tx: attributes> <tx: method name = "add* الانتشار = "مطلوب" /> <tx: method name = "save*" spection = "required" /> <tx: method name = "update*" spection = "requiret الانتشار = "مطلوب" /> <tx: method name = "repair" الانتشار = "مطلوب" /> <tx: method name = "delandrepair" spection = "required" /> <tx: method name = "delandrepair" spection = "required" /> <tx: method name = "get* name = "load*" spection = "supports" /> <tx: method name = "search*" spection = "supports" /> <tx: method name = "datagrid*" spection = "supports" /> <tx: method name = "*" support> <aop: pointcut id = "transactionpointcut" expression = "execution (*me.gacl.service ..*inform. </bean> <bean id = "druid-stat-pointcut" scope = "prototype"> <property name = "patterns"> <list> <value> me.gacl.service.*</value> </list> </property> </boan> <aop: config> <aop: advisor rif-ref = /> </aop: config> </bans>في هذه المرحلة ، تمت كتابة ملفات التكوين ذات الصلة ، كما هو موضح في الشكل أدناه:
4.3. إجراء اختبارات الوحدة
بعد خطوتين أعلاه ، تم الانتهاء من تكامل Spring 4 و MyBatis3. المهمة التالية التي يتعين علينا القيام بها هي إجراء اختبار الوحدة لاختبار ما إذا كان دمج Spring4 و MyBatis3 ناجحًا.
1. قم بإنشاء حزمة ME.GACL.SERVICE في دليل SRC/MAIN/JAVA ، ثم قم بإنشاء واجهة userServicei في حزمة ME.GACL.SERVICE ، كما هو موضح أدناه:
حزمة ME.GACL.SERVICE ؛ استيراد me.gacl.domain.user ؛ الواجهة العامة sterverservicei { / *** إضافة المستخدم* param user* / void addUser (مستخدم المستخدم) ؛ / ** * احصل على المستخدم استنادًا إلى معرف المستخدم * param userId * return */ user getUserById (string userId) ؛ }2. قم بإنشاء حزمة me.gacl.service.impl في دليل src/main/java ، ثم قم بإنشاء فئة تنفيذ لواجهة المستخدمين في me.gacl.service.impl package: userServiceImpl ، كما هو موضح أدناه:
Package Me.gacl.service.impl ؛ استيراد org.springframework.beans.factory.annotation.autowired ؛ استيراد org.springframework.stereotype.service ؛ استيراد me.gacl.dao.usermapper ؛ استيراد me.gacl.domain.user ؛ استيراد Me.gacl.service.userservicei ؛ /** * Auuthor gacl * استخدم التعليق التوضيحي لـ Service لتعليق فئة UserviceRviceImpl كخدمة * معرف الخدمة هو userviservice */service ("userservice) AUTOWIRED USERMAPPER USERMAPPER ؛ // حقن DAO Override public void adduser (المستخدم) {usermapper.insert (user) ؛ } Override Public User GetUserById (String userD) }}الفئتان المبتكرتان على النحو التالي:
3. اكتب فئة اختبار الوحدة في دليل SRC/Test/Java ، وقم بإنشاء حزمة جديدة me.gacl.test ، ثم قم بإنشاء فئة MyBatistest ضمن هذه الحزمة. الرمز كما يلي:
حزمة me.gacl.test ؛ استيراد java.util.date ؛ استيراد java.util.uuid ؛ استيراد me.gacl.domain.user ؛ استيراد Me.gacl.service.userservicei ؛ // import me.gacl.service.userservicei ؛ استيراد org.junit.before ؛ استيراد org.junit.test ؛ استيراد org.springframework.context.applicationContext ؛ استيراد org.springframework.context.support.classpathxmlapplicationContext ؛ الطبقة العامة myBatistist {private orperviceiviceivice ؛ /*** يتم تنفيذ هذه الطريقة قبل تنفيذ جميع أساليب الاختبار ولا يمكن تنفيذها إلا مرة واحدة* يمكن إجراء جميع أعمال التهيئة أثناء اختبار وحدة JUNIT في هذه الطريقة* على سبيل المثال ، تهيئة ApplicationContext و userService في الأسلوب قبل*/ @pubore public قبل () {// إنشاء سياق الربيع باستخدام ملفين spring.xml " classpathxmlapplicationContext (سلسلة جديدة [] {"spring.xml" ، "spring-mybatis.xml"}) ؛ // جلب كائن Userservice الذي نريد استخدامه استنادًا إلى معرف الفاصوليا من حاوية Spring Werveservice = (UserServicei) ac.getBean ("Userveservice") ؛ } test public void testadduser () {// applicationContext ac = new ClassPathxMlapplicationContext (سلسلة جديدة [] {"spring.xml" ، "spring-mybatis.xml"}) ؛ // userviservicei userService = (uservisei) ac.getBean ("UserveserVice") ؛ مستخدم المستخدم = مستخدم جديد () ؛ user.setUserId (uuid.randomuuid (). toString (). replaceall ("-" ، "")) ؛ user.setuserName ("White Tiger God Emperor XDP") ؛ user.setUserBirthDay (Date ()) ؛ user.setusersalary (d) ؛ userService.adduser (user) ؛ }}عند تنفيذ رمز اختبار الوحدة ، سيتم الإبلاغ عن الخطأ التالي:
رسالة الخطأ هي أنه لم يتم العثور على فئة "me.gacl.test.mybatistist" ، لأننا لم نستخدم Maven لتجميع الفصل في المشروع.
بعد ذلك ، نستخدم Maven لتجميع المشروع ، حدد ملف POM.xml الخاص بالمشروع → 【Debug كـ】 → 【Maven تثبيت】 ، كما هو موضح أدناه:
نتائج التجميع هي كما يلي:
هنا سأتحدث عن المشكلات التي واجهتها بعد تنفيذ تثبيت Maven. عندما نفذت أمر Maven Install لأول مرة ، رأيت الأخطاء الفوضوية التالية:
في وقت لاحق ، قمت بحذف المشروع ، وأعدت استيراد المشروع ، ثم قمت بتنفيذ عملية المشروع النظيفة ، كما هو موضح في الشكل التالي:
يمكنني تجميعها وتمريرها بشكل طبيعي بعد تنفيذ عملية تثبيت Maven ، مما جعلني أشعر بالاكتئاب لفترة طويلة. لا ينبغي أن يكون هذا هو سبب تكوين مشروعي ، ولكن سبب Maven. لا أعرف لماذا هذا هو الحال. على أي حال ، هذا هو الحل. إذا واجهت موقفًا لا يمكن تجميع فيه عملية تثبيت Maven بشكل طبيعي: يمكنك محاولة استخدام الخطوات الثلاث: Maven Clean → Project → Maven تثبيت لحل المشكلة.
بالإضافة إلى اختبار الوحدة مع Junit العادية ، يمكننا أيضًا استخدام إطار اختبار Junit الذي يوفره Spring لاختبار الوحدة ، وإنشاء فئة جديدة من MyBateStBySpringTestFramework تحت Me.gacl.test ، مع الكود كما يلي:
حزمة me.gacl.test ؛ استيراد java.util.date ؛ استيراد java.util.uuid ؛ استيراد me.gacl.domain.user ؛ استيراد Me.gacl.service.userservicei ؛ استيراد org.junit.test ؛ استيراد org.junit.runner.runwith ؛ استيراد org.springframework.beans.factory.annotation.autowired ؛ استيراد org.springframework.test.context.contextConfiguration ؛ استيراد org.springframework.test.context.junit.springJunitClassRunner ؛ Runwith (springjunitclassrunner.class) // بعد تكوين التعليق التوضيحي contextConfiguration ويتم تحديد سمة المواقع من التعليقات التوضيحية مع ملف Spring و Configuration ، class.xm (} {"classpath: spring.xml" ، MyBatistEstBySpringTestFramework {// enjusterviceRviceRoviceired usterverservicei uservice ؛ test public void testadduser () {user user = new user () ؛ user.setUserId (uuid.randomuuid (). toString (). replaceall ("-" ، "")) ؛ user.setuserName ("XDP_GACL_WHITE Tiger God Emperor") ؛ user.setUserBirthDay (Date ()) ؛ user.setusersalary (d) ؛ userService.adduser (user) ؛ } test public void testgetUserById () {string userD = "fbceBfdada" ؛ مستخدم المستخدم = userService.getUserById (userId) ؛ System.out.println (user.getUserName ()) ؛ }}قم بإجراء هذين طريقتي الاختبار وقم باختبار الاختبار العادي ، كما هو موضح أدناه:
في هذه المرحلة ، حتى لو تم اجتياز جميع اختبارات التكامل لإطار عملنا ، فقد كان التكامل ناجحًا.
4.4. اختبار في خادم الويب
1. قم بتحرير ملف web.xml وإضافة عنصر تكوين مستمع Spring ، والمحتوى كما يلي:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <listener> <description>Spring监听器</description> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- ContextLoaderListener初始化Spring上下文时需要使用到的contextConfigLocation参数--> <context-param> <param-name>contextConfigLocation</param-name> <!-- 配置spring.xml和spring-mybatis.xml这两个配置文件的位置,固定写法--> <param-value>classpath:spring.xml,classpath:spring-mybatis.xml</param-value> </context-param></web-app>
2、在UserMapper接口中添加一个获取所有用户信息的getAllUser()方法,如下所示:
package me.gacl.dao; استيراد java.util.list ؛ import me.gacl.domain.User; public interface UserMapper { int deleteByPrimaryKey(String userId); int insert(User record); int insertSelective(User record); User selectByPrimaryKey(String userId); int updateByPrimaryKeySelective(User record); int updateByPrimaryKey(User record); /**Get all user information* @return List<User> */ List<User> getAllUser(); }3、在UserMapper.xml文件中编写getAllUser()方法要执行的SQL语句,如下所示:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="me.gacl.dao.UserMapper" > <resultMap id="BaseResultMap" type="me.gacl.domain.User" > <id column="user_id" property="userId" jdbcType="CHAR" /> <result column="user_name" property="userName" jdbcType="VARCHAR" /> <result column="user_birthday" property="userBirthday" jdbcType="DATE" /> <result column="user_salary" property="userSalary" jdbcType="DOUBLE" /> </resultMap> <sql id="Base_Column_List" > user_id, user_name, user_birthday, user_salary </sql> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" > select <include refid="Base_Column_List" /> from t_user where user_id = #{userId,jdbcType=CHAR} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.String" > delete from t_user where user_id = #{userId,jdbcType=CHAR} </delete> <insert id="insert" parameterType="me.gacl.domain.User" > insert into t_user (user_id, user_name, user_birthday, user_salary) values (#{userId,jdbcType=CHAR}, #{userName,jdbcType=VARCHAR}, #{userBirthday,jdbcType=DATE}, #{userSalary,jdbcType=DOUBLE}) </insert> <insert id="insertSelective" parameterType="me.gacl.domain.User" > insert into t_user <trim prefix="(" suffix=")" suffixOverrides="," > <if test="userId != null" > user_id, </if> <if test="userName != null" > user_name, </if> <if test="userBirthday != null" > user_birthday, </if> <if test="userSalary != null" > user_salary, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="userId != null" > #{userId,jdbcType=CHAR}, </if> <if test="userName != null" > #{userName,jdbcType=VARCHAR}, </if> <if test="userBirthday != null" > #{userBirthday,jdbcType=DATE}, </if> <if test="userSalary != null" > #{userSalary,jdbcType=DOUBLE}, </if> </trim> </insert> <update id="updateByPrimaryKeySelective" parameterType="me.gacl.domain.User" > update t_user <set > <if test="userName != null" > user_name = #{userName,jdbcType=VARCHAR}, </if> <if test="userBirthday != null" > user_birthday = #{userBirthday,jdbcType=DATE}, </if> <if test="userSalary != null" > user_salary = #{userSalary,jdbcType=DOUBLE}, </if> </set> where user_id = #{userId,jdbcType=CHAR} </update> <update id="updateByPrimaryKey" parameterType="me.gacl.domain.User" > update t_user set user_name = #{userName,jdbcType=VARCHAR}, user_birthday = #{userBirthday,jdbcType=DATE}, user_salary = #{userSalary,jdbcType=DOUBLE} where user_id = #{userId,jdbcType=CHAR} </update> <!-- ==============以下内容是根据自身业务扩展的内容======================= --> <!-- select标签的id属性与UserMapper接口中定义的getAllUser方法要一模一样--> <select id="getAllUser" resultMap="BaseResultMap"> select user_id, user_name, user_birthday, user_salary from t_user </select></mapper>4、在UserServiceI接口中也添加一个getAllUser()方法,如下:
package me.gacl.service; استيراد java.util.list ؛ import me.gacl.domain.User; public interface UserServiceI { /** * Add user* @param user */ void addUser(User user); /** * Get user based on user id* @param userId * @return */ User getUserById(String userId); /** Get all user information* @return List<User> */ List<User> getAllUser(); }5、在UserServiceImpl类中实现getAllUser方法,如下:
package me.gacl.service.impl; استيراد java.util.list ؛ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import me.gacl.dao.UserMapper; import me.gacl.domain.User; import me.gacl.service.UserServiceI; /** * @author gacl * Use @Service annotation to annotate the UserServiceImpl class as a service * The id of the service is userService */ @Service("userService") public class UserServiceImpl implements UserServiceI { /** * Use @Autowired annotation to annotate the userMapper variable, * When you need to use UserMapper, Spring will automatically inject UserMapper */ @Autowired private UserMapper userMapper;//Inject dao @Override public void addUser(User user) { userMapper.insert(user); } @Override public User getUserById(String userId) { return userMapper.selectByPrimaryKey(userId); } @Override public List<User> getAllUser() { return userMapper.getAllUser(); } }6、在src/main/java目录下创建一个me.gacl.web.controller包,然后在me.gacl.web.controller下创建一个UserServlet,如下:
package me.gacl.web.controller; import java.io.IOException; استيراد java.util.list ؛ import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import me.gacl.domain.User; import me.gacl.service.UserServiceI; /** * @author gacl * @WebServlet is an annotation provided by Servlet. The purpose is to label a normal java class that inherits the HttpServlet class as a Servlet * After the UserServlet uses the @WebServlet annotation, there is no need to configure it in web.xml */ @WebServlet("/UserServlet") public class UserServlet extends HttpServlet { //UserService private UserServiceI userService; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Get all user information List<User> lstUsers = userService.getAllUser(); request.setAttribute("lstUsers", lstUsers); request.getRequestDispatcher("/index.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } public void init() throws ServletException { //Get Spring context object when Servlet initialization (ApplicationContext) ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()); //Get userService from ApplicationContext userService = (UserServiceI) ac.getBean("userService"); } }7、编辑index.jsp页面,用于展示查询到的用户信息,内容如下:
<%@ page language="java" pageEncoding="UTF-8"%><%--引入JSTL核心标签库--%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><!DOCTYPE html><html> <head> <title>显示用户信息</title> <style type="text/css"> table,td{ border: 1px solid; border-collapse: collapse; } </style> </head> <body> <table> <tr> <td>用户ID</td> <td>用户名</td> <td>用户生日</td> <td>工资</td> </tr> <%--遍历lstUsers集合中的User对象--%> <c:forEach var="user" items="${lstUsers}"> <tr> <td>${user.userId}</td> <td>${user.userName}</td> <td>${user.userBirthday}</td> <td>${user.userSalary}</td> </tr> </c:forEach> </table> </body></html>8、执行maven install命令编译项目,然后将项目部署到tomcat服务器中运行,注意,由于要使用Servlet3.0,所以必须将项目部署到tomcat7.x以上的服务器中去运行,如下所示:
输入地址:http://localhost:8080/spring4-mybatis3/UserServlet访问UserServlet,访问结果如下:
可以看到,t_user表中的用户信息全部查询出来显示到页面上了。这样在web服务器中的测试也正常通过了。
以上就是Spring4.x与MyBatis3.x整合的全部内容了。编写这个整合例子花了不少时间,使用Maven编译时总是出现莫名其妙的问题,有时候成功,有时候失败,反正很莫名其妙。如果遇到执行Maven install操作不能正常编译通过的情况:可以尝试采用:Maven clean→Clean项目→Maven install这三个步骤去解决问题