Mysql
 sql >> Base de données >  >> RDS >> Mysql

Exemple Spring Boot CRUD avec MySQL

Cet exemple vous expliquera comment utiliser Spring Boot Data JPA pour implémenter l'opération d'insertion, de mise à jour, de suppression et de sélection de table de base de données sur la table de base de données MySQL. Avec les données de démarrage de printemps JPA, la commande d'opération de table de base de données a été enveloppée dans une méthode, il vous suffit de créer une interface Java qui étend l'interface de base du référentiel JPA de données de démarrage de printemps (par exemple CrudRepository ), alors il vous suffit de définir la méthode d'opération de la table de base de données (telle que findBy , supprimerPar, etc) dans l'interface de référentiel personnalisée, et le nom de la méthode doit suivre des règles de dénomination spéciales. Vous n'avez pas besoin d'écrire des commandes SQL dans l'interface du référentiel.

1. Créer une table de base de données MySQL.

  1. Créez une base de données MySQL avec le nom dev2qa_example . Le classement par défaut de la base de données devrait être utf8 – utf8_bin .
    CREATE SCHEMA `dev2qa_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
  2. Créer une table user_account dans le dev2qa_example ci-dessus base de données avec l'instruction SQL ci-dessous. L'identifiant la colonne doit être AI ( incrémentation automatique ), sinon une erreur Spring Boot JPA Table 'dbname.hibernate_sequence' Doesn't Exist sera générée.
    CREATE TABLE `dev2qa_example`.`user_account` (
      `id` INT NOT NULL AUTO_INCREMENT,
      `user_name` VARCHAR(100) NULL,
      `password` VARCHAR(100) NULL,
      `email` VARCHAR(100) NULL,
      PRIMARY KEY (`id`))
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_bin;
    

2. Créer un projet Spring Boot.

  1. Lancez la suite d'outils Spring, cliquez sur Fichier —> Nouveau —> Projet Spring Starter élément de menu à ouvrir ci-dessous Nouveau projet de démarrage de printemps sorcier. Saisissez les informations relatives au projet comme ci-dessous. Et cliquez sur le bouton Suivant.
  2. Ajouter JPA , MySQL, et Web bibliothèques dans l'assistant de dépendances. Et cliquez sur Terminer bouton pour terminer l'initialisation du projet.

3. Spring Boot JPA CRUD Exemple de fichiers de projet.

Vous trouverez ci-dessous les fichiers source de ce projet. Nous allons les présenter un par un.

C:\WORKSPACE\WORK\DEV2QA.COM-EXAMPLE-CODE\SPRINGBOOT\SPRINGBOOTCRUDMYSQL
│   pom.xml
└───src
    ├───main
    │   ├───java
    │   │   └───com
    │   │       └───dev2qa
    │   │           └───example
    │   │               │   SpringBootCrudMySqlApplication.java
    │   │               │
    │   │               ├───controller
    │   │               │       UserAccountController.java
    │   │               │
    │   │               ├───entity
    │   │               │       UserAccount.java
    │   │               │
    │   │               └───repository
    │   │                       UserAccountRepository.java
    │   │
    │   └───resources
    │           application.properties
    │
    └───test
        └───java
            └───com
                └───dev2qa
                        SpringBootCrudMySqlApplicationTests.java

3.1 SpringBootCrudMySqlApplication.java

Ceci est l'exemple de démarrage de printemps commençant la classe Java. Il sera chargé et exécuté en premier dans l'application Spring Boot.

package com.dev2qa.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

//@SpringBootApplication
@Configuration
@ComponentScan(basePackages = { "com.dev2qa.example" })
@EnableAutoConfiguration
public class SpringBootCrudMySqlApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootCrudMySqlApplication.class, args);
    }
}

3.2 UserAccountController.java

Il s'agit de la classe Java du contrôleur Spring MVC qui mappera l'URL de la demande de l'utilisateur à la méthode de traitement.

package com.dev2qa.example.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.dev2qa.example.entity.UserAccount;
import com.dev2qa.example.repository.UserAccountRepository;

@Controller
@RequestMapping(path = "/userAccount")
public class UserAccountController {

    @Autowired
    UserAccountRepository userAccountRepository;

    /*
     * Mapping url exmaple:
     * http://localhost:8080/userAccount/add?userName=Jerry&password=888888&email=
     * [email protected]
     * http://localhost:8080/userAccount/add?userName=Richard&password=888888&email=
     * [email protected]
     */
    @GetMapping(path = "/add")
    @ResponseBody
    public String addUser(@RequestParam String userName, @RequestParam String password, @RequestParam String email) {

        UserAccount userAccount = new UserAccount();
        userAccount.setUsername(userName);
        userAccount.setPassword(password);
        userAccount.setEmail(email);

        userAccountRepository.save(userAccount);

        String ret = "User account has been added, user name = " + userName + ", password = " + password + ", email = "
                + email;

        return ret;

    }

    /*
     * Mapping url exmaple: http://localhost:8080/userAccount/findAll
     */
    @GetMapping(path = "/findAll")
    @ResponseBody
    public String findAllUser() {

        StringBuffer retBuf = new StringBuffer();

        List<UserAccount> userAccountList = (List<UserAccount>) userAccountRepository.findAll();

        if (userAccountList != null) {
            for (UserAccount userAccount : userAccountList) {
                retBuf.append("user name = ");
                retBuf.append(userAccount.getUsername());
                retBuf.append(", password = ");
                retBuf.append(userAccount.getPassword());
                retBuf.append(", email = ");
                retBuf.append(userAccount.getEmail());
                retBuf.append("\r\n");
            }
        }

        if (retBuf.length() == 0) {
            retBuf.append("No record find.");
        } else {
            retBuf.insert(0, "<pre>");
            retBuf.append("</pre>");
        }

        return retBuf.toString();
    }

    /*
     * Mapping url exmaple:
     * http://localhost:8080/userAccount/findByName?userName=Jerry
     */
    @GetMapping(path = "/findByName")
    @ResponseBody
    public String findByName(@RequestParam String userName) {

        StringBuffer retBuf = new StringBuffer();

        List<UserAccount> userAccountList = (List<UserAccount>) userAccountRepository.findByUsername(userName);

        if (userAccountList != null) {
            for (UserAccount userAccount : userAccountList) {
                retBuf.append("user name = ");
                retBuf.append(userAccount.getUsername());
                retBuf.append(", password = ");
                retBuf.append(userAccount.getPassword());
                retBuf.append(", email = ");
                retBuf.append(userAccount.getEmail());
                retBuf.append("\r\n");
            }
        }

        if (retBuf.length() == 0) {
            retBuf.append("No record find.");
        }

        return retBuf.toString();
    }

    /*
     * Mapping url exmaple:
     * http://localhost:8080/userAccount/findByNameAndPassword?userName=Jerry&
     * password=888888
     */
    @GetMapping(path = "/findByNameAndPassword")
    @ResponseBody
    public String findByNameAndPassword(@RequestParam String userName, @RequestParam String password) {

        StringBuffer retBuf = new StringBuffer();

        List<UserAccount> userAccountList = (List<UserAccount>) userAccountRepository
                .findByUsernameAndPassword(userName, password);

        if (userAccountList != null) {
            for (UserAccount userAccount : userAccountList) {
                retBuf.append("user name = ");
                retBuf.append(userAccount.getUsername());
                retBuf.append(", password = ");
                retBuf.append(userAccount.getPassword());
                retBuf.append(", email = ");
                retBuf.append(userAccount.getEmail());
                retBuf.append("<br/>");
            }
        }

        if (retBuf.length() == 0) {
            retBuf.append("No record find.");
        }

        return retBuf.toString();
    }

    /*
     * Mapping url exmaple:
     * http://localhost:8080/userAccount/updateUser?userName=Jerry&password=hello&
     * [email protected]
     */
    @GetMapping(path = "/updateUser")
    @ResponseBody
    public String updateUser(@RequestParam String userName, @RequestParam String password, @RequestParam String email) {

        StringBuffer retBuf = new StringBuffer();

        List<UserAccount> userAccountList = userAccountRepository.findByUsername(userName);

        if (userAccountList != null) {
            for (UserAccount userAccount : userAccountList) {
                userAccount.setUsername(userName);
                userAccount.setPassword(password);
                userAccount.setEmail(email);
                userAccountRepository.save(userAccount);
            }
        }

        retBuf.append("User data update successfully.");

        return retBuf.toString();
    }

    /*
     * Mapping url exmaple:
     * http://localhost:8080/userAccount/deleteByUserName?userName=Richard
     */
    @GetMapping(path = "/deleteByUserName")
    @ResponseBody
    public String deleteByUserName(@RequestParam String userName) {

        StringBuffer retBuf = new StringBuffer();

        userAccountRepository.deleteByUsername(userName);

        retBuf.append("User data has been deleted successfully.");

        return retBuf.toString();
    }

    /*
     * Mapping url exmaple:
     * http://localhost:8080/userAccount/deleteByUserNameAndPassword?userName=
     * Richard&password=888888
     */
    @GetMapping(path = "/deleteByUserNameAndPassword")
    @ResponseBody
    public String deleteByUserNameAndPassword(@RequestParam String userName, @RequestParam String password) {

        StringBuffer retBuf = new StringBuffer();

        userAccountRepository.deleteByUsernameAndPassword(userName, password);

        retBuf.append("User data has been deleted successfully.");

        return retBuf.toString();
    }

}
"); } return retBuf.toString(); } /* * Exemple d'URL de mappage :* http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path ="/findByName") @ResponseBody public String findByName(@RequestParam String userName) { StringBuffer retBuf =nouveau StringBuffer(); List userAccountList =(List) userAccountRepository.findByUsername(userName); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("user name ="); retBuf.append(userAccount.getUsername()); retBuf.append(", mot de passe ="); retBuf.append(userAccount.getPassword()); retBuf.append(", email="); retBuf.append(userAccount.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() ==0) { retBuf.append("Aucun enregistrement trouvé."); } return retBuf.toString(); } /* * Exemple d'URL de mappage :* http://localhost:8080/userAccount/findByNameAndPassword?userName=Jerry&* password=888888 */ @GetMapping(path ="/findByNameAndPassword") @ResponseBody public String findByNameAndPassword(@RequestParam String userName , @RequestParam String mot de passe) { StringBuffer retBuf =new StringBuffer(); List userAccountList =(List) userAccountRepository .findByUsernameAndPassword(userName, password); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("user name ="); retBuf.append(userAccount.getUsername()); retBuf.append(", mot de passe ="); retBuf.append(userAccount.getPassword()); retBuf.append(", email="); retBuf.append(userAccount.getEmail()); retBuf.append("
"); } } if (retBuf.length() ==0) { retBuf.append("Aucun enregistrement trouvé."); } return retBuf.toString(); } /* * Exemple d'URL de mappage :* http://localhost:8080/userAccount/updateUser?userName=Jerry&password=hello&* [email protected] */ @GetMapping(path ="/updateUser") @ResponseBody public String updateUser( @RequestParam String nom d'utilisateur, @RequestParam String mot de passe, @RequestParam String email) { StringBuffer retBuf =new StringBuffer(); List userAccountList =userAccountRepository.findByUsername(userName); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { userAccount.setUsername(userName); userAccount.setPassword(mot de passe); userAccount.setEmail(email); userAccountRepository.save(userAccount); } } retBuf.append("Mise à jour des données utilisateur réussie."); return retBuf.toString(); } /* * Exemple d'URL de mappage :* http://localhost:8080/userAccount/deleteByUserName?userName=Richard */ @GetMapping(path ="/deleteByUserName") @ResponseBody public String deleteByUserName(@RequestParam String userName) { StringBuffer retBuf =nouveau StringBuffer(); userAccountRepository.deleteByUsername(userName); retBuf.append("Les données utilisateur ont été supprimées avec succès."); return retBuf.toString(); } /* * Exemple d'URL de mappage :* http://localhost:8080/userAccount/deleteByUserNameAndPassword?userName=* Richard&password=888888 */ @GetMapping(path ="/deleteByUserNameAndPassword") @ResponseBody public String deleteByUserNameAndPassword(@RequestParam String userName, @RequestParam Chaîne mot de passe) { StringBuffer retBuf =new StringBuffer(); userAccountRepository.deleteByUsernameAndPassword(userName, password); retBuf.append("Les données utilisateur ont été supprimées avec succès."); return retBuf.toString(); }}

3.3 Compteutilisateur.java

Il s'agit de la classe Java de l'entité qui sera mappée à la table MySQL user_account . Veuillez noter l'identifiant la stratégie de génération doit être GenerationType.IDENTITY , si vous utilisez Generation.AUTO et la colonne d'ID de table MySQL est définie sur l'auto-incrémentation, une erreur sera renvoyée.

package com.dev2qa.example.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/* Map this entity class to user_account table. */
@Entity(name = "user_account")
public class UserAccount {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @javax.persistence.Column(name = "user_name")
    private String username;

    private String password;

    private String email;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

3.4 UserAccountRepository.java

Il s'agit de l'interface de référentiel JPA de données de démarrage Spring personnalisée qui étend CrudRepository . Il vous suffit de définir les méthodes associées, puis le framework Spring exécutera automatiquement la commande SQL associée pour implémenter la méthode. Cela rend le codage plus rapide.

package com.dev2qa.example.repository;

import java.util.List;

import org.springframework.data.repository.CrudRepository;
import org.springframework.transaction.annotation.Transactional;

import com.dev2qa.example.entity.UserAccount;

public interface UserAccountRepository extends CrudRepository<UserAccount, Long> {

    /*
     * Get user list by user name. Please note the format should be
     * findBy<column_name>.
     */
    List<UserAccount> findByUsername(String username);

    /*
     * Get user list by user name and password. Please note the format should be
     * findBy<column_name_1>And<column_name_2>.
     */
    List<UserAccount> findByUsernameAndPassword(String username, String password);

    @Transactional
    void deleteByUsernameAndPassword(String username, String password);

    @Transactional
    void deleteByUsername(String username);

}

3.5 applications.propriétés

Il s'agit du fichier de ressources qui contient les données de connexion à la source de données MySQL JDBC utilisées par l'exemple.

# MySQL jdbc connection url.
spring.datasource.url=jdbc:mysql://localhost:3306/dev2qa_example
# MySQL jdbc driver class name.
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
# MySQL database username and password
spring.datasource.username=root
spring.datasource.password=root

3.6 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>SpringBootCRUDMySQL</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>SpringBootCRUDMySQL</name>
    <description>Spring boot access mysql with crud operation.</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.7 Exécutez l'exemple.

  1. Cliquez avec le bouton droit sur le nom du projet.
  2. Cliquez sur Exécuter en tant que —> Spring Boot App élément de menu dans la liste du menu contextuel.
  3. Après le démarrage de l'application, saisissez l'URL de mappage pour le UserAccountController associé méthode de classe Java dans un navigateur Web pour voir le résultat.

4. Questions et réponses.

4.1 Les méthodes de démarrage Spring findAll, findById, deleteById renvoient toutes des résultats vides.

  1. Je veux utiliser Spring boot + MySQL pour implémenter une application REST qui effectuera des actions CRUD pour manipuler une table MySQL. Mais je trouve quand j'exécute le findAll() méthode, elle renvoie une liste vide, ce n'est pas ce que j'attends. Lorsque j'exécute le findById() méthode, elle renvoie le message d'erreur java.util.NoSuchElementException :Aucune valeur présente . Et quand j'effectue une action de suppression par la méthode de démarrage de printemps deleteById() , il me dit aussi que Aucune entité de classe org.dev2qa.entity.Article avec l'id 10 n'existe ! Il semble que ma table de base de données soit vide, mais ce n'est pas le cas. Dans quel cas ces erreurs peuvent-elles se produire ?
  2. Ma classe de référentiel personnalisé étend le JpaRepository classe, et son findAll() renvoie également une liste vide. Ma base de données est également la base de données MySql. Lorsque j'ajoute un enregistrement dans la base de données MySQL, le findAll() méthode renvoie [{}] , et lorsque j'ajoute deux enregistrements dans la base de données MySQL, le findAll() méthode renvoie [{},{}] . Le numéro d'élément de la liste est correct mais les données de l'élément sont vides, ce n'est pas correct. Est-ce que quelqu'un peut m'aider? Merci beaucoup.
  3. Si les propriétés de votre classe d'entité ne sont pas publiques, cette erreur peut se produire. Vous devez d'abord déclarer les propriétés de la classe d'entité avec le @Column L'annotation et la déclaration des propriétés peuvent être privées, puis ajoutez la méthode getters et setters à ces propriétés et rendez la méthode getters et setters publique. Après cela, le JpaRepository peut créer un objet entité et remplir les propriétés de l'objet avec les données lues à partir de la base de données MySQL. Et votre findAll() méthode ne retournera pas du tout une liste vide.

Référence

  1. Comment installer MySQL sur Ubuntu
  2. Résoudre l'erreur "dbname.hibernate_sequence" n'existe pas dans la table Spring Boot JPA