Im vorherigen Artikel wurden die Grundprinzipien und die Verwendung von Spring Boot durch ein einfaches HelloWorld -Programm erklärt. In diesem Artikel wird hauptsächlich erläutert, wie man über Spring Boot auf die Datenbank zugreift. Dieser Artikel zeigt drei Möglichkeiten, auf die Datenbank zuzugreifen. Das erste ist Jdbctemplate, der zweite ist JPA und der dritte ist MyBatis. Wie bereits erwähnt, wird diese Serie ein Blog -System als Grundlage für die Erläuterung verwenden. In diesem Artikel wird der Speicher und Zugriff des Artikels erläutert (enthält jedoch nicht die Details des Artikels). Da die endgültige Implementierung durch MyBatis abgeschlossen ist, wird nur eine einfache Demonstration von JDBCTEMPLET und JPA vorgenommen, und der MyBatis -Teil wird die Hinzufügung, Löschung, Änderung und Suche des Artikels vollständig implementieren.
1. Vorbereitung
Bevor Sie diese Methoden demonstrieren, müssen Sie zuerst etwas vorbereiten. Die erste ist die Datenbank. Dieses System wird mit MySQL implementiert. Wir müssen zuerst eine TB_Article -Tabelle erstellen:
DROP TABLE IF EXISTS `tb_article`;CREATE TABLE `tb_article` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL DEFAULT '', `summary` varchar(1024) NOT NULL DEFAULT '', `status` int(11) NOT NULL DEFAULT '0', `type` int(11) NOT NULL, `user_id` Bigint (20) nicht null default '0', `create_time` timestamp nicht null Standard current _timestamp,` update_time` timestamp nicht null Standard Current_Timestamp, `public_time` timestamp nicht null Standard Current uttimestamp, Primärschlüssel (` id`)).
In der nachfolgenden Demonstration wird diese Tabelle hinzugefügt, gelöscht, geändert und überprüft. Sie sollten sehen, dass es in dieser Tabelle keine Details zum Artikel gibt. Der Grund dafür ist, dass die Details des Artikels relativ lang sind. Wenn es in dieser Tabelle platziert wird, wird dies die Effizienz der Abfrage der Artikelliste leicht beeinflussen, sodass die Details des Artikels in einer anderen Tabelle getrennt gespeichert werden. Zusätzlich müssen wir den Datenbankverbindungspool konfigurieren. Hier verwenden wir den Druidenverbindungspool. Darüber hinaus wird die Konfigurationsdatei mit YAML konfiguriert, dh application.yml (Sie können auch die Konfigurationsdatei application.Properties verwenden. Es gibt keinen großen Unterschied. Wenn Sie mit YMAL nicht vertraut sind und interessiert sind, können Sie sie überprüfen, was relativ einfach ist). Die Konfiguration des Verbindungspools lautet wie folgt:
Frühling: DataSource: URL: JDBC: MySQL: //127.0.0.1: 3306/Blog? UseUnicode = True & CharakterCoding = UTF-8 & USSSL = False DriverClassName: com.mysql.jdbc.driver userername: 123456 Typ: Com.aliBaba.druid.druidd-Typ: 123456 Typ.
Schließlich müssen wir auch eine Pojo -Klasse einrichten, die der Datenbank entspricht. Der Code lautet wie folgt:
public class Artikel {private long id; privater String -Titel; private Zeichenfolge Zusammenfassung; privates Date Createtime; privates Datum Publictime; privates Datum Updatetime; private long userId; privater Ganzzahlstatus; privater Ganzzahltyp;}OK, das ist die ganze Arbeit, die Sie zur Vorbereitung benötigen, und jetzt beginnen Sie mit der Implementierung des Datenbankvorgangs.
2. Integration mit JDBCTEMplate
Zunächst greifen wir zunächst über JDBCTEMPLTE auf die Datenbank zu. Hier demonstrieren wir nur die Einführung von Daten. Wie im vorherigen Artikel erwähnt, bietet Spring Boot viele Starter, um verschiedene Funktionen zu unterstützen. Um JDBctemplate zu unterstützen, müssen wir nur den folgenden Starter vorstellen:
<Depopenty> <gruppe> org.springFramework.boot </Groupid> <artifactId> Spring-Boot-Starter-Jdbc </artifactid> </abhängig>
Jetzt können wir die Dateninsertion über JDBCTEMplate implementieren:
public interface articledao {long InsertArticle (Artikelartikel);} @repositoryPublic Klasse ArticleDaOjdbCtemplateImpl implementiert articledao {@autowired private namerParameterjdbctemplate jdbCtemplate; @Override public Long InsertArticle (Artikelartikel) {String SQL = "In tb_article einfügen (Titel, Zusammenfassung, user_id, create_time, public_time, update_time, status)" + "values (: title,: summary,: userId,: createtime,: publictime,: updatetime,:: status)"; MAP <string, object> param = new HashMap <> (); param.put ("title", article.gettitle ()); param.put ("summary", article.getSummary ()); param.put ("userId", article.getUerId ()); param.put ("status", article.getStatus ()); param.put ("createTime", article.getCreateTime ()); param.put ("createTime", article.getCreateTime ()); param.put ("publictime", article.getPublictimTime ()); param.put ("updateTime", article.getupdatetime ()); return (lang) jdbctemplate.update (SQL, Param); }}Wir verwenden JUNIT, um den obigen Code zu testen:
@Runwith (SpringJunit4ClASSRunner.class) @springboottest (classes = application.class) öffentliche Klasse Articledaotest {@autowired Private Articledao Articledao; @Test public void TestInsert () {article article = new article (); Artikel.Settitle ("Testtitel"); article.setSummary ("Testübersicht"); article.setUserid (1l); Artikel.SetStatus (1); article.setCreateTime (neues Datum ()); article.setUpDatetime (neues Datum ()); article.setPublictime (neues Datum ()); articledao.insertArticle (Artikel); }}Um das obige Testprogramm zu unterstützen, müssen Sie auch einen Starter vorstellen:
<Depopentcy> <gruppe> org.springFramework.boot </Groupid> <artifactId> Spring-Boot-Starter-Test </artifactId> <Scope> Test </Scope> </abhängig>
Aus dem obigen Code können wir sehen, dass es im Grunde keine Konfiguration gibt, außer der Einführung des JDBC -Starts. Dies ist der automatische Konfigurationsprozess von Spring Start. Der obige Code muss auf den Ort der Anwendungsklasse achten. Diese Klasse muss sich im Elternpaket der DAO -Klasse befinden. Zum Beispiel befindet sich DAO im Paket com.pandy.blog.dao. Jetzt verschieben wir die Klasse application.java aus dem Paket com.pandy.blog in das Paket com.pandy.blog, und der folgende Fehler wird angezeigt:
Verursacht durch: org.springframework.bean.factory.nosuchbeandefinitionException: Keine qualifizierende Bean von Typ 'com.pandy.blog.dao.Articledao' verfügbar: Erwartet mindestens 1 Bean, die als Autowire -Kandidat qualifiziert sind. Abhängigkeit Annotationen: {@org.springframework.bean.factory.annotation.autowired (erforderlich = true)} at org.springFramework.beans.factory.support.DefaultListableBeanFactory.raisenomatchingBeanFound (standardListableBeanFactory.java:1493) at DefaultListableFactory.java:1493) at DefaultListableFactory.java:1493) at DefaultListableFactory org.springFramework.beans.factory.support.DefaultListableBeanFactory.DoresoldePendency (DefaultListableBeanFactory.java:1104) bei org.springFramework.bean.factory.Support.DefaultableListableLeTory.resolvedePendency (DefaultLayListableLyBactory. org.springframework.beans.factory.annotation.autowiredAnnotationBeanPostProcessor $ autowiredFieldelement.inject (AutoWiredAnnotationBeanPostProcessor.java:585) ... 28 weitereMit anderen Worten, die Implementierung von Articledao kann nicht gefunden werden. Was ist der Grund? Im vorherigen Blog -Beitrag haben wir gesehen, dass die Annotation @springbootApplication @Componentscan erbt, die nur die Pakete und Unterpackungen durchsucht, in denen sich die Anwendungsklasse standardmäßig befindet. Daher können Sie für den obigen Fehler zusätzlich zur Aufrechterhaltung der Anwendungsklasse in DAOs übergeordnetem Paket das gescannte Paket angeben, um zu lösen:
@SpringBootApplication@componentscan ({"com.pandy.blog"}) öffentliche Klasse Anwendung {public static void main (String [] args) löst eine Ausnahme aus {SpringApplication.run (application.class, args); }}3. Integration mit JPA
Jetzt werden wir erläutern, wie Datenbankvorgänge über JPA implementiert werden. Es ähnelt immer noch JDBCTEMplate. Zunächst müssen wir den entsprechenden Starter vorstellen:
<Depopenty> <gruppe> org.springFramework.boot </Groupid> <artifactId> Spring-Boot-Starter-Data-jpa </artifactid> </abhängig>
Anschließend müssen wir der Pojo -Klasse Entitätsannotation hinzufügen und den Tabellennamen angeben (falls nicht angegeben, der Standard -Tabellenname ist Artikel), und dann müssen wir die ID und ihre Generationsstrategie angeben. Dies sind alles JPA -Wissen und haben nichts mit Spring Boot zu tun. Wenn Sie damit nicht vertraut sind, können Sie sich die JPA -Wissenspunkte ansehen:
@Entity (name = "tb_article") public class Artikel {@ID @generatedValue private long id; privater String -Titel; private Zeichenfolge Zusammenfassung; privates Date Createtime; privates Datum Publictime; privates Datum Updatetime; private long userId; privater Ganzzahlstatus;}Schließlich müssen wir die JParepository -Klasse erben. Hier implementieren wir zwei Abfragemethoden. Die erste ist eine Abfrage, die der JPA -Benennungsspezifikation entspricht. JPA hilft uns automatisch, die Generation von Abfragestatements zu vervollständigen. Die andere Möglichkeit besteht darin, JPQL (eine von JPA unterstützte SQL-ähnliche Abfrage) zu implementieren.
public interface articlerepository erweitert JParepository <Actage, long> {public list <Actage> findByUserid (Long userId); @Query ("Kunst aus com.pandy.blog.po.Article Art WHERE TITEL =: Titel") Public List <Actage> QueryByTitle (@param ("Titel") String -Titel);};};Ok, wir können den obigen Code erneut testen:
@Runwith (SpringJunit4ClASSRunner.class) @springboottest (classes = application.class) öffentliche Klasse ArticlerePositoryTest {@autowired private articlerepository articlerepository; @Test public void testQuery () {list <Aktion> articlelist = articlerepository.QueryByTitle ("Testtitel"); AssertRue (articlelist.size ()> 0); }}Beachten Sie, dass JDBCTEMplate hier immer noch Probleme gibt. Sie müssen die Anwendungsstartklasse nicht im übergeordneten Paket von Respository- und Entitätsklassen erstellen, da ansonsten der folgende Fehler angezeigt wird:
Verursacht von: org.springframework.bean.factory.nosuchbeandefinitionException: Keine qualifizierende Bean von Typ 'com.pandy.blog.dao.articlerepository' verfügbar: Erwartet mindestens 1 Bean, die als Autoowire -Kandidat qualifiziert sind. Abhängigkeit Annotationen: {@org.springframework.bean.factory.annotation.autowired (erforderlich = true)} at org.springFramework.beans.factory.support.DefaultListableBeanFactory.raisenomatchingBeanFound (standardListableBeanFactory.java:1493) at DefaultListableFactory.java:1493) at DefaultListableFactory.java:1493) at DefaultListableFactory org.springFramework.beans.factory.support.DefaultListableBeanFactory.DoresoldePendency (DefaultListableBeanFactory.java:1104) bei org.springFramework.bean.factory.Support.DefaultableListableLeTory.resolvedePendency (DefaultLayListableLyBactory. org.springframework.beans.factory.annotation.autowiredAnnotationBeanPostProcessor $ autowiredFieldelement.inject (AutoWiredAnnotationBeanPostProcessor.java:585) ... 28 weitereNatürlich können Sie auch das gescannte JPA -Paket angeben, indem Sie @EnablejparePositories annotieren, aber es funktioniert immer noch nicht, und der folgende Fehler wird angezeigt:
Verursacht von: java.lang.IillegalargumentException: kein verwalteter Typ: Klasse com.pandy.blog.po.article bei org.hibernate.jpa.internal.metamodel org.springframework.data.jpa.repository.support.jpametamodelentityInformation org.springframework.data.jpa.repository.support.jpaentityInformationsupport.getEntityInformation (jpaentityInformationsupport.java:68) at org.springframework.data.jpa.repository.support.jparepositoryfactory.getEntityInformation (jparepositoryFactory.java:153) at org.springframework.data.jpa.repository.support.jparepositoryfactory.gettargetRepository (jparepositoryfactory.java:100) at org.springframework.data.jpa.repository.support.jparepositoryfactory.gettargetrepository (jparepositoryfactory.java:82) at org.springframework.data.repository.core.support.repositoryFactorySupport.getRepository (repositoryFactorySupport.java:199) at org.springframework.data.repository.core.support.repositoryBactoryBeansupport.initandReturn (RepositoryFactoryBeansupport.java:277) at org.springframework.data.repository.core.support.repositoryBactoryBeansupport.afterPropertieStieSt (repositoryFactoryBeansupport.java:263) at org.springframework.data.jpa.repository.support.jparepositoryFactoryBean.afterProperTieStieStieSet (jparepositoryFactoryBean.java:101) at org.springframework.beans.factory.support.AbstractAutoWirecapableBeanFactory.InvokeInitMethods (AbstractAutoWirecapableBeanFactory.java:1687) at org.springframework.beans.factory.support.AbstractAutoWirecapableBeanFactory.initializeBean (AbstractAutoWirecapableBeAnfactory.java:1624) ... 39 Weitere
Dieser Fehler zeigt an, dass Entität nicht erkannt werden kann. Sie müssen daher auch das Entitätspaket angeben, indem Sie @entityScan annotieren. Die endgültige Konfiguration lautet wie folgt:
@SpringBootApplication@componentscan ({"com.pandy.blog"})@enableJparePositories (Basepackages = "com.pandy.blog")@entityScan ("com.pandy.blog") öffentliche Klassenanwendung {öffentliche statische void Main (String [] args) {{fedApplication.run.run (Cling [] args). }}4. Integration mit MyBatis
Schauen wir uns schließlich an, wie Sie den Datenbankzugriff über MyBatis erreichen können. Ebenso müssen wir noch Starter vorstellen:
<Depopenty> <gruppe> org.mybatis.spring.boot </Groupid> <artifactId> mybatis-pring-boot-starter </artifactid> <version> 1.1.1 </Version> </abhängig>
Da der Starter nicht offiziell von Spring Boot bereitgestellt wird, steht die Versionsnummer nicht mit Spring Boot nicht und muss manuell angegeben werden.
MyBatis kann im Allgemeinen SQL angeben, das Datenbanken über XML oder Anmerkungen betreibt. Persönlich bevorzuge ich XML, sodass dieser Artikel nur über XML zu Zugriff auf Datenbanken demonstriert. Zunächst müssen wir das Mapper -Verzeichnis konfigurieren. Wir konfigurieren es in application.yml:
MyBatis: Konfigurationslokationen: mybatis/mybatis-config.xml mapper-locations: mybatis/mapper/*. XML Typ-Aliases-Pack: com.pandy.blog.po
Die Konfiguration hier enthält hauptsächlich drei Teile. Eine ist einige Konfigurationen von MyBatis selbst, wie z. B. Alias für Grundtypen. Die zweite besteht darin, den Speicherort der Mapper -Datei anzugeben, und der dritte ist der Alias für die Pojo -Klasse. Diese Konfiguration kann auch durch Java -Konfiguration implementiert werden. Aus Platzproblemen werde ich hier nicht ausführlich erklären. Interessierte Freunde können es selbst umsetzen.
Nach der Konfiguration schreiben wir zunächst die Mapper -Schnittstelle:
public interface articlemapper {public Long InsertArticle (Artikelartikel); public void updatearticle (Artikelartikel); öffentlicher Artikel QueryById (Long ID); öffentliche Liste <artikels> queryArticleBypage (@param ("article") article, @param ("pageSize") int pageSize, @param ("offset") int offset);}Diese Schnittstelle definiert vorübergehend nur vier Methoden, nämlich hinzufügen, aktualisiert und abfragen, basierend auf ID und Pagination. Dies ist eine Schnittstelle und ähnelt JPA, sodass Sie keine Klassen implementieren müssen. Als nächstes schreiben wir eine XML -Datei:
<? namespace="com.pandy.blog.dao.ArticleMapper"> <resultMap id="articleMap" type="com.pandy.blog.po.Article"> <id column="id" property="id" jdbcType="INTEGER"/> <result column="title" property="title" jdbcType="VARCHAR"/> <result column="summary" property="summary" jdbcType="VARCHAR"/> <result column="user_id" property="userId" jdbcType="INTEGER"/> <result column="status" property="status" jdbcType="INTEGER"/> <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/> <result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/> <result column="public_time" property="publicTime" jdbcType="TIMESTAMP"/> </resultMap> <sql id="base_column"> title,summary,user_id,status,create_time,update_time,public_time </sql> <insert id="insertArticle" parameterType = "article"> in tb_article einfügen (<include refid = "base_column"/>) value (#{title},#{summary},#{userId},#{status},#{createtime},#{updatetime}, {Publictime}) </updatTiDE = updataTtime = updataDe = updataTtime = updataTIne = updat updaTtime = updata updada. tb_article <set> <if test = "title! <if test = "updateTime! </select> <select id = "queryArticleBypage" resultMap = "articlemap"> id, <include refID = "Base_Column"> </> aus Tb_article <Where> <if test = "article.title! user_id = #{article.userid} </if> </wobei> limit {offset}, #{pageSize} </select> </mapper>Schließlich müssen wir die vom Mapper gescannten Pakete manuell angeben:
@SpringbootApplication@mapperscan ("com.pandy.blog.dao") öffentliche Klasse Anwendung {public static void main (String [] args) löst eine Ausnahme aus {Springapplication.run (application.class, args); }}OK, die Integration in MyBatis ist ebenfalls abgeschlossen. Testen wir sie erneut:
@Runwith (SpringJunit4ClASSRunner.class) @springboottest (classes = application.class) öffentliche Klasse ArticlemapperTest {@autowired Private Articlemapper Mapper; @Test public void TestInsert () {article article = new article (); Artikel.Settitle ("Test Titel 2"); article.setSummary ("Testzusammenfassung 2"); article.setUserid (1l); Artikel.SetStatus (1); article.setCreateTime (neues Datum ()); article.setUpDatetime (neues Datum ()); article.setPublictime (neues Datum ()); Mapper.insertArticle (Artikel); } @Test public void testMybatisquery () {article article = mappper.queryById (1L); Assertnotnull (Artikel); } @Test public void testupdate () {article article = mappper.queryById (1L); article.setPublictime (neues Datum ()); article.setUpDatetime (neues Datum ()); Artikel.SetStatus (2); Mapper.UpDATETICL (Artikel); } @Test public void testQueryBypage () {article article = new article (); article.setUserid (1l); Liste <artikels> list = mapper.queryArticlesBypage (Artikel, 10,0); AssertRue (list.size ()> 0); }}5. Zusammenfassung
Dieser Artikel zeigt die Integration von Spring Boot mit JDBCTEMPLET, JPA und MyBatis. Insgesamt ist die Konfiguration relativ einfach. Schüler, die zuvor verwandte Konfigurationen durchgeführt haben, sollten das Gefühl haben, dass dies offensichtlich ist. Spring Boot hat uns in dieser Hinsicht in der Tat große Hilfe geliefert. In nachfolgenden Artikeln werden wir nur MyBatis verwenden, um Datenbankvorgänge auszuführen. Eine andere Sache, die hier zu beachten ist, ist, dass MyBatis 'Pagination -Abfrage hier handgeschrieben wird. Diese Paginierung kann während der formalen Entwicklung durch Plug-Ins abgeschlossen werden. Dies hat jedoch nichts mit Spring Start zu tun. In diesem Artikel wird diese manuelle Methode vorübergehend verwendet, um die Paginierungsverarbeitung durchzuführen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.