Maison >Java >javaDidacticiel >Comment SpringBoot intègre le framework JPA

Comment SpringBoot intègre le framework JPA

王林
王林avant
2023-05-19 09:52:501903parcourir

    1. Présentation de l'accès aux données Spring Boot

    Spring Data est un framework open source conçu pour simplifier l'accès aux bases de données et prend en charge les services cloud, fournis par Spring. Il s'agit d'un projet cadre qui comprend un grand nombre de solutions d'accès aux données pour les bases de données relationnelles et non relationnelles. Il est conçu pour nous permettre d'utiliser rapidement et facilement diverses technologies d'accès aux données. Par défaut, Spring Boot adopte la méthode d'intégration de Spring Data pour unifier la couche d'accès aux données. En ajoutant un grand nombre de configurations automatiques, en introduisant divers modèles d'accès aux données xxxTemplate et une interface de référentiel unifiée, cela simplifie le fonctionnement de la couche d'accès aux données.

    Spring Data prend en charge plusieurs types de bases de données. Spring Boot intègre et gère les bases de données prises en charge par Spring Data et fournit divers démarreurs de dépendances. Vous pouvez utiliser un tableau pour répertorier les démarreurs de dépendances de base de données couramment utilisés de Spring Boot.

    Nom Description
    mybatis-spring-boot-starter MyBatis starter
    mybatis-plus-boot-starter MyB Atis-Plus Launcher
    printemps -boot-starter-data-jpa Démarreur pour Spring Data JPA avec Hibernate
    spring-boot starter-data-redis Démarreur pour magasin de données clé-valeur Redis avec clients Spring Data Redis et Jedis
    spring-boot-starter-data-neo4j Base de données graphique Neo4j et démarreur pour Spring Data Neo4j
    spring-boot-starter-data-mongodb Démarreur pour MongoDB et Spring Data MongoDB

    2. Introduction à Spring Data JPA

    JPA (Java Persistence API, Java persistence API) est la spécification de persistance Java officiellement proposée par Sun. Elle fournit aux développeurs Java un outil de mappage objet/relationnel pour gérer Java. data vise à simplifier le travail de développement de persistance existant et à intégrer la technologie ORM (Object Relational Mapping, Object/Relational Mapping). Basé sur la spécification JPA, Spring Data exploite pleinement ses avantages et propose le module Spring Data JPA pour effectuer des opérations de persistance sur les données relationnelles ORM.

    Spring Data JPA est un ensemble de frameworks d'applications JPA encapsulés par Spring basés sur le framework ORM et les spécifications JPA. Il fournit des fonctions courantes telles que l'ajout, la suppression, la modification et la requête, permettant aux développeurs d'implémenter des opérations de données avec moins de code. facile à agrandir. Avant de présenter l'intégration de JPA par Spring Boot, présentons brièvement l'utilisation de base de Spring Data JPA.

    2.1 Écrire une classe d'entité ORM

    Le framework Spring Data JPA fonctionne sur des données avec des relations ORM, donc lorsque vous utilisez Spring Data JPA, vous devez d'abord écrire une classe d'entité à mapper avec la table de données et configurer la relation de mappage.

    @Entity(name = "t_comment")  // 设置ORM实体类,并指定映射的表名
    public class Discuss {
        @Id   // 表明映射对应的主键id
        @GeneratedValue(strategy = GenerationType.IDENTITY) // 设置主键自增策略
        @Column(name = "article_id")  // 指定映射的表字段名
        private Integer articleId;
        // Generate: Getter and Setter、toString()
    }

    Concernant le code ci-dessus, frère Yi vous donnera une brève explication des annotations utilisées.

    Utilisez l'annotation @Entity pour indiquer que vous souhaitez mapper la classe d'entité à la base de données. À ce stade, le nom de la table de la base de données est par défaut la première lettre du nom de la classe en minuscule. Bien entendu, vous pouvez également utiliser l'attribut name pour spécifier le nom de la table mappée.

    @ld : Marqué sur l'attribut de classe ou la méthode getter, indiquant qu'un certain attribut correspond à la clé primaire dans le tableau.

    L'annotation @GeneratedValue peut être omise. Elle est marquée à la même position que l'annotation @ld et sert à définir la stratégie de génération de clé primaire correspondant à l'attribut. Les stratégies de génération de clé primaire prises en charge par Spring Data JPA incluent TABLE (utiliser une table de base de données spécifique pour enregistrer la clé primaire), SEQUENCE (une stratégie de génération de clé primaire de base de données qui ne prend pas en charge l'auto-incrémentation de clé primaire), IDENTITY (auto-incrémentation de clé primaire). incrément) et AUTO (JPA sélectionne indépendamment les 3 premières stratégies appropriées, qui sont les options par défaut).

    Lorsque l'attribut de classe et le nom du champ de table sont différents, l'annotation @Column peut être utilisée en conjonction avec l'attribut de nom pour indiquer le nom du champ de table correspondant à l'attribut de classe.

    2.2 Interface d'écriture du référentiel

    Écrivez les interfaces de référentiel correspondantes pour différentes opérations de données de table et écrivez les méthodes d'opération de données correspondantes selon les besoins.

    public interface DiscussRepository extends JpaRepository<Discuss, Integer> {
        // 1.查询author非空的Discuss评论集合(JPA支持的方法名关键字查询方式)
        List<Discuss> findByAuthorNotNull();
        // 2.根据文章id分页查询Discuss评论集合
        @Query("SELECT c FROM t_comment c WHERE c.articleId = ?1")
        List<Discuss> getDiscussPaged(Integer articleid, Pageable pageable);
        // 3.使用元素SQL语句,根据文章id分页查询Discuss评论集合,nativeQuery为true表示用来编写原生SQL语句 
        @Query(value = "SELECT * FROM t_comment WHERE article_Id = ?1", nativeQuery = true)
        List<Discuss> getDiscussPaged2(Integer articleid, Pageable pageable);
        //4.根据评论id修改评论作者author
        @Transactional // 表示支持事务管理
        @Modifying // 表示支持数据变更
        @Query("UPDATE t_comment c SET c.author = ?1 WHERE c.id = ?2")
        Integer updateDiscuss(String author, Integer id);
        // 5.根据评论id删除评论
        @Transactional
        @Modifying
        @Query("DELETE t_comment c WHERE c.id = ?1")
        Integer deleteDiscuss(Integer id);
    }

    Frère Yi vous expliquera les exigences particulières lors de l'écriture de l'interface du référentiel.

    2.2.1 Hériter de l'interface XXRepositoryffbe4eed12645b467bc428156552ef14

    Lorsque nous utilisons Spring Data JPA pour personnaliser l'interface du référentiel, nous devons hériter de l'interface XXRepositoryffbe4eed12645b467bc428156552ef14, où T représente la classe d'entité à exploiter et ID représente la classe d'entité principale. type de données clé de la classe d’entité. Dans l'exemple ci-dessus, nous choisissons d'hériter de l'interface JpaRepository. La structure d'héritage de JpaRepository est illustrée dans la figure ci-dessous.

    Les interfaces impliquées dans la structure d'héritage de l'interface JpaRepository sont expliquées ci-dessous, comme suit.

    (1) Repository est l'interface parent de niveau supérieur fournie par Spring Data JPA pour personnaliser l'interface du Repository. Aucune méthode n'est déclarée dans cette interface.

    (2) L'interface CrudRepository est l'une des interfaces héritées de Repository et contient quelques méthodes CRUD de base.

    (3) L'interface PagingAndSortingRepository hérite de l'interface CrudRepository et fournit deux méthodes de pagination et de tri.

    (4) L'interface QueryByExampleExecutor est l'interface parent de niveau supérieur pour les requêtes encapsulées conditionnelles, permettant d'exécuter des requêtes conditionnelles complexes via des instances d'exemple.

    L'interface JpaRepository hérite à la fois de l'interface PagingAndSortingRepository et de l'interface QueryByExampleExecutor, et fournit des méthodes d'exploitation de données supplémentaires. Habituellement, lors de l'écriture d'un fichier d'interface Repository personnalisé, nous choisirons directement d'hériter de l'interface JpaRepository.

    2.2.2 Plusieurs façons d'exploiter les données

    Lors de l'utilisation de Spring Data JPA pour les opérations de données, il existe de nombreuses méthodes d'implémentation, les principales méthodes sont les suivantes.

    (1). Si l'interface personnalisée hérite de l'interface JpaRepository, elle inclut par défaut certaines méthodes CRUD couramment utilisées.

    (2). Dans l'interface du référentiel personnalisé, vous pouvez utiliser l'annotation @Query avec des instructions SQL pour vérifier, modifier et supprimer des données.

    (3). Dans l'interface du référentiel personnalisé, vous pouvez utiliser directement le mot-clé de nom de méthode pour effectuer des opérations de requête.

    Parmi eux, les mots-clés de nom de méthode pris en charge dans Spring Data JPA et les descriptions de fragments SQL correspondantes sont présentés dans le tableau suivant.

    2.2.3 Gestion des transactions @Transactional

    Dans l'interface du Repository personnalisé, pour les opérations de changement de données (modification, suppression), que l'annotation @Query soit utilisée ou non, l'annotation @Transactional doit être ajoutée au dessus de la méthode de gestion des transactions , sinon une InvalidDataAccessApiUsageException se produira pendant l'exécution du programme. Si l'annotation @Transactional a été ajoutée à la classe Service de la couche métier qui appelle la méthode d'interface Repository pour la gestion des transactions, l'annotation @Transactional peut être omise dans le fichier d'interface Repository.

    2.2.4 Annotation @Moditying

    Dans l'interface du Repository personnalisé, utilisez l'annotation @Query pour effectuer des opérations de modification de données (modification, suppression). En plus d'utiliser l'annotation @Query, vous devez également ajouter l'annotation @Moditying. indiquer les changements de données.

    2.3.5 Requête de condition complexe

    JPA prend également en charge l'utilisation d'exemples d'instances pour les requêtes de condition complexe. Par exemple, recherchez la méthode findAll(Example1eefd63bbe027a2807ccada294a3372c var1) existante dans l'interface JpaRepository.

    3. Utilisez Spring Boot pour intégrer JPA

    Utilisez Spring Boot pour intégrer JPA Les étapes spécifiques sont les suivantes.

    3.1 Ajouter un démarreur de dépendance Spring Data JPA

    Ajouter un démarreur de dépendance Spring Data JPA dans le fichier pom.xml du projet.

    Remarque :

    Nous n'avons pas écrit le numéro de version correspondant à Spring Data JPA. En effet, Spring Boot gère uniformément le numéro de version de Spring Data JPA.

    3.2 Écrire la classe d'entité ORM

    Pour faciliter l'opération, prenez la table de base de données t_comment créée précédemment comme exemple pour écrire la classe d'entité correspondante. Copiez la classe Comment créée précédemment et renommez-la en Discussions, et ajoutez les annotations correspondantes JPA pour. configuration de la cartographie.

    3.3 Écriture de l'interface du référentiel

    Créez une interface du référentiel DiscussRepository sous le package com.cy.repository pour faire fonctionner la table de base de données t_comment.

    3.4 Écrire des tests unitaires pour tester les méthodes d'interface

    Copiez la classe de test Chapter03ApplcationTests à l'emplacement actuel et renommez-la en JpaTests pour écrire des tests unitaires liés à JPA, et modifiez légèrement le contenu pour écrire la méthode de test correspondant à l'interface DiscussRepository.

    La méthode de test utilise la méthode par défaut JpaRepository, le mot-clé du nom de la méthode, l'annotation @Query et les paramètres encapsulés d'exemple pour effectuer des opérations sur les données.

    3.5 Test d'intégration

    Sélectionnez la méthode de test unitaire dans la classe de test JpaTests pour démontrer l'effet.

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer