مقدمة
SPRING'S JDBC TEMPLET عبارة عن تغليف أساسي يستخدمه الربيع لـ JDBC. إنه يساعد المبرمجين بشكل أساسي على إدارة اتصالات قاعدة البيانات ، كما أن بقية أساليب الاستخدام ليست فرقًا كبيرًا من استخدام JDBC مباشرة.
متطلبات العمل
الجميع على دراية باستخدام JDBC. هذا هو في الأساس إظهار الخطوات لاستخدام SPRING JDBC Templet في Springboot ، لذلك قمنا بتصميم متطلبات بسيطة. عملية الخثارة لكائن المستخدم. يحتوي الكائن على خصائصين ، أحدهما معرف والآخر هو الاسم. مخزنة في جدول Auth_user في MySQL.
إنشاء مشاريع جديدة وإضافة تبعيات
إنشاء مشروع Springboot فارغ في Idea Intellij. خطوات محددة المرجع
برنامج Intellij Idea الرسومي لإنشاء مشاريع الربيع. وفقًا لمتطلبات هذا المثال ، نحتاج إلى إضافة التبعيات الثلاثة التالية
<Rependency> <roupeD> org.springframework.boot </rougiD> <intifactid> Spring-Boot-Starter-Web </stifactid> </premited> <rempency> <rouckid> mysql </rougiD> <StifactId> mysql-connector-java </shintifactid> <الإصدار> 6.0.6 </version> </premined>
نظرًا لأننا نريد نشر خدمة REST HTTP ، فإننا نضيف تبعية النجمة النابضة. نريد هنا استخدام طريقة JDBC Tempet للوصول إلى قاعدة البيانات ، لذلك نضيف تبعية Spring-Boot-Starter-JDBC للوصول إلى قاعدة بيانات MySQL ، لذلك نضيف أحدث إصدار من برنامج تشغيل JDBC من MySQL.
قم بإعداد بيئة قاعدة البيانات
افترض أن MySQL 5.7 مثبت بالفعل على نظام التشغيل Linux. يتم تنفيذ العمليات التالية على سطر أوامر نظام التشغيل ، حيث تم تسجيل الدخول إلى عميل سطر الأوامر لـ MySQL من خلال المستخدم الجذر.
بناء قاعدة البيانات والجدول
إنشاء قاعدة بيانات springboot_jdbc ؛ إنشاء جدول Auth_user (Uuid bigint not null ، name varchar (32) ، المفتاح الأساسي (uuid)) charset default = utf8mb4 ؛
تعيين أذونات المستخدم
منح جميع الامتيازات على springboot_jdbc.* إلى "springboot '@' ٪ 'التي تم تحديدها بواسطة" springboot "؛ امتيازات Flush ؛
تكوين مصدر البيانات (تجمع الاتصال)
يتم تكوين مصدر بيانات Springboot تلقائيًا. في Springboot 2.0 ، هناك العديد من تكوينات مصدر البيانات المتاحة ، ويختارون مصدر البيانات الذي يجب استخدامه فعليًا بالترتيب الأخير من Hikaricp -> Tomcat Polling -> Commons DBCP2.
عندما يضيف المشروع تبعية SPRING-Boot-Starter-JDBC ، يتم تضمين تبعية مصدر بيانات HikaricP بالفعل ، لذلك يتم تكوين مصدر بيانات تجمع HikariCP تلقائيًا هنا.
أضف التكوين التالي في applications.properties
#تكوين مصدر البيانات العام spring.datasource.driver-class-name = com.mysql.cj.jdbc.driverspring.datasource.url = jdbc: mysql: //10.110.2.5: 3306/spri ng-boot-jdbc؟ charset = utf8mb4 & usessl = falsspring.datasource.username = springbootspring.datasource.password = springboot# مصدر بيانات Hikari محدد التكوين spring.datasource.hikari.maximum-pool-size = 20spring.datasource.hikari.minimum-idle = 5
من بينها ، يتم عرض معظم تكوينات مصدر بيانات Hikari في الشكل أدناه. يمكنك التحقق من معنى كل تكوين
تطوير البرنامج
كيان قاعدة بيانات المستخدم
وفقًا للمتطلبات ، فإن كيان بيانات المستخدم المقابل له سمتان ، إحداهما معرف والآخر هو الاسم. هذا هو كائن Pojo نقي.
package com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao ؛/*** كائن كيان المستخدم** Author Yang Gaochao* since 2018-03-09*/فئة عامة userdo {private id ؛ اسم السلسلة الخاصة ؛ Public Long getId () {return id ؛ } public void setId (id long) {this.id = id ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ }} كائن الإرجاع العام HTTP REST
عادةً في واجهة REST HTTP ، لا نريد فقط إرجاع محتوى كائن العمل بشكل مباشر ، ولكن أيضًا إرجاع بعض المعلومات الشائعة ، مثل نتيجة استدعاء الواجهة ، والرسالة النصية المخصصة التي يتم إرجاعها عند فشل المكالمة ، وما إلى ذلك. ثم نحتاج إلى إنشاء كائنات راحة شائعة ، بالإضافة إلى إرجاع نتائج مكالمات الواجهة الشائعة ورسائل نصية ، تتضمن واحدة محتوى عملًا منفصلًا ويتضمن مجموعة من مجموعة متعددة من الأعمال التجارية. التعريف المحدد كما يلي
إرجاع كائن لمحتوى الأعمال المنفصل
Package com.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo ؛/*** إرجاع الكائن الفردي النتيجة** Author Yang GaoChao* @Since 2018-03-09*/public class RestItemResult <T> رسالة سلسلة خاصة ؛ عنصر t الخاص ؛ السلسلة العامة getResult () {return return ؛ } public void setResult (String result) {this.result = result ؛ } السلسلة العامة getMessage () {return message ؛ } public void setMessage (رسالة سلسلة) {this.message = message ؛ } t getItem () {return item ؛ } public void setItem (t item) {this.item = item ؛ }} مجموعة محتوى الأعمال يعيد كائن
package com.yanggaochao.springboot.learn.springbootjdbclearn.domain رسالة سلسلة خاصة ؛ مجموعة خاصة <T> العناصر ؛ السلسلة العامة getResult () {return return ؛ } public void setResult (String result) {this.result = result ؛ } السلسلة العامة getMessage () {return message ؛ } public void setMessage (رسالة سلسلة) {this.message = message ؛ } المجموعة العامة <T> getItems () {return heads ؛ } public void setItems (Collection <T> items) {this.items = heads ؛ }} تطوير طبقة استمرار البيانات
تعريف واجهة طبقة استمرار بيانات المستخدم
حزمة com.yanggaochao.springboot.learn.springbootjdbclearn.dao 2018-03-09*/الواجهة العامة userDao {/*** احفظ مستخدمًا جديدًا إلى قاعدة البيانات** param كائن مستخدم لحفظ* @ربح العضلات ناجحًا*/boolean add (userdo user) ؛ / *** قم بتحديث مستخدم في قاعدة البيانات** param مستخدم مستخدم المستخدم لتحديث* RETURN ما إذا كان التحديث ناجحًا*/ boolean update (userdo user) ؛ / *** حذف مستخدم محدد** param معرف المستخدم للحذف* return ما إذا كان الحذف ناجحًا*/ oolean delete (id id) ؛ / *** الاستعلام الدقيق لمستخدم محدد** param معرف المستخدم للاستعلام* @RETURN إذا كان يمكن الاستعلام عنه ، وإرجاع معلومات المستخدم ، وإلا بإرجاع موقع NULL*/ USERDO (معرف طويل) ؛ / *** Quey المستخدم بالاسم** param اسم الاسم ليكون غامضًا* قائمة المستخدمين للاستعلام*/ list <SeterDo> matchName (اسم السلسلة) ؛} تطبيق طبقة استمرار بيانات المستخدم
حزمة com.yanggaochao.springboot.learn.springbootjdbclearn.dao com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo ؛ استيراد org.springframework.beans.factory.annotation.autowired org.springframework.jdbc.support.rowset.sqlrowset ؛ استيراد org.springframework.stereotype.repository */@ropositorypublic class userDaoJdBCtempletImpl تنفذ userdao {private final jdbctemplate jdbctemplate ؛ AUTOWIRED userDAOJDBCTEMPLETIMPL (JDBCTEMPLATE jDBCTEMPLATE) {this.jdbCtemplate = jdbCtemplate ؛ } Override Public Boolean Add (userdo user) {String sql = "insert in auth_user (uuid ، name) base (؟ ،؟)" ؛ return jdbctemplate.update (sql ، user.getId () ، user.getName ())> 0 ؛ } Override Public Boolean Update (userdo user) {String sql = "update uplud_user set name =؟ اين uuid =؟" ؛ return jdbctemplate.update (sql ، user.getName () ، user.getId ())> 0 ؛ } Override Public Boolean Delete (id long) {string sql = "delete from auth_user where uuid =؟" ؛ return jdbctemplate.update (sql ، id)> 0 ؛ } Override public userdo locate (معرف طويل) {string sql = "select * from auth_user where uuid =؟" ؛ sqlrowset rs = jdbctemplate.queryforrowset (sql ، id) ؛ if (rs.next ()) {return generateentity (rs) ؛ } إرجاع فارغ ؛ } Override Public List <SeterDo> matchName (اسم السلسلة) {String sql = "SELECT * من AUTH_USER حيث مثل الاسم؟" ؛ sqlrowset rs = jdbctemplate.queryforrowset (sql ، "٪" + name + "٪") ؛ قائمة <SerdDo> المستخدمين = جديد ArrayList <> () ؛ بينما (rs.next ()) {user.add (generateentity (rs)) ؛ } إرجاع المستخدمين ؛ } userdo generateentity (sqlrowset rs) {userdo wechatpay = new userDo () ؛ WeChatpay.setId (rs.getlong ("uuid")) ؛ WeChatpay.setName (Rs.GetString ("name")) ؛ إرجاع WeChatpay ؛ }} نستخدم هنا أولاً التعليق التوضيحي للإشارة إلى أن هذه فئة من طبقة استمرار البيانات ، وسيقوم Springboot بتسوية هذه الفئة تلقائيًا. ثم أضف autowired إلى المُنشئ. عندما يقوم Springboot بتركيب هذه الفئة ، فإنه سيحقق مثيل JDBCTEMPLET تلقائيًا في هذه الفئة. هنا ، يتم تكوين مثيل JDBCTEMPLET تلقائيًا بواسطة SpringBoot استنادًا إلى التكوين المتعلق بمصدر البيانات في التطبيقات. وفقًا لخوارزمية Springboot لتكوين مصادر البيانات تلقائيًا ، فإن مصدر البيانات المراد تكوينه هنا هو Hikaricp.
الباقي يشبه تطوير الربيع العادي JDBCtemplet. من خلال التحويل يدويًا بين الكائنات وقاعدة البيانات SQL بواسطة المبرمجين ، يمكن إضافة المستخدمين وتعديلهم وحذفهم ومطابقة غامضة واستعلام دقيق وغيرها من الوظائف.
تطوير طبقة أعمال البيانات
تعريف واجهة طبقة خدمة البيانات
package com.yanggaochao.springboot.learn.springbootjdbclearn 2018-03-09 */public interface uservice {userdo add (userdo user) ؛ UserDo Update (userdo user) ؛ الحذف المنطقي (معرف طويل) ؛ موقع userdo (معرف طويل) ؛ قائمة <SerdDo> MatchName (اسم السلسلة) ؛} تطبيق طبقة خدمة البيانات
package com.yanggaochao.springboot.learn.springbootjdbclearn.service.impl ؛ استيراد com.yanggaochao.springboot.learn.springbootjdbclearn.dao.userdao ؛ استيراد com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo org.springframework.stereotype.service ؛ استيراد java.util.date ؛ استيراد java.util.list ؛/*** فئة تطبيق طبقة الأعمال** @Author yang gaochao* since 2018-03-09*/ @servicepublic orderviceimpl distresservice {private userdao. Autowired public userviceImpl (userDao userDao) {this.userdao = userDao ؛ } Override public userdo add (userdo user) {user.setId (new date (). getTime ()) ؛ if (userDao.add (user)) {return user ؛ } إرجاع فارغ ؛ } Override public userdo update (userdo user) {if (userDao.update (user)) {return location (user.getId ()) ؛ } إرجاع فارغ ؛ } Override Public Boolean Delete (id id) {return userDao.delete (id) ؛ } Override public userdo location (ong id) {return userDao.locate (id) ؛ } Override Public List <SeterDo> matchName (اسم السلسلة) {return userDao.matchName (name) ؛ }} هنا ، يتم الإعلان عن فئة التنفيذ هذه كصف على مستوى الأعمال من خلال شرح خدمات الخدمة. يتيح UserDao من طبقة الثبات Springboot إنشاء فئة طبقة العمل هذه من خلال Autowired ، وضخت تلقائيًا فئة طبقة الثبات المقابلة في درجة الأعمال هذه.
هنا ، عند إضافة كائنات المستخدم ، عند تعيين التعريف للمستخدم ، يتم استخدام عدد من الوقت الحالي للوقت الحالي كتعريف. أثناء عملية التطوير الفعلية ، يحتاج هذا المكان إلى استخدام آلية فريدة عالميًا لضمان عدم تكرار هذا الشعار.
تطوير طبقة الخدمة الخارجية
Package com.yanggaochao.springboot.learn.springbootjdbclearn.web ؛ استيراد com.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo.restCollectionResult ؛ استيراد com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo org.springframework.web.bind.annotation.* ؛ import java.util.list ؛/*** user http rest interface** author yang gaochao* @since 2018-03-09*/ @restController @requestmapping ("api/v1/user") userapi it {at at stursoWired. requestmapping (value = "/add" ، method = requestMethod.post) public RestItemResult <SeterDo> إضافة (@requestbody userdo user) {restItEmResult <SerdDo> restItEmResult <> () ؛ user = userservice.add (user) ؛ if (user! = null) {result.setItem (user) ؛ result.setResult ("النجاح") ؛ } آخر {result.setMessage ("فشل المستخدم الجديد") ؛ النتيجة. } نتيجة الإرجاع ؛ } @requestmapping (value = "/update" ، method = requestMethod.post) Public RestItEmResult <SeterDo> update ( @requestbody userdo user) {restItEmResult <SeterDo> restItEmResult <> () ؛ user = userservice.update (user) ؛ if (user! = null) {result.setItem (user) ؛ result.setResult ("النجاح") ؛ } آخر {result.setMessage ("فشل UserDo في تعديل المستخدم") ؛ النتيجة. } نتيجة الإرجاع ؛ } requestMapping (value = "/delete/{uuid}" ، method = requestMethod.get) public RestItemResult <UserDo> delete (pathvariable long uuid) {restItEmResult <SeterDo> result = new RestItemrult <> () ؛ if (userservice.delete (uuid)) {result.setResult ("success") ؛ } آخر {result.setMessage ("فشل حذف المستخدم") ؛ النتيجة. } نتيجة الإرجاع ؛ } @requestmapping (value = "/scate/{uuid}" ، method = requestMethod.get) public RestItemResult <SeterDo> locate (pathvariable long uuid) {restItEmResult <SeterDo> result = new restitemrult <> () ؛ userdo user = userService.locate (uuid) ؛ if (user! = null) {result.setItem (user) ؛ result.setResult ("النجاح") ؛ } آخر {result.setMessage ("فشل مستخدم الاستعلام") ؛ النتيجة. } نتيجة الإرجاع ؛ } @requestmapping (value = "/match/{name}" ، method = requestMethod.get) public RestCollectionResult <SeterDo> match (name string pathvariable) {restCollectionResult <SeterDo> restCollectionResult <> () ؛ قائمة <SerdDo> user = userverservice.matchName (name) ؛ result.setItems (المستخدمين) ؛ result.setResult ("النجاح") ؛ نتيجة العودة }} هنا يتم استخدام RestController لإعلان أن هذه فئة واجهة REST HTTP. يتم تشكيل مسار الاتصال لكل واجهة من خلال الجمع بين requestMapping على الفصل و requestmapping على الطريقة. تعلن خاصية الطريقة في requestmapping على الطريقة عن الطريقة التي يطلق عليها HTTP. يحول التعليق التوضيحي @REQUESTBODY كائن JSON تلقائيًا في بيانات النشر إلى كائن POJO. يقوم PathVariable بتحويل البيانات تلقائيًا في مسار URL HTTP إلى معلمات طريقة الخدمة.
اختبار واجهة REST HTTP
اختبار خدمة REST HTTP يتم استدعاؤها من خلال httpclient من Apache Commons.
HTTP RESST يدعو الفصول المساعدة
package com.yanggaochao.springboot.learn.springbootjdbclearn ؛ import org.apache.commons.httpclient.defaulthttpmethodretryhandler org.apache.commons.httpclient.methods.getMethod ؛ import org.apache.commons.httpclient.methods.getMethod ؛ import org.apache.commons.httpclient.methods.stringRequestentity ؛ java.io.bufferedreader ؛ استيراد java.io.inputstreamreader ؛ استيراد java.io.inputstreamreader طلب HTTP * * url url عنوان URL لـ HTTP للوصول إلى * RETURN ACCESS HTTP تم الحصول على نص الاستجابة بعد */ السلسلة العامة httpgetRequest (url url سلسلة ، خريطة <سلسلة ، سلسلة> رؤوس) {try {httpclient httppclient = new httpclient () ؛ GetMethod Method = getMethod جديد (url) ؛ method.setRequestHeader ("نوع المحتوى" ، "التطبيق/json ؛ charset = utf-8") ؛ method.getParams (). if (headers! = null) {for (string key: headers.keyset ()) {method.setRequestHeader (key ، headers.get (key)) ؛ }} int statusCode = httpclient.executemethod (method) ؛ if (statusCode == 200) {return parseInputStream (method.getResponseBodyassTream ()) ؛ } آخر {system.out.println (url + "status =" + statusCode) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ } / *** استخدم طريقة post لبدء طلب http** url url عنوان URL الخاص بـ http للوصول إليه* بيانات بيانات param في الطلب* @RETURN تم الحصول على نص الاستجابة الذي تم الحصول عليه بعد الوصول إلى http* / public string httpctrequest (url url ، string data ، map <string> headers) httpclient () ؛ طريقة postmethod = postmethod جديد (url) ؛ method.setRequestHeader ("نوع المحتوى" ، "التطبيق/json ؛ charset = utf-8") ؛ method.setRequestHeader ("User-Agent" ، "Mozilla/5.0 (Windows NT 6.1 ؛ WOW64) AppleWebkit/537.36 (KHTML ، مثل Gecko) Chrome/34.0.1847.131 Safari/537.36") ؛ if (headers! = null) {for (string key: headers.keyset ()) {method.setRequestHeader (key ، headers.get (key)) ؛ }} method.setRequestEntity (new StringRequestEntity (Data ، "JSON" ، "UTF-8")) ؛ int statusCode = httpclient.executemethod (method) ؛ if (statusCode == 200) {return parseInputStream (method.getResponseBodyassTream ()) ؛ } آخر {system.out.println (url + "status =" + statusCode + parseinputStream (method.getResponseBondassTream ())) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ } / *** تحليل بيانات النص من java.io.reader** param rd java.io.riader كائن* @throws يرمي خطأ عند حدوث خطأ* / سلسلة parsereader (READER RD) استثناء {bufferedreader brd = new Bufferreader (rd) ؛ خط السلسلة stringBuilder reviewSecontext = new StringBuilder () ؛ بينما ((line = brd.ReadLine ())! = null) {responseSeContext.Append (line) .Append ("/n") ؛ } //rd.close () ؛ if (responseContext.length ()> 0) {reverseContext.Deletecharat (ResponseContext.length () - 1) ؛ } return revieDSeContext.ToString () ؛ } / *** تحليل بيانات النص من دفق الإدخال** param هو دفق الإدخال* athrows استثناء يلقي استثناء عند حدوث خطأ* / private parseinputstream (inputStream) يلقي استثناء {return parsereader (جديد bufferedReaderer (new inputstreamreader (IS))) ؛ }} نحن هنا نطبق بشكل أساسي طريقة استدعاء خدمة REST HTTP باستخدام طرق GET و POST.
حالات الاختبار
استخدم Junit لتنفيذ حالات الاختبار. لتنفيذ الاختبار ، أضفنا تبعية Maven التالية
<Rependency> <roupEd> commons-httpclient </rougiD> <StifactId> commons-httpclient </shintifactid> <الإصدار> 3.1 </version> <scope> اختبار </scope> </rependency> </arefency> <srowiD> org.codehaus.jettison </groupid> <scope> اختبار </scope> </premency>
package com.yanggaochao.springboot.learn.springbootjdbclearn ؛ import org.codehaus.jettison.json.jsonobject ؛ import org.junit.after ؛ import org.junit.bore ؛ java.util.list ؛/** * الوصف: * * Author yang gaochao * since 2018-03-09 */فئة عامة userapitest {private string useraddurl = "http: // localhost: 3030/security/v1/user/add" ؛ سلسلة خاصة userlocateurl = "http: // localhost: 3030/security/api/v1/user/locate/" ؛ سلسلة خاصة userDeleteUrl = "http: // localhost: 3030/security/api/v1/user/delete/" ؛ سلسلة خاصة userupDateurl = "http: // localhost: 3030/security/api/v1/user/update" ؛ سلسلة خاصة usermatchurl = "http: // localhost: 3030/security/api/v1/user/match/" ؛ jsonobject adduser = new jsonobject () ؛ adduserid طويل = فارغ ؛ قائمة <Tond> userIds = new ArrayList <> () ؛ before public void قبل () يلقي الاستثناء {adduser.put ("الاسم" ، "الأغنام الجميلة") ؛ jsonobject addresultjson = new jsonobject (new httpclienthelper (). تأكيد ("النجاح" .equals (addresultjson.getString ("result"))) ؛ addUserId = addResultJson.getJsonObject ("item"). getLong ("id") ؛ jsonobject user = new jsonobject () ؛ user.put ("name" ، "Pleasant Goat") ؛ AddResultJson = New JSonObject (httpclienthelper () تأكيد ("النجاح" .equals (addresultjson.getString ("result"))) ؛ userIds.add (AddResultJson.getJsonObject ("item"). getLong ("id")) ؛ user.put ("name" ، "Gray Wolf") ؛ AddResultJson = New JSonObject (httpclienthelper () تأكيد ("النجاح" .equals (addresultjson.getString ("result"))) ؛ userIds.add (AddResultJson.getJsonObject ("item"). getLong ("id")) ؛ } test public void testupDateUser () يلقي استثناء {jsonobject user = new jsonobject () ؛ user.put ("الاسم" ، "Smad Sheep") ؛ user.put ("id" ، adduserId) ؛ جديد httpclientHelper (). JSonObject LocateResultJson = New JSonObject (HttpClientHelper () Assert (user.getString ("name"). equals (locateResultjson.getJsonObject ("item"). getString ("name")))) ؛ } test public void testMatchuser () يلقي استثناء {jsonobject matchresultjson = new jsonobject (new httpclienthelper (). Assert (MatchResultJson.has ("العناصر") && matchResultJson.getJsonarray ("العناصر"). الطول () == 2) ؛ MatchResultJson = New JSonObject (httpclienthelper () Assert (MatchResultJson.has ("العناصر") && matchResultJson.getJsonarray ("العناصر"). الطول () == 1) ؛ } apter public void بعد () يلقي الاستثناء {if (addUserId! = null) {jsonobject deleteresultjson = new jsonobject (new httpclienthelper (). تأكيد ("النجاح" .equals (deleteresultjson.getString ("result"))) ؛ } لـ (long userId: userIds) {jsonobject deleteresultjson = new jsonobject (new httpclienthelper (). تأكيد ("النجاح" .equals (deleteresultjson.getString ("result"))) ؛ }}} هنا ، يتم الإعلان عن حالتين اختبار في Test ، أحدهما يختبر وظيفة تعديل المستخدم والاختبارات الأخرى وظيفة استعلام المستخدم الغامضة. Before تعلن الاستعدادات التي يتعين القيام بها قبل تنفيذ كل حالة اختبار. نقوم هنا أولاً بإدراج ثلاث قطع من البيانات في قاعدة البيانات ، وفي نفس الوقت ، نقوم أيضًا باختبار وظيفة إضافة البيانات والاستعلام الدقيق. يعلن After عن التنظيف بعد تنفيذ كل حالة اختبار. هنا نحذف بشكل أساسي البيانات التي تم إدراجها مسبقًا. يتم اختبار وظيفة حذف المستخدم بشكل متزامن هنا.
PostScript
فيما يلي مثال كامل على Springboot باستخدام JDBC Templet. إذا كان لديك خبرة في استخدام JDBC Templet تحت الربيع ، فإن الغرض الرئيسي من تقليل الكثير من أعمال التكوين في فصل الربيع.
تم تحميل الرمز المشارك في هذه المقالة على Github ، ويمكنك أيضًا تنزيله محليًا
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.