Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Spring Boot CRUD-Beispiel mit MySQL

In diesem Beispiel erfahren Sie, wie Sie Spring Boot Data JPA verwenden, um Operationen zum Einfügen, Aktualisieren, Löschen und Auswählen von Datenbanktabellen in MySQL-Datenbanktabellen zu implementieren. Mit Spring Boot Data JPA wurde der Datenbanktabellen-Operationsbefehl in eine Methode verpackt, Sie müssen nur eine Java-Schnittstelle erstellen, die die grundlegende Spring Boot Data JPA-Repository-Schnittstelle erweitert (z. B. CrudRepository ), dann müssen Sie nur die Datenbanktabellen-Operationsmethode definieren (z. B. findBy , deleteBy, usw.) in der benutzerdefinierten Repository-Schnittstelle, und der Methodenname muss speziellen Benennungsregeln folgen. Sie müssen keine SQL-Befehle in der Repository-Schnittstelle schreiben.

1. MySQL-Datenbanktabelle erstellen.

  1. Erstellen Sie eine MySQL-Datenbank mit dem Namen dev2qa_example . Die Standardsortierung der Datenbank sollte utf8 – utf8_bin sein .
    CREATE SCHEMA `dev2qa_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
  2. Erstellen Sie eine Tabelle user_account im obigen dev2qa_example Datenbank mit der folgenden SQL-Anweisung. Die ID Spalte sollte AI sein ( Inkrement automatisieren ), andernfalls wird ein Fehler Spring Boot JPA Table 'dbname.hibernate_sequence' Doesn't Exist ausgegeben.
    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. Spring Boot-Projekt erstellen.

  1. Starten Sie die Spring Tool Suite, klicken Sie auf Datei –> Neu –> Spring Starter-Projekt Menüpunkt zum Öffnen unter New Spring Starter Project Magier. Geben Sie verwandte Projektinformationen wie unten ein. Und klicken Sie auf die Schaltfläche Weiter.
  2. Fügen Sie JPA hinzu , MySQL, und Web Bibliotheken im Assistenten für Abhängigkeiten. Und klicken Sie auf Fertig stellen Schaltfläche, um die Projektinitialisierung abzuschließen.

3. Spring Boot JPA CRUD-Beispielprojektdateien.

Unten sind die Quelldateien in diesem Projekt. Wir werden sie nach und nach vorstellen.

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

Dies ist das Spring-Boot-Beispiel, das mit der Java-Klasse beginnt. Es wird zuerst in der Spring Boot-Anwendung geladen und ausgeführt.

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

Dies ist die Spring-MVC-Controller-Java-Klasse, die die Benutzeranforderungs-URL der Verarbeitungsmethode zuordnet.

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

}
"); } Rückgabe retBuf.toString(); } /* * Beispiel einer Zuordnungs-URL:* http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path ="/findByName") @ResponseBody public String findByName(@RequestParam String userName) { StringBuffer retBuf =neuer StringBuffer(); List userAccountList =(List) userAccountRepository.findByUsername(userName); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("user name ="); retBuf.append(userAccount.getUsername()); retBuf.append(", Passwort ="); retBuf.append(userAccount.getPassword()); retBuf.append(", email ="); retBuf.append(userAccount.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() ==0) { retBuf.append("Kein Datensatz gefunden."); } Rückgabe retBuf.toString(); } /* * Beispiel einer Zuordnungs-URL:* http://localhost:8080/userAccount/findByNameAndPassword?userName=Jerry&* password=888888 */ @GetMapping(path ="/findByNameAndPassword") @ResponseBody public String findByNameAndPassword(@RequestParam String userName , @RequestParam String-Passwort) { 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(", Passwort ="); retBuf.append(userAccount.getPassword()); retBuf.append(", email ="); retBuf.append(userAccount.getEmail()); retBuf.append("
"); } } if (retBuf.length() ==0) { retBuf.append("Kein Datensatz gefunden."); } Rückgabe retBuf.toString(); } /* * Beispiel einer Zuordnungs-URL:* http://localhost:8080/userAccount/updateUser?userName=Jerry&password=hello&* [email protected] */ @GetMapping(path ="/updateUser") @ResponseBody public String updateUser( @RequestParam String Benutzername, @RequestParam String Passwort, @RequestParam String E-Mail) { StringBuffer retBuf =new StringBuffer(); List userAccountList =userAccountRepository.findByUsername(userName); if (userAccountList !=null) {for (UserAccount userAccount:userAccountList) { userAccount.setUsername(userName); userAccount.setPassword (Passwort); userAccount.setEmail (E-Mail); userAccountRepository.save (Benutzerkonto); } } retBuf.append("Aktualisierung der Benutzerdaten erfolgreich."); Rückgabe retBuf.toString(); } /* * Beispiel einer Zuordnungs-URL:* http://localhost:8080/userAccount/deleteByUserName?userName=Richard */ @GetMapping(path ="/deleteByUserName") @ResponseBody public String deleteByUserName(@RequestParam String userName) { StringBuffer retBuf =neuer StringBuffer(); userAccountRepository.deleteByUsername (Benutzername); retBuf.append("Benutzerdaten wurden erfolgreich gelöscht."); Rückgabe retBuf.toString(); } /* * Beispiel einer Zuordnungs-URL:* http://localhost:8080/userAccount/deleteByUserNameAndPassword?userName=* Richard&password=888888 */ @GetMapping(path ="/deleteByUserNameAndPassword") @ResponseBody public String deleteByUserNameAndPassword(@RequestParam String userName, @RequestParam String-Passwort) { StringBuffer retBuf =new StringBuffer(); userAccountRepository.deleteByUsernameAndPassword (Benutzername, Passwort); retBuf.append("Benutzerdaten wurden erfolgreich gelöscht."); Rückgabe retBuf.toString(); }}

3.3 UserAccount.java

Dies ist die Entitäts-Java-Klasse, die der MySQL-Tabelle user_account zugeordnet wird . Bitte beachten Sie die id generate-Strategie muss GenerationType.IDENTITY sein , wenn Sie Generation.AUTO verwenden und die MySQL-Tabellen-ID-Spalte auf automatisches Inkrement gesetzt ist, wird ein Fehler ausgegeben.

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

Dies ist die benutzerdefinierte JPA-Repository-Schnittstelle für Spring Boot-Daten, die CrudRepository erweitert . Sie müssen nur verwandte Methoden definieren, dann führt das Spring-Framework automatisch den zugehörigen SQL-Befehl aus, um die Methode zu implementieren. Dadurch wird das Codieren schneller.

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 application.properties

Dies ist die Ressourcendatei, die Verbindungsdaten der MySQL-JDBC-Datenquelle enthält, die vom Beispiel verwendet werden.

# 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 Führen Sie das Beispiel aus.

  1. Klicken Sie mit der rechten Maustaste auf den Projektnamen.
  2. Klicken Sie auf Ausführen als —> Spring Boot App Menüpunkt aus der Popup-Menüliste.
  3. Geben Sie nach dem Start der Anwendung die Zuordnungs-URL für den zugehörigen UserAccountController ein Java-Klassenmethode in einem Webbrowser, um das Ergebnis anzuzeigen.

4. Frage &Antwort.

4.1 Spring-Boot-Methoden findAll, findById, deleteById geben alle leere Ergebnisse zurück.

  1. Ich möchte Spring Boot + MySQL verwenden, um eine REST-Anwendung zu implementieren, die CRUD-Aktionen zum Bearbeiten einer MySQL-Tabelle ausführt. Aber ich finde, wenn ich findAll() ausführe Methode, es gibt eine leere Liste zurück, das ist nicht das, was ich erwarte. Wenn ich findById() ausführe -Methode gibt sie die Fehlermeldung java.util.NoSuchElementException:No value present zurück . Und wenn ich eine Löschaktion durch die Spring-Boot-Methode deleteById() ausführe , es sagt mir auch, dass Keine Klasse org.dev2qa.entity.Article-Entität mit der ID 10 existiert ! Es scheint, dass meine Datenbanktabelle leer ist, aber das ist es nicht. In welchen Fällen können diese Fehler auftreten?
  2. Meine benutzerdefinierte Repository-Klasse erweitert das JpaRepository Klasse und ihr findAll() -Methode gibt auch eine leere Liste zurück. Meine Datenbank ist auch die MySql-Datenbank. Wenn ich einen Eintrag in der MySQL-Datenbank hinzufüge, findAll() Methodenrückgabe [{}] , und wenn ich zwei Einträge in der MySQL-Datenbank hinzufüge, die findAll() Methodenrückgabe [{},{}] . Die Listenelementnummer ist korrekt, aber die Elementdaten sind leer, dies ist nicht korrekt. Kann mir jemand helfen? Vielen Dank.
  3. Wenn die Eigenschaften Ihrer Entitätsklasse nicht öffentlich sind, kann dieser Fehler auftreten. Sie sollten zuerst die Eigenschaften der Entitätsklasse mit @Column deklarieren Anmerkung und die Eigenschaftsdeklaration privat sein können, fügen Sie dann Getter- und Setter-Methoden zu diesen Eigenschaften hinzu und machen Sie die Getter- und Setter-Methode öffentlich. Danach kann das JpaRepository ein Entitätsobjekt erstellen und die Eigenschaften des Objekts mit den aus der MySQL-Datenbank zurückgelesenen Daten füllen. Und Ihr findAll() -Methode gibt überhaupt keine leere Liste zurück.

Referenz

  1. So installieren Sie MySQL auf Ubuntu
  2. Beheben Sie den Fehler, dass die Spring Boot-JPA-Tabelle „dbname.hibernate_sequence“ nicht existiert