Dans l'article précédent, les principes de base et l'utilisation de Spring Boot ont été expliqués à travers un programme Simple Helloworld. Cet article explique principalement comment accéder à la base de données via Spring Boot. Cet article montrera trois façons d'accéder à la base de données. Le premier est JDBCTemplate, le second est JPA et le troisième est MyBatis. Comme mentionné précédemment, cette série utilisera un système de blog comme base d'explication, donc cet article expliquera le stockage et l'accès de l'article (mais n'inclut pas les détails de l'article). Étant donné que l'implémentation finale est terminée via MyBatis, seule une simple démonstration de JDBCTemplate et JPA sera faite, et la partie MyBatis implémentera pleinement l'ajout, la suppression, la modification et la recherche de l'article.
1. Préparation
Avant de démontrer ces méthodes, vous devez d'abord préparer quelque chose. Le premier est la base de données. Ce système est implémenté à l'aide de MySQL. Nous devons d'abord créer une table TB_ARTICLE:
TABLE DE DROP Si existe `tb_article`; créer la table` tb_article` (`id` bigint (20) pas null auto_increment,` title` varchar (255) pas null default '', `résumé` varchar (1024) pas null default '',` `Status` int (11) non null '0', 'Type' bigInt (20) non null par défaut '0', `Create_time` Timestamp Not Null Default Current_timestamp,` Update_time` Timestamp Not Null Null Default Current_timestamp, `public_time` TimeStamp Not Null Null Default Current_timestamp, Primary Key (` id`)) moteur = innodb Default Cheart = utf8;
Dans la démonstration ultérieure, ce tableau sera ajouté, supprimé, modifié et vérifié. Vous devriez voir qu'il n'y a pas de détails sur l'article dans ce tableau. La raison en est que les détails de l'article sont relativement longs. S'il est placé dans ce tableau, cela affectera facilement l'efficacité de l'interrogation de la liste des articles, de sorte que les détails de l'article seront stockés séparément dans un autre tableau. De plus, nous devons configurer le pool de connexion de la base de données. Ici, nous utilisons le pool de connexion Druid. De plus, le fichier de configuration est configuré à l'aide de YAML, c'est-à-dire Application.yml (vous pouvez également utiliser le fichier de configuration Application.Properties. Il n'y a pas de grande différence. Si vous n'êtes pas familier avec YMAL et que vous êtes intéressé, vous pouvez le vérifier, ce qui est relativement simple). La configuration du pool de connexion est la suivante:
Spring: DataSource: URL: JDBC: mysql: //127.0.0.1: 3306 / blog? useunicode = true & worseencoding = utf-8 & usessl = false driverclassname: com.mysql.jdbc.driver username: root mot de passe: 123456 Type: com.alibaba.drid.pool.datasource: com.alibaba.drud.pool.datasource
Enfin, nous devons également établir une classe POJO correspondant à la base de données, le code est le suivant:
Article de classe publique {Id privé long; titre de chaîne privée; Résumé de la chaîne privée; Date privée CreateTime; DATE PRIVÉE publictif; Date privée UpdateTime; Private Long UserId; Statut entier privé; type entier privé;}OK, c'est tout le travail que vous devez préparer, et maintenant commencer à implémenter l'opération de base de données.
2. Intégration avec JDBCTemplate
Tout d'abord, nous accédons d'abord à la base de données via JDBCTemplate. Ici, nous démontrons uniquement l'insertion de données. Comme mentionné dans l'article précédent, Spring Boot fournit de nombreux entrées pour prendre en charge différentes fonctions. Pour prendre en charge JDBCTemplate, nous devons seulement introduire le démarreur suivant:
<dependency> <proupId> org.springframework.boot </rombasid> <ArtifactId> Spring-Boot-starter-jdbc </artifactid> </Dependency>
Nous pouvons maintenant implémenter l'insertion de données via JDBCTemplate:
Interface publique Articledao {longue insertarticle (article de l'article);} @ RepositoryPublic classe ArticledaojdbCTemplateImp implémente Articledao {@Autowired Private NamedParameterJdbCTemplate JDBCTEMPLAT; @Override public long insertarticle (Article Article) {String sql = "INSERT INTO TB_ARTICLE (Title, Résumé, User_id, Create_time, public_time, Update_time, Status)" + "Values (: Title ,: Summary ,: Userid ,: CreateTime ,: publictime ,: updateTetime ,: status)";; Map <string, objet> param = new hashmap <> (); param.put ("title", article.getTitle ()); param.put ("Résumé", article.getsummary ()); param.put ("userId", article.getUserId ()); param.put ("statut", article.getStatus ()); param.put ("CreateEtime", article.getCreateTime ()); param.put ("CreateEtime", article.getCreateTime ()); param.put ("Public-temps", article.getPublicIMIME ()); param.put ("UpdateTime", article.GetUpDateTime ()); return (long) jdbctemplate.update (sql, param); }}Nous utilisons JUnit pour tester le code ci-dessus:
@Runwith (springjunit4classrunner.class) @springboottest (classes = application.class) public class publicledaOtest {@autowired private articledao articledao; @Test public void testiNsert () {Article Article = nouvel article (); Article.SetTitle ("Test Title"); Article.Setsummary ("Résumé des tests"); Article.SetUserId (1L); Article.SetStatus (1); Article.SetCreateTime (new Date ()); Article.SetUpDateTime (new Date ()); Article.SetPublicImIME (new Date ()); articledao.insertarticle (article); }}Pour soutenir le programme de test ci-dessus, vous devez également introduire un démarreur:
<dependency> <proupId> org.springframework.boot </prôdId> <ArtifactId> printemp-boot-starter-test </retifactid> <ccope> test </ccope> </Dependency>
D'après le code ci-dessus, nous pouvons voir qu'en fait, il n'y a essentiellement aucune configuration à l'exception de l'introduction de JDBC Start. Il s'agit du processus de configuration automatique de Spring Boot. Le code ci-dessus doit prêter attention à l'emplacement de la classe d'application. Cette classe doit être située dans le package parent de la classe DAO. Par exemple, DAO est situé dans le package com.pandy.blog.dao. Maintenant, nous déplaçons la classe Application.java du package com.pandy.blog vers le package com.pandy.blog, et l'erreur suivante apparaîtra:
Causées par: org.springframework.beans.factory.nosuchBeAndefinitionException: aucun bean de qualification de type 'com.pandy.blog.dao.articledao' disponible: attendu au moins 1 bean qui se qualifie comme candidat automatique. Annotations de dépendance: {@ org.springframework.beans.factory.annotation.Autowired (obligé = true)} sur org.springframework.beans.factory.support.defaultListableBeanfactory.RaisenomatchingBean org.springframework.beans.factory.support.defaultListableBeanfactory.Doresolvedependency (DefaultListableBeanFactory.java:1104) sur org.springframework.beans.factory.support.defaultListableBeanfactory.Revedependency (DefaultListableBeanFactor org.springframework.beans.factory.annotation.AutowiredannotationBeanPostProcessor $ AutowiredFieldElement.inject (AutowiredannotationBeanPostProcessor.java:585) ... 28 plusEn d'autres termes, la mise en œuvre d'Aticledao ne peut être trouvée. Quelle est la raison? Dans le billet de blog précédent, nous avons vu que l'annotation @springbootapplication hérite @componentscan, qui scanne uniquement les packages et les sous-packages où la classe d'application est située par défaut. Par conséquent, pour l'erreur ci-dessus, en plus de maintenir la classe d'application dans le package parent de DAO, vous pouvez également spécifier le package numérisé pour résoudre:
@ SpringbootApplication @ ComponentsCan ({"com.pandy.blog"}) Application de classe publique {public static void main (String [] args) lève une exception {SpringApplication.Run (application.class, args); }}3. Intégration avec JPA
Nous allons maintenant commencer à expliquer comment implémenter les opérations de base de données via JPA. Il est toujours similaire à JDBCTemplate. Tout d'abord, nous devons introduire le démarreur correspondant:
<dependency> <proupId> org.springframework.boot </rombasid> <ArtifactId> printemp-boot-starter-data-jpa </ artifactid> </dependency>
Ensuite, nous devons ajouter une annotation d'entité à la classe POJO et spécifier le nom de la table (s'il n'est pas spécifié, le nom de la table par défaut est l'article), puis nous devons spécifier l'ID et sa stratégie de génération. Ce sont toutes des connaissances JPA et n'ont rien à voir avec Spring Boot. Si vous ne le connaissez pas, vous pouvez consulter les points de connaissance JPA:
@Entity (name = "tb_article") Article de classe publique {@id @generatedvalue private long id; titre de chaîne privée; Résumé de la chaîne privée; Date privée CreateTime; DATE PRIVÉE publictif; Date privée UpdateTime; Private Long UserId; Statut entier privé;}Enfin, nous devons hériter de la classe JParePository. Ici, nous mettons en œuvre deux méthodes de requête. Le premier est une requête conforme à la spécification de dénomination JPA. JPA nous aidera automatiquement à terminer la génération de relevés de requête. L'autre moyen est d'implémenter JPQL (une requête de type SQL prise en charge par JPA).
Interface publique ArticleRepository étend JParePository <Article, Long> {public List <brack> findByUserId (Long UserId); @Query ("Select Art From com.pandy.blog.po.article Art Where Title =: Title") Public List <ReTist> QueryByTitle (@param ("Title") Titre de la chaîne);}Ok, nous pouvons à nouveau tester le code ci-dessus:
@Runwith (springjunit4classrunner.class) @springboottest (classes = application.class) classe publique ArticlePositoryTest {@autowired private articleRepository articleRepository; @Test public void testQuery () {list <Article> articlelist = articleRepository.QueryTitle ("Test Title"); assertTrue (articlelist.size ()> 0); }}Notez qu'il y a encore des problèmes similaires à JDBCTemplate ici. Vous devez faire la classe de démarrage de l'application pas dans le package parent de classes de respector et d'entité, sinon l'erreur suivante apparaîtra:
Causées par: org.springframework.beans.factory.nosuchBeAndefinitionException: aucun bean de qualification de type 'com.pandy.blog.dao.articlerepository' disponible: attendu au moins 1 bean qui se qualifie comme candidat automatique. Annotations de dépendance: {@ org.springframework.beans.factory.annotation.Autowired (obligé = true)} sur org.springframework.beans.factory.support.defaultListableBeanfactory.RaisenomatchingBean org.springframework.beans.factory.support.defaultListableBeanfactory.Doresolvedependency (DefaultListableBeanFactory.java:1104) sur org.springframework.beans.factory.support.defaultListableBeanfactory.Revedependency (DefaultListableBeanFactor org.springframework.beans.factory.annotation.AutowiredannotationBeanPostProcessor $ AutowiredFieldElement.inject (AutowiredannotationBeanPostProcessor.java:585) ... 28 plusBien sûr, vous pouvez également spécifier le package JPA numérisé en annotant @enablejParePositories, mais cela ne fonctionne toujours pas, et l'erreur suivante apparaît:
Causé par: java.lang.illegalargumentException: pas un type géré: classe com.pandy.blog.po.article à org.hibernate.jpa.internal.metamodel.metamodelimpl.ManagedType (métamodelimpl.java:210) org.springframework.data.jpa.repository.support.jpametamodentityinformation. <init> (jpametamodentityinformation.java:70) org.springframework.data.jpa.repository.support.jpaentityInformationsupport.gentityInformation (jpaentityInformationsupport.java:68) at org.springframework.data.jpa.repository.support.jParePositoryFactory.getEntityInformation (JParePositoryFactory.java:153) 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 (RepositoryFactorySupport.java:199) org.springframework.data.repository.core.support.repositoryfactoryBeanSupport.InitanDreturn (RepositoryFactoryBeanSupport.Java:277) at org.springframework.data.repository.core.support.repositoryfactoryBeanSupport.AfterPropertiesset (RepositoryFactoryBeanSupport.Java:263) at org.springframework.data.jpa.repository.support.jParePositoryFactoryBean.AfterPropertiseSet (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 Plus
Cette erreur indique que l'entité ne peut pas être reconnue, vous devez donc également spécifier le package d'entité en annotant @entityScan. La configuration finale est la suivante:
@ SpringbootApplication @ ComponentsCan ({"com.pandy.blog"}) @ enablejParepositiens (baspackages = "com.pandy.blog") @ entityscan ("com.pandy.blog") Application de classe publique {public static void main (string [] args) exception {SpringApplication.run (application.class, args); }}4. Intégration avec Mybatis
Enfin, examinons comment réaliser l'accès à la base de données via MyBatis. De même, nous devons encore présenter le démarreur:
<dependency> <proupId> org.mybatis.spring.boot </proupId> <Artifactid> Mybatis-Spring-boot-starter </ artifactId> <version> 1.1.1 </-version> </Dependance>
Étant donné que le démarreur n'est pas officiellement fourni par Spring Boot, le numéro de version est incompatible avec Spring Boot et doit être spécifié manuellement.
MyBatis peut généralement spécifier SQL qui exploite des bases de données via XML ou Annotations. Personnellement, je préfère XML, donc cet article ne montre que l'accès aux bases de données via XML. Tout d'abord, nous devons configurer le répertoire du mappeur. Nous le configurons dans Application.yml:
MyBatis: config-Locations: mybatis / mybatis-config.xml mappen-locations: mybatis / mapper / *. xml type-aliases-package: com.pandy.blog.po
La configuration ici comprend principalement trois parties, l'une est quelques configurations de MyBatis lui-même, tels que l'alias pour les types de base. La seconde consiste à spécifier l'emplacement du fichier de mappeur, et le troisième est l'alias de la classe POJO. Cette configuration peut également être implémentée via la configuration Java. En raison de problèmes d'espace, je n'expliquerai pas en détail ici. Les amis intéressés peuvent le mettre en œuvre par eux-mêmes.
Après la configuration, nous écrivons d'abord l'interface de mapper:
Interface publique Articlemapper {public long insertarticle (article d'article); public void updatearticule (article d'article); Article public QueryByid (Long ID); Liste publique <Re article> QueryarticlesByPage (@param ("article") Article Article, @param ("pagesize") int pagesize, @param ("offset") int offset);}Cette interface ne définit temporairement que quatre méthodes, à savoir l'ajout, la mise à jour et la requête en fonction de l'ID et de la pagination. Il s'agit d'une interface, et elle est similaire à JPA, vous ne pouvez donc pas implémenter des classes. Ensuite, nous écrivons un fichier XML:
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Mappep Public "- // Mybatis.org//dtd Mappen 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace = "com.pandy.blog.dao.articlemapper"> <resultmap id = "articlemap" type = "com.pandy.blog.po.article"> <id colonnel = "id" propriété = "id" jdbcType = "Integer" /> <result Column = "title" Property = "title" jdbctype = "Varse colonnen = "résumé" propriété = "résumé" jdbcType = "varChar" /> <résultat chronn = "user_id" propriété = "userId" jdbcType = "Integer" /> <résultat Column = "Status" propriété = "Status" JDBCTYPE = "INTERBCY" <résultat chronn = "update_time" propriété = "updateTime" jdbcType = "TimeStamp" /> <result Column = "public_time" Property = "Publictime" jdbcType = "TimeStamp" /> </ ResultMap> id = "insertarticle" ParameterType = "Article"> Insert dans la valeur tb_article (<include refid = "base_column" />) (# {title}, # {résumé}, # {userId}, # {status}, # {CreateTime}, # {updatetile}, # {publictime}) </ INSERTER> ParameterType = "Article"> Mise à jour tb_article <Set> <if test = "title! = null"> title = # {title}, </ if> <if test = "résumé! = null"> résumé = # {résumé}, </ if> <if test = "status! = null"> status = # {status}, </ if> <if Test = "PublicTIME! = Public_> Public_Time = Publicy = Publicy = Public # {publictime}, </ if> <if test = "updateTime! = null"> update_time = # {updateTime}, </f> </set> où id = # {id} </dated> <select id = "querybyid" ParametType = "long" ResultMap = "Articlemap"> SELECT id, <include refid = "base_columb" tb_article où id = # {id} </lect> <select id = "QueryarticlesByPage" resultMap = "artiCleMap"> SELECT ID, <inclure refid = "base_column"> </ include> depuis tb_article <où> <if test = "Article.Title! = NULL"> Titre comme concat ('%', $ {Article.Title}, "% ') </ If>', $ {Article.Title}, '%') </ If> ', $ {$ {Article.Title},'% ') </ If>', $ {$ {Article.Title}, '%') </ If> ', $ {$ {Article.Title},'% ') </ If>', $ {$ {Article.Title}, ''% ') </ Si test = "article.UserId! = null"> user_id = # {article.userid} </ if> </ where> limit # {offset}, # {pagesize} </lect> </naupper>Enfin, nous devons spécifier manuellement les packages scannés par le mappeur:
@ SpringbootApplication @ MAPPERSCAN ("com.pandy.blog.dao") Application de classe publique {public static void main (String [] args) lève une exception {SpringApplication.Run (application.class, args); }}Ok, l'intégration avec Mybatis est également terminée, le testons à nouveau:
@Runwith (springjunit4classrunner.class) @springboottest (classes = application.class) public class publicleMappestrest {@autowired private articlemapper mapper; @Test public void testiNsert () {Article Article = nouvel article (); Article.SetTitle ("Test Title 2"); Article.Setsummary ("Résumé du test 2"); Article.SetUserId (1L); Article.SetStatus (1); Article.SetCreateTime (new Date ()); Article.SetUpDateTime (new Date ()); Article.SetPublicImIME (new Date ()); Mapper.insertarticle (article); } @Test public void testMyBatiSQuery () {Article Article = Mappper.QueryById (1L); Assertnotnull (article); } @Test public void TESTUPDATE () {Article Article = MAPPPER.QueryById (1L); Article.SetPublicImIME (new Date ()); Article.SetUpDateTime (new Date ()); Article.SetStatus (2); Mappeur.UpdateAralicle (article); } @Test public void testQueryByPage () {Article Article = nouvel article (); Article.SetUserId (1L); List <article> list = mapper.QueryarticlesByPage (article, 10,0); assertTrue (list.size ()> 0); }}5. Résumé
Cet article montre l'intégration de Spring Boot avec JDBCTemplate, JPA et MyBatis. Dans l'ensemble, la configuration est relativement simple. Les élèves qui ont déjà effectué des configurations connexes devraient penser que c'est évident. Spring Boot nous a en effet fourni une grande aide à cet égard. Dans les articles suivants, nous n'utiliserons MyBatis que pour effectuer des opérations de base de données. Une autre chose à noter ici est que la requête de pagination de Mybatis est manuscrite ici. Cette pagination peut être terminée via des plug-ins pendant le développement formel, mais cela n'a rien à voir avec Spring Boot, donc cet article utilise temporairement cette méthode manuelle pour effectuer un traitement de pagination.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.