[JAVA] Connectez-vous à la base de données avec spring boot + spring jpa et effectuez l'opération CRUD

introduction

environnement

Données à traiter

nom de l'article Moule La description
id int ID unique au tweet
name String Le nom de la personne qui a tweeté
message String Contenu du Tweet

Image de l'API à créer

url Méthode HTTP La description
/tweet POST Enregistrez le tweet
/tweet GET Recevoir tous les tweets
/tweet/{id} PUT Mettez à jour le tweet avec l'ID spécifié
/tweet/{id} DELETE Supprimer le tweet avec l'ID spécifié

Configuration du package

--Cette fois, nous allons créer le code avec la structure de package suivante

src/main/java/com/example/api
.
├── ApiApplication.java
├── model
│   └── Tweet.java
├── repository
│   └── TweetRepository.java
├── service
│   └── TweetService.java
└── controller
    └── TweetController.java

--model: Représente une entité (les données à traiter) --repository: accès à la base de données --service: exécuter la logique métier --controller: traiter la demande / réponse du client

paramètres build.gradle

--Ajouter une bibliothèque pour faciliter l'échange de données avec la base de données --Ajoutez ce qui suit aux dépendances de build.gradle

build.gradle


	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'mysql:mysql-connector-java'

	compileOnly 'org.projectlombok:lombok:1.18.8'
	annotationProcessor 'org.projectlombok:lombok:1.18.8'

Paramètres de connexion à la base de données

--Créez ʻapplication.properties ou ʻapplication.yml sous src / main / resources et entrez les informations de la base de données à laquelle se connecter.

application.yml


spring:
  datasource:
    sqlScriptEncoding: UTF-8
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/testdb?useSSL=false&requireSSL=false
    username: root
    password: hoge
  #Évitez d'initialiser la base de données au démarrage de l'application
  jpa:
    hibernate:
      ddl-auto: update
    #Résolution du problème selon lequel une table ne peut pas être créée dans le DB au démarrage de Spring Boot
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL57Dialect
logging:
  level:
    sql: debug
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table tweet (tweet varchar(255) not null, primary key (tweet)) engine=MyISAM" via JDBC Statement
...(Omis)...
Caused by: java.sql.SQLSyntaxErrorException: Specified key was too long; max key length is 1000 bytes
...(Omis)...

Create / Read

Créer un modèle

--Créez une classe qui représente le tweet lui-même sous le package model

Tweet.java


package com.example.api.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "tweet")
public class Tweet {
    @Id
    @GeneratedValue
    private int id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String message;
}

-- @ Entity: indique que l'entité est une entité JPA (un objet enregistré dans la base de données). -- @Data / @NoArgsConstructor / @ AllArgsConstructor: Annotation de lombok. Créez automatiquement un getter, un setter, un constructeur, etc. --@ Table (name = "tweet"): Spécifiez le nom de la table correspondant à l'entité -- @ Id: Annotation indiquant qu'il s'agit de la clé primaire de l'entité -- @ GeneratedValue: Avec cela, DB numérotera automatiquement. --@ Column (nullable = false): Une annotation donnée à une colonne DB. Vous pouvez définir si vous souhaitez autoriser null avec l'option nullable

Créer un référentiel

--Créez une classe de référentiel sous le package repository

TweetRepository.java


package com.example.api.repository;

import com.example.api.model.Tweet;
import org.springframework.data.jpa.repository.JpaRepository;

public interface TweetRepository extends JpaRepository<Tweet, Integer> {}

Créer un service

--Créez une classe de service sous le package service

TweetService.java


package com.example.api.service;

import com.example.api.model.Tweet;
import com.example.api.repository.TweetRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
public class TweetService {
    @Autowired
    TweetRepository tweetRepository;

    public Tweet postTweet(Tweet tweet) {
        return tweetRepository.save(tweet);
    }

    public List<Tweet> getTweet() {
        return tweetRepository.findAll();
    }
}

-- @ Service: spring Indique que la classe de service est MVC. Cible de DI (injection de dépendance) -- @ Transactional: Annotation pour le contrôle des transactions -- @ Autowired: Annotation attachée à la cible d'injection du conteneur DI

Créer un contrôleur

--Créez une classe de contrôleur sous le paquet controller

TweetController.java


package com.example.api.controller;

import com.example.api.model.Tweet;
import com.example.api.service.TweetService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("tweet")
public class TweetController {
    @Autowired
    TweetService tweetService;

    @RequestMapping(method = RequestMethod.POST)
    Tweet postTweet(@RequestBody Tweet tweet) {
        return tweetService.postTweet(tweet);
    }

    @RequestMapping(method = RequestMethod.GET)
    List<Tweet> getTweet() {
        return tweetService.getTweet();
    }
}

-- @ RestController: Annotation donnée à la classe de contrôleur --@ RequestMapping (): Une annotation pour accepter les requêtes HTTP. Spécifiez le chemin pour accepter la requête et la méthode HTTP -- @ RequestBody: Une annotation qui mappe le corps d'une demande à un objet spécifié

Contrôle de fonctionnement

# post request
$ curl -X POST -H 'Content-Type:application/json' -d '{"name":"Nom", "message":"message"}' localhost:8080/tweet

# response
{"id":1,"name":"Nom","message":"message"}

--Vérifiez la base de données et c'est OK si le contenu demandé est enregistré

mysql> select * from tweet;
+----+-----------------+--------+
| id | message         | name   |
+----+-----------------+--------+
|  1 |message|Nom|
+----+-----------------+--------+
1 row in set (0.01 sec)
# get request
curl -X GET -H 'Content-Type:application/json' localhost:8080/tweet

