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

Spring Boot CRUD Eksempel med MySQL

Dette eksempel vil fortælle dig, hvordan du bruger spring boot-data JPA til at implementere indsættelse, opdatering, sletning og valg af databasetabeloperation på MySQL-databasetabellen. Med spring boot data JPA er databasetabel operationskommandoen blevet pakket ind i en metode, du skal bare oprette en java-grænseflade, der udvider grundlæggende spring boot-data JPA Repository-grænseflade (f.eks. CrudRepository ), så behøver du kun at definere databasetabeloperationsmetoden (såsom findBy , slet efter , osv.) i den brugerdefinerede Repository-grænseflade, og metodenavnet skal følge særlige navngivningsregler. Du behøver ikke at skrive SQL-kommandoer i Repository-grænsefladen.

1. Opret MySQL-databasetabel.

  1. Opret en MySQL-database med navnet dev2qa_example . Databasens standardsortering skal være utf8 – utf8_bin .
    CREATE SCHEMA `dev2qa_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
  2. Opret en tabel user_account i ovenstående dev2qa_example database med nedenstående SQL-sætning. id kolonnen skal være AI ( automate increment ), ellers vil der blive kastet en fejl Spring Boot JPA Table 'dbname.hibernate_sequence' Doesn't Exist.
    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. Opret Spring Boot Project.

  1. Start spring tool suite, klik på Filer —> New —> Spring Starter Project menupunkt for at åbne nedenfor New Spring Starter Project guiden. Input relateret projektinformation som nedenfor. Og klik på knappen Næste.
  2. Tilføj JPA , MySQL, og Web biblioteker i afhængighedsguiden. Og klik på Udfør knappen for at fuldføre projektets initialisering.

3. Spring Boot JPA CRUD Eksempel på projektfiler.

Nedenfor er kildefilerne i dette projekt. Vi vil introducere dem én efter én.

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

Dette er eksemplet med forårsstøvler, der starter java-klassen. Det vil blive indlæst og køre først i spring boot-applikationen.

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

Dette er forårets MVC-controller-java-klasse, som vil kortlægge brugeranmodnings-url til behandlingsmetode.

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

}
"); } returner retBuf.toString(); } /* * Eksempel på mapping-url:* http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path ="/findByName") @ResponseBody public String findByName(@RequestParam String userName) { StringBuffer retBuf =ny StringBuffer(); List userAccountList =(Liste) userAccountRepository.findByUsername(brugernavn); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("brugernavn ="); retBuf.append(brugerKonto.getBrugernavn()); retBuf.append(", password ="); retBuf.append(brugerKonto.getPassword()); retBuf.append(", email ="); retBuf.append(brugerKonto.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() ==0) { retBuf.append("Ingen registrering fundet."); } returner retBuf.toString(); } /* * Mapping url-eksempel:* http://localhost:8080/userAccount/findByNameAndPassword?userName=Jerry&* password=888888 */ @GetMapping(path ="/findByNameAndPassword") @ResponseBody public String findByNameAndPassword( , @RequestParam String password) { StringBuffer retBuf =new StringBuffer(); List userAccountList =(Liste) userAccountRepository .findByUsernameAndPassword(brugernavn, adgangskode); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("brugernavn ="); retBuf.append(brugerKonto.getBrugernavn()); retBuf.append(", password ="); retBuf.append(brugerKonto.getPassword()); retBuf.append(", email ="); retBuf.append(brugerKonto.getEmail()); retBuf.append("
"); } } if (retBuf.length() ==0) { retBuf.append("Ingen registrering fundet."); } returner retBuf.toString(); } /* * Eksempel på mapping-url:* http://localhost:8080/userAccount/updateUser?userName=Jerry&password=hello&* [email protected] */ @GetMapping(path ="/updateUser") @ResponseBody public String updateUser( @RequestParam String brugernavn, @RequestParam String adgangskode, @RequestParam String email) { StringBuffer retBuf =new StringBuffer(); List userAccountList =userAccountRepository.findByUsername(brugernavn); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { userAccount.setBrugernavn(brugernavn); userAccount.setPassword(adgangskode); userAccount.setEmail(e-mail); userAccountRepository.save(brugerkonto); } } retBuf.append("Brugerdata blev opdateret."); returner retBuf.toString(); } /* * Mapping url-eksempel:* http://localhost:8080/userAccount/deleteByUserName?userName=Richard */ @GetMapping(path ="/deleteByUserName") @ResponseBody public String deleteByUserName(@RequestParam String UserName retB {StringBufferName) =ny StringBuffer(); userAccountRepository.deleteByUsername(brugernavn); retBuf.append("Brugerdata er blevet slettet med succes."); returner retBuf.toString(); } /* * Eksempler på mapping-url:* http://localhost:8080/userAccount/deleteByUserNameAndPassword?userName=* Richard&password=888888 */ @GetMapping(path ="/deleteByUserNameAndPassword") @ResponseByUserNameAndPassUs String deleteNameAndPassUs String(erteNameAndPassword) @RequestParam String password) { StringBuffer retBuf =new StringBuffer(); userAccountRepository.deleteByUsernameAndPassword(brugernavn, adgangskode); retBuf.append("Brugerdata er blevet slettet med succes."); returner retBuf.toString(); }}

3.3 UserAccount.java

Dette er enhedens java-klasse, der vil blive knyttet til MySQL-tabellen brugerkonto . Bemærk venligst id generere strategi skal være GenerationType.IDENTITY , hvis du bruger Generation.AUTO og MySQL-tabel-id-kolonnen er indstillet til auto-increment, så vil en fejl blive kastet.

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

Dette er JPA-lagergrænsefladen for brugerdefinerede fjederstartdata, der udvider CrudRepository . Du skal bare definere relaterede metoder, så vil springrammerne automatisk køre den relaterede SQL-kommando for at implementere metoden. Dette gør kodning hurtigere.

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

Dette er ressourcefilen, der indeholder MySQL JDBC-datakildeforbindelsesdata, der bruges af eksemplet.

# 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 Kør eksemplet.

  1. Højreklik på projektets navn.
  2. Klik på Kør som —> Spring Boot App menupunkt fra pop op-menulisten.
  3. Efter opstart af applikationen skal du indtaste tilknytnings-url'en for den relaterede UserAccountController java-klassemetoden i en webbrowser for at se resultatet.

4. Spørgsmål og svar.

4.1 Spring boot-metoder findAll, findById, deleteById returnerer alle tomme resultater.

  1. Jeg vil bruge Spring boot + MySQL til at implementere en REST-applikation, der udfører CRUD-handlinger for at manipulere en MySQL-tabel. Men jeg finder, når jeg udfører findAll() metode, returnerer den en tom liste, det er ikke, hvad jeg forventer. Når jeg udfører findById() metode, returnerer den fejlmeddelelsen java.util.NoSuchElementException:Ingen værdi til stede . Og når jeg udfører en slettehandling med spring boot-metoden deleteById() , det fortæller mig også, at Der findes ingen klasse org.dev2qa.entity.Article-enhed med id 10 ! Det ser ud til, at min databasetabel er tom, men det er den ikke. I hvilket tilfælde kan disse fejl opstå?
  2. Min tilpassede lagerklasse udvider JpaRepository klasse, og dens findAll() metoden returnerer også en tom liste. Min database er også MySql-databasen. Når jeg tilføjer én post i MySQL-databasen, vises findAll() metode returnerer [{}] , og når jeg tilføjer to poster i MySQL-databasen, vises findAll() metode returnerer [{},{}] . Listens elementnummer er korrekt, men elementdataene er tomme, dette er ikke korrekt. Kan nogen hjælpe mig? Mange tak.
  3. Hvis din enhedsklasses egenskaber ikke er offentlige, kan denne fejl opstå. Du bør først erklære enhedsklassens egenskaber med @Column annotering og egenskabserklæringen kan være privat, og føj derefter getters og setters metoden til disse egenskaber og gør getters og setters metoden offentlig. Efter dette kan JpaRepository oprette et entitetsobjekt og udfylde objektets egenskaber med data, der er læst tilbage fra MySQL-databasen. Og din findAll() metoden vil slet ikke returnere en tom liste.

Reference

  1. Sådan installeres MySQL på Ubuntu
  2. Løs Spring Boot JPA-tabel 'dbname.hibernate_sequence' findes ikke fejl

  1. Hvad er Oracle Database?

  2. Sådan gør du SQLites LIKE-operatør case-sensitive

  3. Smart Home Data Model

  4. Er det sikkert at gemme brugernavne og adgangskoder i databasen?