Mysql
 sql >> Database >  >> RDS >> Mysql

Esempio CRUD Spring Boot con MySQL

Questo esempio ti spiegherà come utilizzare i dati di avvio primaverile JPA per implementare l'operazione di inserimento, aggiornamento, eliminazione e selezione della tabella del database sulla tabella del database MySQL. Con i dati di avvio primaverile JPA il comando operativo della tabella del database è stato inserito in un metodo, devi solo creare un'interfaccia java che estenda l'interfaccia del repository JPA dei dati di avvio primaverili di base (ad esempio CrudRepository ), quindi devi solo definire il metodo operativo della tabella del database (come findBy , deleteBy, ecc.) nell'interfaccia Repository personalizzata e il nome del metodo deve seguire regole di denominazione speciali. Non è necessario scrivere comandi SQL nell'interfaccia Repository.

1. Crea una tabella del database MySQL.

  1. Crea un database MySQL con il nome dev2qa_example . Le confrontazioni predefinite del database dovrebbe essere utf8 – utf8_bin .
    CREATE SCHEMA `dev2qa_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
  2. Crea una tabella account_utente in dev2qa_example sopra database con la seguente istruzione SQL. L'id la colonna dovrebbe essere AI ( incremento automatico ), altrimenti verrà generata una tabella JPA Spring Boot di errore 'dbname.hibernate_sequence' non esiste.
    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. Crea progetto Spring Boot.

  1. Avvia la suite di strumenti Spring, fai clic su File —> Nuovo —> Progetto Spring Starter voce di menu da aprire sotto New Spring Starter Project procedura guidata. Inserisci le informazioni relative al progetto come di seguito. E fai clic sul pulsante Avanti.
  2. Aggiungi APP , MySQL, e Web librerie nella procedura guidata delle dipendenze. E fai clic su Fine per completare l'inizializzazione del progetto.

3. File di progetto di esempio di Spring Boot JPA CRUD.

Di seguito sono riportati i file di origine in questo progetto. Li presenteremo uno per uno.

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

Questo è l'esempio di avvio primaverile che avvia la classe java. Verrà caricato ed eseguito per primo nell'applicazione 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

Questa è la classe java del controller MVC di primavera che mapperà l'URL della richiesta dell'utente al metodo di elaborazione.

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();
    }

}
"); } restituisce retBuf.toString(); } /* * Esempio di mappatura dell'URL:* http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path ="/findByName") @ResponseBody public String findByName(@RequestParam String userName) { StringBuffer retBuf =nuovo StringBuffer(); List userAccountList =(List) userAccountRepository.findByUsername(userName); if (userAccountList !=null) { for (UserAccount userAccount:userAccountList) { retBuf.append ("nome utente ="); 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("Nessun record trovato."); } restituisce retBuf.toString(); } /* * Esempio di mappatura dell'URL:* http://localhost:8080/userAccount/findByNameAndPassword?userName=Jerry&* password=888888 */ @GetMapping(path ="/findByNameAndPassword") @ResponseBody public String findByNameAndPassword(@RequestParam String userName , @RequestParam Stringa password) { StringBuffer retBuf =new StringBuffer(); List userAccountList =(List) userAccountRepository .findByUsernameAndPassword(userName, password); if (userAccountList !=null) { for (UserAccount userAccount:userAccountList) { retBuf.append ("nome utente ="); retBuf.append(userAccount.getUsername()); retBuf.append(", password ="); retBuf.append(userAccount.getPassword()); retBuf.append(", email ="); retBuf.append(userAccount.getEmail()); retBuf.append("
"); } } if (retBuf.length() ==0) { retBuf.append("Nessun record trovato."); } restituisce retBuf.toString(); } /* * Esempio di mappatura dell'URL:* 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 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("Aggiornamento dati utente riuscito."); restituisce retBuf.toString(); } /* * Esempio di mappatura dell'URL:* http://localhost:8080/userAccount/deleteByUserName?userName=Richard */ @GetMapping(path ="/deleteByUserName") @ResponseBody public String deleteByUserName(@RequestParam String userName) { StringBuffer retBuf =nuovo StringBuffer(); userAccountRepository.deleteByUsername(userName); retBuf.append("I dati dell'utente sono stati cancellati con successo."); restituisce retBuf.toString(); } /* * Esempio di mappatura dell'URL:* 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(nomeutente, password); retBuf.append("I dati dell'utente sono stati cancellati con successo."); restituisce retBuf.toString(); }}

3.3 UserAccount.java

Questa è la classe java dell'entità che verrà mappata sulla tabella MySQL user_account . Si prega di notare l'id la strategia di generazione deve essere GenerationType.IDENTITY , se utilizzi Generazione.AUTO e la colonna dell'ID della tabella MySQL è impostata sull'incremento automatico, verrà generato un errore.

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

Questa è l'interfaccia del repository JPA dei dati di avvio primaverile personalizzata che estende CrudRepository . Devi solo definire i metodi correlati, quindi il framework di primavera eseguirà automaticamente il relativo comando SQL per implementare il metodo. Ciò rende la codifica più rapida.

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 proprietà.applicazione

Questo è il file di risorse che contiene i dati di connessione all'origine dati JDBC MySQL utilizzati dall'esempio.

# 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 Esegui l'esempio.

  1. Fai clic con il pulsante destro del mouse sul nome del progetto.
  2. Fai clic su Esegui come —> App Spring Boot voce di menu dall'elenco dei menu a comparsa.
  3. Dopo l'avvio dell'applicazione, inserisci l'URL di mappatura per il relativo UserAccountController metodo della classe java in un browser web per vedere il risultato.

4. Domanda e risposta.

4.1 I metodi di avvio primaverili findAll, findById, deleteById all restituiscono risultati vuoti.

  1. Voglio usare Spring boot + MySQL per implementare un'applicazione REST che eseguirà azioni CRUD per manipolare una tabella MySQL. Ma trovo quando eseguo findAll() metodo, restituisce un elenco vuoto, questo non è quello che mi aspetto. Quando eseguo findById() metodo, restituisce il messaggio di errore java.util.NoSuchElementException:nessun valore presente . E quando eseguo un'azione di eliminazione con il metodo di avvio primaverile deleteById() , mi dice anche che Non esiste alcuna entità di classe org.dev2qa.entity.Article con ID 10 ! Sembra che la mia tabella del database sia vuota ma non lo è. In che caso possono verificarsi questi errori?
  2. La mia classe di repository personalizzata estende JpaRepository class e il relativo findAll() il metodo restituisce anche un elenco vuoto. Il mio database è anche il database MySql. Quando aggiungo un record nel database MySQL, findAll() metodo di ritorno [{}] e quando aggiungo due record nel database MySQL, findAll() metodo di ritorno [{},{}] . Il numero dell'elemento dell'elenco è corretto ma i dati dell'elemento sono vuoti, questo non è corretto. Qualcuno può darmi un aiuto? Grazie mille.
  3. Se le proprietà della tua classe di entità non sono pubbliche, potrebbe verificarsi questo errore. Devi prima dichiarare le proprietà della classe di entità con @Column l'annotazione e la dichiarazione delle proprietà possono essere private, quindi aggiungere il metodo getter e setter a tali proprietà e rendere pubblico il metodo getter e setter. Successivamente, JpaRepository può creare un oggetto entità e popolare le proprietà dell'oggetto con i dati letti dal database MySQL. E il tuo findAll() il metodo non restituirà affatto un elenco vuoto.

Riferimento

  1. Come installare MySQL su Ubuntu
  2. Risolvi l'errore della tabella JPA di Spring Boot "dbname.hibernate_sequence"