# response
[{"id":1,"name":"Nom","message":"message"}]

Update / Delete

service de réparation

--Ajoutez la méthode suivante dans la classe de TweetService.java

TweetService.java


    public Tweet updateTweet(Tweet tweet) {
        return tweetRepository.save(tweet);
    }

    public void deleteTweet(Integer id) {
        tweetRepository.deleteById(id);
    }

--update utilise la même méthode save () que create --delete utilise la méthode deleteById () pour supprimer l'entité spécifiée par id

Contrôleur fixe

--Ajoutez la méthode suivante dans la classe de TweetController.java

TweetController.java


    @RequestMapping(value = "{id}", method = RequestMethod.PUT)
    Tweet putTweet(@PathVariable("id") Integer id, @RequestBody Tweet tweet) {
        tweet.setId(id);
        return tweetService.updateTweet(tweet);
    }

    @RequestMapping(value = "{id}", method = RequestMethod.DELETE)
    void deleteTweet(@PathVariable("id") Integer id) {
        tweetService.deleteTweet(id);
    }

--Spécifiez {id} dans l'option de valeur de @ RequestMapping et définissez la méthode correspondante à appeler à la demande de / tweet / {id}.

Contrôle de fonctionnement

# put request
$ curl -X PUT -H 'Content-Type:application/json' -d '{"name":"Nom mis à jour", "message":"Message mis à jour"}' localhost:8080/tweet/1

# response
{"id":1,"name":"Nom mis à jour","message":"Message mis à jour"}

--Vérifiez la base de données et assurez-vous que les données sont mises à jour

mysql> select * from tweet;
+----+-----------------------------+--------------------+
| id | message                     | name               |
+----+-----------------------------+--------------------+
|  1 |Message mis à jour|Nom mis à jour|
+----+-----------------------------+--------------------+
1 row in set (0.01 sec)

--Enfin, exécutez la commande suivante à partir du terminal pour confirmer la suppression des données.

# delete request
curl -X DELETE -H 'Content-Type:application/json' localhost:8080/tweet/1

#pas de réponse
mysql> select * from tweet;
Empty set (0.00 sec)

référence

Recommended Posts

Connectez-vous à la base de données avec spring boot + spring jpa et effectuez l'opération CRUD
Tentative de SSR Vue.js avec Spring Boot et GraalJS
Connectez Spring Boot et Angular en toute sécurité avec OpenAPI Generator
Liaison de base de données avec doma2 (Spring boot)
Implémenter l'API REST avec Spring Boot et JPA (Application Layer)
Implémenter l'API REST avec Spring Boot et JPA (couche d'infrastructure)
Jusqu'à INSERT et SELECT sur Postgres avec botte de printemps et feuille de thym
Implémenter l'API REST avec Spring Boot et JPA (Domain Layer Edition)
8 choses à insérer dans DB en utilisant Spring Boot et JPA
HTTPS avec Spring Boot et Let's Encrypt
Implémenter CRUD avec Spring Boot + Thymeleaf + MySQL
Ajoutez une botte de printemps et un dégradé à éclipse
Méthode d'implémentation pour source multi-données avec Spring boot (Mybatis et Spring Data JPA)
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment utiliser h2db intégré avec Spring Boot
Essayez d'implémenter la fonction de connexion avec Spring Boot
Créez une application CRUD avec Spring Boot 2 + Thymeleaf + MyBatis
Essayez d'automatiser la migration avec Spring Boot Flyway
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Je voulais classer la botte à ressort dans un multi-projet
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Télécharger avec Spring Boot
Paramètres de connexion à MySQL avec Spring Boot + Spring JDBC
Test des entités et référentiels JPA à l'aide de Spring Boot @DataJpaTest
Essayez d'utiliser un conteneur DI avec Laravel et Spring Boot
Changer d'environnement avec Spring Boot application.properties et l'annotation @Profile
Mappez automatiquement DTO aux entités avec l'API Spring Boot
Essayez d'utiliser OpenID Connect avec Keycloak (application Spring Boot)
Mémo d'utilisation de Spring Security: coopération avec Spring MVC et Boot
J'ai démarré MySQL 5.7 avec docker-compose et j'ai essayé de me connecter
Spring Boot avec les paramètres du filtre de sécurité Spring et les points addictifs
J'ai essayé de démarrer avec Spring Data JPA
Comment démarrer par environnement avec Spring Boot de Maven
Création d'un environnement de base de données avec Docker dans Spring Boot (IntellJ)
Sortez le journal d'accès Tomcat intégré à la sortie standard avec Spring Boot
Essayez Spring Boot de 0 à 100.
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Implémenter GraphQL avec Spring Boot
Gérez l'API de date et d'heure Java 8 avec Thymeleaf avec Spring Boot
J'ai essayé le guide d'introduction de Spring Boot [Accès aux données avec JPA]
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Découpez SQL en fichier de propriété avec jdbcTemplate of spring boot
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Introduction à Spring Boot ① ~ DI ~
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Introduction à Spring Boot ② ~ AOP ~
Comment appeler et utiliser l'API en Java (Spring Boot)
Connectez-vous à DB avec Java
Connectez-vous à MySQL 8 avec Java
Spring Boot à partir de Docker
Flux jusqu'à la sortie des données de la table à afficher avec Spring Boot
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Avec Spring Boot, hachez le mot de passe et utilisez l'enregistrement des membres et la sécurité Spring pour implémenter la fonction de connexion.
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot