في المقالة السابقة ، تم شرح المبادئ الأساسية واستخدام Boot SPRING من خلال برنامج HelloWorld بسيط. تشرح هذه المقالة بشكل أساسي كيفية الوصول إلى قاعدة البيانات من خلال Boot Spring. ستعرض هذه المقالة ثلاث طرق للوصول إلى قاعدة البيانات. الأول هو jdbctemplate ، والثاني هو JPA ، والثالث هو mybatis. كما ذكرنا سابقًا ، ستستخدم هذه السلسلة نظام مدونة كأساس للشرح ، لذلك ستشرح هذه المقالة تخزين المقالة والوصول إليها (ولكنها لا تتضمن تفاصيل المقالة). نظرًا لانتهى التنفيذ النهائي من خلال MyBatis ، سيتم إجراء عرض بسيط فقط لـ JDBCtemplate و JPA ، وسيقوم جزء MyBatis بتنفيذ الإضافة والحذف والتعديل والبحث عن المقالة بالكامل.
1. التحضير
قبل إظهار هذه الأساليب ، تحتاج إلى إعداد شيء ما أولاً. الأول هو قاعدة البيانات. يتم تنفيذ هذا النظام باستخدام MySQL. نحتاج إلى إنشاء جدول TB_ARTICLE أولاً:
جدول إسقاط إذا كان موجودًا `tb_article` ؛ إنشاء جدول` tb_article` (`id` bigint (20) وليس null auto_increment ،` title` varchar (255) BigInt (20) ليس افتراضيًا فارغًا "0" ، "create_time` الطوابع الزمنية وليس الافتراضية الافتراضية current_timestamp ،` update_time` timestamp not null default current_timestamp ، `public_time` timestamp not null default current_timestamp ، المفتاح الأساسي (` id`)) المحرك = innodb default charset = utf8 ؛
في العرض التوضيحي اللاحق ، سيتم إضافة هذا الجدول وحذفه وتعديله وفحصه. يجب أن ترى أنه لا توجد تفاصيل المقالة في هذا الجدول. والسبب هو أن تفاصيل المقالة طويلة نسبيا. إذا وضعت في هذا الجدول ، فسيؤثر ذلك بسهولة على كفاءة الاستعلام عن قائمة المقالات ، وبالتالي سيتم تخزين تفاصيل المقالة في جدول آخر بشكل منفصل. بالإضافة إلى ذلك ، نحتاج إلى تكوين تجمع اتصال قاعدة البيانات. هنا نستخدم تجمع الاتصال Druid. بالإضافة إلى ذلك ، يتم تكوين ملف التكوين باستخدام yaml ، أي ، application.yml (يمكنك أيضًا استخدام ملف تكوين التطبيق. تكوين تجمع الاتصال على النحو التالي:
الربيع: DataSource: url: jdbc: mysql: //127.0.0.1: 3306/blog؟ useUnicode = true & directionding = utf-8 & usessl = false driverClassName: com.mysql.jdbc.driver username: root password: 123456 type:
أخيرًا ، نحتاج أيضًا إلى إنشاء فئة POJO تتوافق مع قاعدة البيانات ، والرمز هو كما يلي:
مقالة الطبقة العامة {private long id ؛ عنوان السلسلة الخاصة ؛ ملخص سلسلة خاصة تاريخ خاص CreateTime ؛ تاريخ النشر الخاص ؛ تاريخ خاص updateTime ؛ معرف مستخدم طويل خاص ؛ حالة عدد صحيح خاص ؛ نوع عدد صحيح خاص ؛}حسنًا ، هذا هو كل العمل الذي تحتاجه لإعداده ، وابدأ الآن في تطبيق عملية قاعدة البيانات.
2. التكامل مع jdbctemplate
أولاً ، نصل أولاً إلى قاعدة البيانات من خلال JDBCtemplate. هنا نوضح فقط إدخال البيانات. كما هو مذكور في المقالة السابقة ، يوفر Spring Boot العديد من المبتدئين لدعم وظائف مختلفة. لدعم jdbctemplate ، نحتاج فقط إلى تقديم المبتدئ التالي:
<Rependency> <roupiD> org.springframework.boot </rougiD> <StifactId> Spring-Boot-Starter-JDBC </shintifactid> </sependency>
الآن يمكننا تنفيذ إدخال البيانات من خلال jdbctemplate:
الواجهة العامة articledao {long insertArticle (مقال مقال) ؛} @ropositorypublic class articledaojdbctemplateImpl تنفذ Articledao {autowired private namedparameterjdbctemplate jdbctemplate ؛ Override public insertArtiCly (مقالة مقالة) {String sql = "insert في tb_article (العنوان ، الملخص ، user_id ، create_time ، public_time ، update_time ، status)" + "القيم (: العنوان ،: ملخص ،: userId ،: creatiTime ،:: upplictime ،: updateTime ،: station)" ؛ خريطة <string ، object> param = new hashmap <> () ؛ param.put ("title" ، article.getTitle ()) ؛ param.put ("summary" ، article.getSummary ()) ؛ param.put ("userId" ، article.getuserId ()) ؛ param.put ("الحالة" ، article.getStatus ()) ؛ param.put ("createTime" ، article.getCreateTime ()) ؛ param.put ("createTime" ، article.getCreateTime ()) ؛ param.put ("publictime" ، article.getPublictime ()) ؛ param.put ("updateTime" ، article.getupDateTime ()) ؛ إرجاع (طويل) jdbctemplate.update (sql ، param) ؛ }}نستخدم Junit لاختبار الرمز أعلاه:
Runwith (springJunit4ClassRunner.Class) springBoottest (الفئات = application.class) الطبقة العامة articledaotest {autowired private articledao articledao ؛ test public void testinsert () {article article = new article () ؛ article.SetTitle ("Test Title") ؛ article.setsummary ("ملخص الاختبار") ؛ article.setuserid (1L) ؛ article.setStatus (1) ؛ article.setCreateTime (Date ()) ؛ article.setupDateTime (Date ()) ؛ article.setPublictime (Date ()) ؛ articledao.insertarticle (مقال) ؛ }}لدعم برنامج الاختبار أعلاه ، تحتاج أيضًا إلى تقديم بداية:
<Rependency> <roupeD> org.springframework.boot </rougiD> <intifactid> Spring-boot-starter-test </stiftiD>
من الكود أعلاه ، يمكننا أن نرى أنه في الواقع ، لا يوجد أي تكوين في الأساس باستثناء إدخال JDBC Start. هذه هي عملية التكوين التلقائي في صندوق الربيع. يحتاج الرمز أعلاه إلى الانتباه إلى موقع فئة التطبيق. يجب أن يكون هذا الفصل موجودًا في الحزمة الأم لفئة DAO. على سبيل المثال ، يقع DAO في حزمة com.pandy.blog.dao. الآن ننقل فئة Application.java من حزمة com.pandy.blog إلى حزمة com.pandy.blog ، وسيظهر الخطأ التالي:
سبب: org.springframework.beans.factory.nosuchbeandefinitionexception: لا يوجد حبة مؤهلة من النوع 'com.pandy.blog.dao.articledao "متاحة: متوقع واحد على الأقل فاصوليا مؤهلة كمرشح للسيارات. تعليقات التبعية: {@org.springframework.beans.factory.annotation.autowired (مطلوب = صحيح)} في org.springframework.beans.factory.support.defaultlistableBeanfactory.raisenomatchingbeanfound org.springframework.beans.factory.support.defaultListableBeanfactory.Doresolvedependency (DefaultListableBeanfactory.java:1104) في org.springframework.beans.factory.support.defaultListableBeanfactory.ResolvedePendency (DefaultListableBeanfactory.java:1066) في org.springframework.beans.factory.annotation.وبعبارة أخرى ، لا يمكن العثور على تنفيذ Articledao. ما هو السبب؟ في منشور المدونة السابق ، رأينا أن التعليق التوضيحي springbootapplication يرث componentscan ، والذي يقوم فقط بمسح الحزم والحالات الفرعية حيث توجد فئة التطبيق افتراضيًا. لذلك ، بالنسبة للخطأ أعلاه ، بالإضافة إلى الحفاظ على فئة التطبيق في حزمة Dao's Parent ، يمكنك أيضًا تحديد الحزمة الممسوحة ضوئيًا لحلها:
@springbootapplication@componentscan ({"com.pandy.blog"}) تطبيق الفئة العامة {public static void main (string [] args) rems {springapplication.run (application.class ، args) ؛ }}3. التكامل مع JPA
الآن سنبدأ في شرح كيفية تنفيذ عمليات قاعدة البيانات من خلال JPA. لا يزال مشابهًا لـ JDBCtemplate. أولاً ، نحتاج إلى تقديم المبتدئ المقابل:
<Rependency> <roupled> org.springframework.boot </rougeid> <intifactid> Spring-Boot-Starter-Data-JPA </stifactid> </sependency>
ثم نحتاج إلى إضافة شرح كيان إلى فئة POJO وتحديد اسم الجدول (إن لم يكن محددًا ، اسم الجدول الافتراضي هو مقال) ، ثم نحتاج إلى تحديد المعرف واستراتيجية التوليد الخاصة به. هذه كلها معرفة JPA وليس لها علاقة مع SPRING BOOT. إذا لم تكن معتادًا عليها ، فيمكنك إلقاء نظرة على نقاط المعرفة JPA:
entity (name = "tb_article") مقالة الفئة العامة {iD @generatedValue private id ؛ عنوان السلسلة الخاصة ؛ ملخص سلسلة خاصة تاريخ خاص CreateTime ؛ تاريخ النشر الخاص ؛ تاريخ خاص updateTime ؛ معرف مستخدم طويل خاص ؛ حالة عدد صحيح خاص ؛}أخيرًا ، نحتاج إلى ورث فئة JParePository. هنا ننفذ طريقتين للاستعلام. الأول هو استعلام يتوافق مع مواصفات تسمية JPA. ستساعدنا JPA تلقائيًا في إكمال توليد بيانات الاستعلام. الطريقة الأخرى هي تنفيذ JPQL (استعلام يشبه SQL بدعم من JPA).
الواجهة العامة ArticLerePository يمتد JParePository <article ، long> {قائمة عامة <article> findByUserId (userId long) ؛ Query ("Select Art from com.pandy.blog.po.Article Art Where title =: title") قائمة عامة <article> QueryBytitle (param ("title") title string) ؛}حسنًا ، يمكننا اختبار الرمز أعلاه مرة أخرى:
Runwith (springJunit4ClassRunner.Class) springBoottest (الفئات = application.class) الفئة العامة articleRePositoryTest {autowired private articleerepository articlerepository ؛ Test public void testquery () {list <article> articLelist = articleerepository.querybytitle ("test title") ؛ AssertTrue (articlelist.size ()> 0) ؛ }}لاحظ أنه لا تزال هناك مشاكل مشابهة لـ JDBCtemplate هنا. تحتاج إلى جعل فئة بدء تشغيل التطبيق ليس في الحزمة الأصل لفئات Respository و Contity ، وإلا سيظهر الخطأ التالي:
بسبب: org.springframework.beans.factory.nosuchbeandefinitionexception: لا يوجد حبة مؤهلة من النوع 'com.pandy.blog.dao.articleerepository "متاحة: متوقع على الأقل 1 فول مؤهل كمرشح للسيارات. تعليقات التبعية: {@org.springframework.beans.factory.annotation.autowired (مطلوب = صحيح)} في org.springframework.beans.factory.support.defaultlistableBeanfactory.raisenomatchingbeanfound org.springframework.beans.factory.support.defaultListableBeanfactory.Doresolvedependency (DefaultListableBeanfactory.java:1104) في org.springframework.beans.factory.support.defaultListableBeanfactory.ResolvedePendency (DefaultListableBeanfactory.java:1066) في org.springframework.beans.factory.annotation.بالطبع ، يمكنك أيضًا تحديد حزمة JPA الممسوحة ضوئيًا من خلال التعليق على enablejparepositories ، لكنها لا تزال لا تعمل ، وسيظهر الخطأ التالي:
سبب: java.lang.illegalargumentException: ليس نوعًا مُدارًا: class com.pandy.blog.po.article at org.hibernate.jpa.internal.metamodel.metamodelimpl.managedtype (metamodelimpl.java:210) at org.springframework.data.jpa.repository.support.jpametamodelentityInformation org.springframework.data.jpa.repository.support.jpaentityInformationSupport.getentityInformation (jpaentityInformationSupport.java:68) في org.springframework.data.jpa.repository.support.jparepositoryfactory.getentityInformation (jparepositoryfactory.java:153) at org.springframework.data.jpa.repository.support.jparepositoryfactory.getTargetRepository (jparepositoryfactory.java:100) في org.springframework.data.jpa.repository.support.jparepositoryfactory.getTargetRepository (jparepositoryfactory.java:82) في org.springframework.data.repository.core.support.repositoryfactorysupport.getRepository (ropositoryfactorysupport.java:199) في org.springframework.data.repository.core.support.repositoryfactorybeansupport.initandreturn (RespositoryFactoryBeansupport.java:277) في org.springframework.data.repository.core.support.repositoryfactorybeansupport.afterpropertiesset (ropositoryfactorybeansupport.java:263) في org.springframework.data.jpa.repository.support.jparepositorybean.afterpropertiesset (jparepositoryfactorybean.java:101) في org.springframework.beans.factory.support.abstractautowiReCableBeanfactory.invokeinitmethods (AbstractautoWireCableBeanfactory.java:1687) في org.springframework.beans.factory.support.abstractautowireCableBeanfactory.InitializeBean (AbstractAutowIreCableBeanfactory.java:1624) ... 39 آخر
يشير هذا الخطأ إلى أنه لا يمكن التعرف على الكيان ، لذلك تحتاج أيضًا إلى تحديد حزمة الكيان عن طريق التعليق entityscan. التكوين النهائي هو كما يلي:
@SpringBootApplication@componentscan ({"com.pandy.blog"})@enablejParePositories (basePackages = "com.pandy.blog")@entityscan ("com.pandy.blog") تطبيق الطبقة العامة }}4. التكامل مع MyBatis
أخيرًا ، دعونا نلقي نظرة على كيفية تحقيق الوصول إلى قاعدة البيانات من خلال MyBatis. وبالمثل ، ما زلنا بحاجة إلى تقديم بداية:
<Rependency> <roupeD> org.mybatis.spring.boot </rougiD> <StifactId> mybatis-spring-boot-starter </stifactid> <الإصدار> 1.1.1 </version> </respency>
نظرًا لأن المبتدئ لا يتم توفيره رسميًا بواسطة Spring Boot ، فإن رقم الإصدار غير متسق مع SPRING BOOT ويجب تحديده يدويًا.
يمكن لـ MyBatis تحديد SQL عمومًا التي تدير قواعد البيانات من خلال XML أو التعليقات التوضيحية. أنا شخصياً أفضل XML ، لذلك توضح هذه المقالة الوصول فقط إلى قواعد البيانات من خلال XML. أولاً ، نحتاج إلى تكوين دليل Mapper. نقوم بتكوينه في application.yml:
mybatis: config-locations: mybatis/mybatis-config.xml mapper-locations: mybatis/mapper/*.
يتضمن التكوين هنا بشكل أساسي ثلاثة أجزاء ، أحدهم هو بعض تكوينات MyBatis نفسها ، مثل الاسم المستعار لأنواع أساسية. والثاني هو تحديد موقع ملف Mapper ، والثالث هو الاسم المستعار لفئة Pojo. يمكن أيضًا تنفيذ هذا التكوين من خلال تكوين Java. بسبب مشكلات الفضاء ، لن أشرح بالتفصيل هنا. يمكن للأصدقاء المهتمين تنفيذه بأنفسهم.
بعد التكوين ، نكتب أولاً واجهة Mapper:
الواجهة العامة ArticleMapper {public insertarticle (مقال مقال) ؛ public void updatearticle (مقال مقال) ؛ المقالة العامة QueryByid (معرف طويل) ؛ القائمة العامة <article> QueryArticlesBypage (param ("article") مقال ، param ("pagesize") int pagesize ، param ("Offset") int) ؛}تحدد هذه الواجهة مؤقتًا أربع طرق فقط ، وهي إضافة وتحديث والاستعلام على أساس الهوية والترقيم. هذه واجهة ، وهي تشبه JPA ، بحيث لا تحتاج إلى تنفيذ الفصول. بعد ذلك نكتب ملف XML:
<؟ مساحة الاسم = "com.pandy.blog.dao.articlemapper"> <resultmap id = "articlemap" type = "com.pandy.blog.po.article column = "summary" property = "summary" jdbctype = "varchar"/> <result column = "user_id" property = "userId" column = "update_time" property = "updateTime" jdbctype = "timestamp"/> <result column = "public_time" property = "publictime" jdbctype = id = "insertArcle" parametertype = "article"> insert في tb_article (<تضمين refid = "base_column"/>) value (#{title} ،#{summary} ،#{userid} ،#{status} ،#{createTime} ،#{updatem parametertype = "article"> تحديث tb_article <set> <if test = "title! = null"> title = #{title} ، </if> <if test = "summary! = null"> summary = #{summary} ، <////if test = "status! #{publictime} ، </if> <if test = "updateTime! = null"> update_time = #{updateime} ، </if> </st> when in id = #id} </update> <select id = "querybyid" parametertype = long "resultmap =" articlemap " tb_article where id = #{id} </select> <select id = "queryArtIlsBypage" resultMap = "articlemap"> select id ، <refid = "base_column"> </include> from tb_article <where> <test = "article.title! test = "article.userId! = null"> user_id = #{article.userid} </fres> </where> limit #{offset} ، #{pagesize} </select> </mapper>أخيرًا ، نحتاج إلى تحديد الحزم التي تم مسحها يدويًا بواسطة Mapper:
@springbootapplication@mapperscan ("com.pandy.blog.dao") تطبيق الطبقة العامة {public static void main (string [] args) rems {springapplication.run (application.class ، args) ؛ }}حسنًا ، تم الانتهاء من التكامل مع MyBatis ، دعنا نختبره مرة أخرى:
Runwith (springJunit4ClassRunner.Class) springboottest (الفئات = application.class) الفئة العامة articlemapperTest {autowired private articlemapper mapper ؛ test public void testinsert () {article article = new article () ؛ article.Settitle ("Test Title 2") ؛ article.setsummary ("ملخص الاختبار 2") ؛ article.setuserid (1L) ؛ article.setStatus (1) ؛ article.setCreateTime (Date ()) ؛ article.setupDateTime (Date ()) ؛ article.setPublictime (Date ()) ؛ mapper.insertarticle (مقال) ؛ } test public void testmybatisquery () {article article = mapPper.querybyid (1L) ؛ assertnotnull (مقال) ؛ } test public void testupdate () {article article = mapPer.queryById (1L) ؛ article.setPublictime (Date ()) ؛ article.setupDateTime (Date ()) ؛ article.setStatus (2) ؛ mapper.updatearticle (مقال) ؛ } test public void testqueryBypage () {article article = new article () ؛ article.setuserid (1L) ؛ قائمة <Stion> list = mapper.queryArticlesBypage (المقالة ، 10،0) ؛ AssertTrue (list.size ()> 0) ؛ }}5. ملخص
يوضح هذا المقال دمج Boot Spring مع JDBCtemplate و JPA و MyBatis. بشكل عام ، التكوين بسيط نسبيًا. يجب أن يشعر الطلاب الذين قاموا بالتكوينات ذات الصلة من قبل أنه واضح. لقد وفر لنا Boot Boot بالفعل مساعدة كبيرة في هذا الصدد. في المقالات اللاحقة ، سنستخدم MyBatis فقط لأداء عمليات قاعدة البيانات. شيء آخر يجب ملاحظته هنا هو أن استعلام ترقيم MyBatis مكتوب بخط اليد هنا. يمكن إكمال ترقيم الصفحات من خلال المكونات الإضافية أثناء التطوير الرسمي ، ولكن هذا لا علاقة له مع SPRING BOOT ، لذلك تستخدم هذه المقالة هذه الطريقة اليدوية مؤقتًا لأداء معالجة ترقيم الصفحات.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.