sql >> Databasteknik >  >> RDS >> Mysql

Spring Boot CRUD Exempel med MySQL

Det här exemplet kommer att berätta hur du använder vårstartdata JPA för att implementera infoga, uppdatera, ta bort och välja databastabelloperation på MySQL-databastabellen. Med fjäderstartdata JPA har databastabelloperationskommandot omslutits till en metod, du behöver bara skapa ett java-gränssnitt som utökar grundläggande fjäderstartdata JPA Repository-gränssnitt (till exempel CrudRepository ), så behöver du bara definiera databastabellens operationsmetod (som hitta efter , deleteBy, etc) i det anpassade Repository-gränssnittet, och metodnamnet måste följa speciella namnregler. Du behöver inte skriva SQL-kommandon i Repository-gränssnittet.

1. Skapa MySQL-databastabell.

  1. Skapa en MySQL-databas med namnet dev2qa_example . Databasens standardsortering ska vara utf8 – utf8_bin .
    CREATE SCHEMA `dev2qa_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
  2. Skapa en tabell user_account i ovanstående dev2qa_example databas med nedanstående SQL-sats. id kolumnen ska vara AI ( automatisera inkrement ), annars kommer ett fel Spring Boot JPA-tabell 'dbname.hibernate_sequence' existerar inte att kastas.
    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. Skapa Spring Boot Project.

  1. Starta Spring Tool Suite, klicka på Arkiv —> Nytt —> Spring Starter Project menyalternativ för att öppna nedan New Spring Starter Project trollkarl. Mata in relaterad projektinformation som nedan. Och klicka på knappen Nästa.
  2. Lägg till JPA , MySQL, och Webb bibliotek i beroendeguiden. Och klicka på Slutför för att slutföra projektinitieringen.

3. Spring Boot JPA CRUD Exempel på projektfiler.

Nedan finns källfilerna i detta projekt. Vi kommer att presentera dem en efter en.

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

Det här är exemplet på våren som startar java-klassen. Den kommer att laddas och köras först i vårstartapplikationen.

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

Detta är vårens MVC-styrenhets java-klass som kommer att mappa webbadress för användarförfrågan till bearbetningsmetod.

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

}
"); } returnera retBuf.toString(); } /* * Exempel på mapping-url:* http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path ="/findByName") @ResponseBody public String findByName(@RequestParam String userName) { StringBuffer retBuf =new StringBuffer(); List userAccountList =(List) userAccountRepository.findByUsername(användarnamn); if (userAccountList !=null) { for (UserAccount userAccount:userAccountList) { retBuf.append("användarnamn ="); retBuf.append(användarkonto.getAnvändarnamn()); retBuf.append(", lösenord ="); retBuf.append(användarkonto.getPassword()); retBuf.append(", email ="); retBuf.append(userAccount.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() ==0) { retBuf.append("Ingen post hitta."); } returnera retBuf.toString(); } /* * Exempel på kartadress:* http://localhost:8080/userAccount/findByNameAndPassword?userName=Jerry&* password=888888 */ @GetMapping(sökväg ="/findByNameAndPassword") @ResponseBody public String findByNameAndPassword(användarnamnRequestPassword( , @RequestParam String lösenord) { StringBuffer retBuf =new StringBuffer(); List userAccountList =(Lista) userAccountRepository .findByUsernameAndPassword(användarnamn, lösenord); if (userAccountList !=null) { for (UserAccount userAccount:userAccountList) { retBuf.append("användarnamn ="); retBuf.append(användarkonto.getAnvändarnamn()); retBuf.append(", lösenord ="); retBuf.append(användarkonto.getPassword()); retBuf.append(", email ="); retBuf.append(userAccount.getEmail()); retBuf.append("
"); } } if (retBuf.length() ==0) { retBuf.append("Ingen post hitta."); } returnera retBuf.toString(); } /* * Exempel på kartadress:* http://localhost:8080/userAccount/updateUser?userName=Jerry&password=hello&* [email protected] */ @GetMapping(path ="/updateUser") @ResponseBody public String updateUser( @RequestParam String användarnamn, @RequestParam String lösenord, @RequestParam String email) { StringBuffer retBuf =new StringBuffer(); List userAccountList =userAccountRepository.findByUsername(användarnamn); if (userAccountList !=null) { for (UserAccount userAccount:userAccountList) { userAccount.setUsername(userName); userAccount.setPassword(lösenord); userAccount.setEmail(e-post); userAccountRepository.save(användarkonto); } } retBuf.append("Användardata har uppdaterats framgångsrikt."); returnera retBuf.toString(); } /* * Exempel på mappningsadress:* http://localhost:8080/userAccount/deleteByUserName?userName=Richard */ @GetMapping(path ="/deleteByUserName") @ResponseBody public String deleteByUserName(@RequestParam String UserName retB {StringBufferName) =new StringBuffer(); userAccountRepository.deleteByUsername(användarnamn); retBuf.append("Användardata har raderats framgångsrikt."); returnera retBuf.toString(); } /* * Exempel på mappningsadress:* http://localhost:8080/userAccount/deleteByUserNameAndPassword?userName=* Richard&password=888888 */ @GetMapping(sökväg ="/deleteByUserNameAndPassword") @ResponseByUserNameAndPassUsString deleteNameAndPassUs @RequestParam String lösenord) { StringBuffer retBuf =new StringBuffer(); userAccountRepository.deleteByUsernameAndPassword(användarnamn, lösenord); retBuf.append("Användardata har raderats framgångsrikt."); returnera retBuf.toString(); }}

3.3 UserAccount.java

Detta är entitetsjavaklassen som kommer att mappas till MySQL-tabellen user_account . Vänligen notera id generera strategi måste vara GenerationType.IDENTITY , om du använder Generation.AUTO och MySQL-tabell-id-kolumnen är inställd på automatisk ökning, kommer ett fel att visas.

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

Det här är det anpassade gränssnittet för JPA-förvaret för vårstartdata som utökar CrudRepository . Du behöver bara definiera relaterade metoder, sedan kör fjäderramverket automatiskt det relaterade SQL-kommandot för att implementera metoden. Detta gör kodningen snabbare.

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

Det här är resursfilen som innehåller anslutningsdata för MySQL JDBC-datakälla som används av exemplet.

# 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 exemplet.

  1. Högerklicka på projektnamnet.
  2. Klicka på Kör som —> Spring Boot App menyalternativ från popup-menyn.
  3. Efter programmets start anger du mappningsadressen för den relaterade UserAccountController java-klassmetoden i en webbläsare för att se resultatet.

4. Fråga och svar.

4.1 Spring boot-metoder findAll, findById, deleteById ger alla tomma resultat.

  1. Jag vill använda Spring boot + MySQL för att implementera en REST-applikation som kommer att utföra CRUD-åtgärder för att manipulera en MySQL-tabell. Men jag hittar när jag kör findAll() metoden returnerar den en tom lista, detta är inte vad jag förväntar mig. När jag kör findById() metod returnerar den felmeddelandet java.util.NoSuchElementException:Inget värde närvarande . Och när jag utför en raderingsåtgärd med vårstartmetoden deleteById() , det säger mig också att Ingen klass org.dev2qa.entity.Article-enhet med id 10 existerar ! Det verkar som om min databastabell är tom men det är den inte. I vilket fall kan dessa fel uppstå?
  2. Min anpassade arkivklass utökar JpaRepository klass och dess findAll() metod returnerar också en tom lista. Min databas är också MySql-databasen. När jag lägger till en post i MySQL-databasen visas findAll() metod returnerar [{}] , och när jag lägger till två poster i MySQL-databasen visas findAll() metod returnerar [{},{}] . Listelementnumret är korrekt men elementdatan är tom detta är inte korrekt. Kan någon ge mig lite hjälp? Tack så mycket.
  3. Om din enhetsklasss egenskaper inte är offentliga kan detta fel uppstå. Du bör först deklarera entitetsklassens egenskaper med @Column annotering och egenskapsdeklarationen kan vara privat, lägg sedan till getters and seters-metoden till dessa egenskaper och gör getters and seters-metoden offentlig. Efter detta kan JpaRepository skapa ett entitetsobjekt och fylla i objektets egenskaper med data som läses tillbaka från MySQL-databasen. Och din findAll() metod returnerar inte en tom lista alls.

Referens

  1. Hur man installerar MySQL på Ubuntu
  2. Lös Spring Boot JPA-tabellen 'dbname.hibernate_sequence' existerar inte fel

  1. Bästa praxis för lös koppling mellan data och användargränssnitt i Android - Adapter, Filter, CursorLoader och ContentProvider

  2. Att skriva en fil med flera trådar

  3. Anropar lagrad procedur med returvärde

  4. Ta bort fråga För att ta bort rader i MySQL