sql >> Database >  >> RDS >> Mysql

Spring Boot CRUD-voorbeeld met MySQL

Dit voorbeeld zal u vertellen hoe u spring boot data JPA gebruikt om invoegen, bijwerken, verwijderen en selecteren van databasetabelbewerkingen op MySQL-databasetabel te implementeren. Met spring boot data JPA is de database tabel operatie commando verpakt in een methode, je hoeft alleen maar een Java interface te maken die de basis spring boot data JPA Repository interface uitbreidt (bijvoorbeeld CrudRepository ), dan hoeft u alleen de bewerkingsmethode voor de databasetabel te definiëren (zoals findBy , deleteBy, etc) in de aangepaste Repository-interface, en de naam van de methode moet speciale naamgevingsregels volgen. U hoeft geen SQL-commando's te schrijven in de Repository-interface.

1. Maak een MySQL-databasetabel.

  1. Maak een MySQL-database met de naam dev2qa_example . De standaard sortering . van de database moet zijn utf8 – utf8_bin .
    CREATE SCHEMA `dev2qa_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
  2. Maak een tabel user_account in het bovenstaande dev2qa_example database met de onderstaande SQL-instructie. De id kolom moet AI . zijn ( automatiseer increment ), anders wordt een fout Spring Boot JPA Table 'dbname.hibernate_sequence' Exist Exist gegenereerd.
    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. Maak een Spring Boot-project.

  1. Lanceer de lente-toolsuite, klik op Bestand -> Nieuw -> Spring Starter-project menu-item om hieronder te openen Nieuw Spring Starter Project tovenaar. Voer gerelateerde projectinformatie in zoals hieronder. En klik op de knop Volgende.
  2. Voeg JPA toe , MySQL, en Web bibliotheken in de wizard afhankelijkheden. En klik op de Voltooien knop om de projectinitialisatie te voltooien.

3. Spring Boot JPA CRUD Voorbeeldprojectbestanden.

Hieronder staan ​​de bronbestanden in dit project. We zullen ze één voor één voorstellen.

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

Dit is het springboot-voorbeeld waarmee de java-klasse wordt gestart. Het wordt als eerste geladen en uitgevoerd in de lente-opstarttoepassing.

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

Dit is de spring MVC-controller java-klasse die de URL van het gebruikersverzoek toewijst aan de verwerkingsmethode.

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

}
"); } retourneer retBuf.toString(); } /* * Voorbeeld van toewijzings-URL:* http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path ="/findByName") @ResponseBody public String findByName(@RequestParam String userName) { StringBuffer retBuf =nieuwe StringBuffer(); List userAccountList =(List) userAccountRepository.findByUsername(userName); if (userAccountList!=null) { for (UserAccount userAccount:userAccountList) { retBuf.append("gebruikersnaam ="); retBuf.append(gebruikersaccount.getGebruikersnaam()); retBuf.append(", wachtwoord ="); retBuf.append(userAccount.getPassword()); retBuf.append(", e-mail ="); retBuf.append(userAccount.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() ==0) { retBuf.append("Geen record gevonden."); } retourneer retBuf.toString(); } /* * Voorbeeld van toewijzings-URL:* http://localhost:8080/userAccount/findByNameAndPassword?userName=Jerry&* password=888888 */ @GetMapping(path ="/findByNameAndPassword") @ResponseBody public String findByNameAndPassword(@RequestParam String gebruikersnaam , @RequestParam String-wachtwoord) { StringBuffer retBuf =nieuwe StringBuffer (); List userAccountList =(List) userAccountRepository .findByUsernameAndPassword(gebruikersnaam, wachtwoord); if (userAccountList!=null) { for (UserAccount userAccount:userAccountList) { retBuf.append("gebruikersnaam ="); retBuf.append(gebruikersaccount.getGebruikersnaam()); retBuf.append(", wachtwoord ="); retBuf.append(userAccount.getPassword()); retBuf.append(", e-mail ="); retBuf.append(userAccount.getEmail()); retBuf.append("
"); } } if (retBuf.length() ==0) { retBuf.append("Geen record gevonden."); } retourneer retBuf.toString(); } /* * Voorbeeld van toewijzings-URL:* http://localhost:8080/userAccount/updateUser?userName=Jerry&password=hello&* [email protected] */ @GetMapping(path ="/updateUser") @ResponseBody public String updateUser( @RequestParam String gebruikersnaam, @RequestParam String wachtwoord, @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(wachtwoord); userAccount.setEmail (e-mail); userAccountRepository.save(userAccount); } } retBuf.append("Gebruikersgegevens bijwerken succesvol."); retourneer retBuf.toString(); } /* * Voorbeeld van toewijzings-URL:* http://localhost:8080/userAccount/deleteByUserName?userName=Richard */ @GetMapping(path ="/deleteByUserName") @ResponseBody public String deleteByUserName(@RequestParam String userName) { =nieuwe StringBuffer(); userAccountRepository.deleteByUsername(gebruikersnaam); retBuf.append("Gebruikersgegevens zijn succesvol verwijderd."); retourneer retBuf.toString(); } /* * Voorbeeld van toewijzings-URL:* http://localhost:8080/userAccount/deleteByUserNameAndPassword?userName=* Richard&password=888888 */ @GetMapping(path ="/deleteByUserNameAndPassword") @ResponseBody public String deleteByUserNameAndPassword(,erNameRequestParamword) @RequestParam String-wachtwoord) { StringBuffer retBuf =nieuwe StringBuffer (); userAccountRepository.deleteByUsernameAndPassword (gebruikersnaam, wachtwoord); retBuf.append("Gebruikersgegevens zijn succesvol verwijderd."); retourneer retBuf.toString(); }}

3.3 UserAccount.java

Dit is de entiteit Java-klasse die wordt toegewezen aan de MySQL-tabel user_account . Let op de id strategie voor genereren moet GenerationType.IDENTITY . zijn , als u Generation.AUTO . gebruikt en de MySQL-tabel-id-kolom is ingesteld op automatisch verhogen, dan wordt er een fout gegenereerd.

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

Dit is de aangepaste JPA-repository-interface voor spring-opstartgegevens die de CrudRepository uitbreidt . U hoeft alleen gerelateerde methoden te definiëren, waarna het springframework automatisch de gerelateerde SQL-opdracht uitvoert om de methode te implementeren. Dit maakt het coderen sneller.

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

Dit is het bronbestand dat MySQL JDBC-gegevensbronverbindingsgegevens bevat die in het voorbeeld worden gebruikt.

# 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 Voer het voorbeeld uit.

  1. Klik met de rechtermuisknop op de projectnaam.
  2. Klik op Uitvoeren als -> Spring Boot-app menu-item uit de pop-upmenulijst.
  3. Voer na het opstarten van de toepassing de toewijzings-URL in voor de gerelateerde UserAccountController java class-methode in een webbrowser om het resultaat te zien.

4. Vraag &Antwoord.

4.1 Spring-opstartmethoden findAll, findById, deleteById leveren allemaal lege resultaten op.

  1. Ik wil Spring boot + MySQL gebruiken om een ​​REST-toepassing te implementeren die CRUD-acties zal uitvoeren om een ​​MySQL-tabel te manipuleren. Maar ik vind wanneer ik de findAll() . uitvoer methode, het geeft een lege lijst terug, dit is niet wat ik verwacht. Wanneer ik de findById() . uitvoer methode, retourneert het de foutmelding java.util.NoSuchElementException:Geen waarde aanwezig . En wanneer ik een verwijderactie uitvoer met de spring-opstartmethode deleteById() , het vertelt me ​​ook dat Er bestaat geen class org.dev2qa.entity.Article entiteit met id 10 ! Het lijkt erop dat mijn databasetabel leeg is, maar dat is niet zo. In welk geval kunnen deze fouten optreden?
  2. Mijn aangepaste repository-klasse breidt de JpaRepository . uit class, en zijn findAll() methode retourneert ook een lege lijst. Mijn database is ook de MySql-database. Als ik één record aan de MySQL-database toevoeg, wordt de findAll() methode retour [{}] , en wanneer ik twee records toevoeg aan de MySQL-database, de findAll() methode retour [{},{}] . Het lijstelementnummer is correct, maar de elementgegevens zijn leeg, dit is niet correct. Kan iemand mij helpen? Heel erg bedankt.
  3. Als de eigenschappen van uw entiteitsklasse niet openbaar zijn, kan deze fout optreden. U moet eerst de eigenschappen van de entiteitsklasse declareren met de @Kolom annotatie en de eigenschappendeclaratie kunnen privé zijn, voeg vervolgens de getters en setters-methode toe aan die eigenschappen en maak de getters en setters-methode openbaar. Hierna kan de JpaRepository een entiteitsobject maken en de eigenschappen van het object vullen met de gegevens die worden teruggelezen uit de MySQL-database. En je findAll() methode geeft helemaal geen lege lijst terug.

Referentie

  1. Hoe MySQL op Ubuntu te installeren
  2. Oplossen van Spring Boot JPA-tabel 'dbname.hibernate_sequence' bestaat niet-fout

  1. pgDash-alternatieven - PostgreSQL-databasebewaking met ClusterControl

  2. Snelle gesplitste partitionering

  3. CLR strikte beveiliging op SQL Server 2017

  4. Hoe kleine letters naar hoofdletters te converteren in SQL Server - UPPER()