Mysql
 sql >> база данни >  >> RDS >> Mysql

Spring Boot CRUD Пример с MySQL

Този пример ще ви каже как да използвате JPA данни за пружинно зареждане, за да приложите операция за вмъкване, актуализиране, изтриване и избор на таблица на база данни в таблицата на базата данни на MySQL. С данните за пружинно зареждане JPA командата за операция на таблицата на базата данни е обвита в метод, просто трябва да създадете java интерфейс, който разширява основния интерфейс на JPA репозитория на данни за пружинно зареждане (например CrudRepository ), тогава трябва само да дефинирате метод на работа с таблица на база данни (като findBy<име на колона> , изтриванеПо<име на колона>, и т.н.) в персонализирания интерфейс на хранилището, а името на метода трябва да следва специални правила за именуване. Не е необходимо да пишете SQL команди в интерфейса на хранилището.

1. Създайте MySQL таблица с база данни.

  1. Създайте MySQL база данни с името dev2qa_example . Сравняване по подразбиране на базата данни трябва да бъде utf8 – utf8_bin .
    CREATE SCHEMA `dev2qa_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
  2. Създайте таблица user_account в горния dev2qa_example база данни със следния SQL израз. Идентитът колоната трябва да е AI ( автоматизирано увеличение), в противен случай ще бъде изхвърлена грешка Spring Boot JPA Table 'dbname.hibernate_sequence' не съществува.
    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 проект.

  1. Стартирайте пакета пружинни инструменти, щракнете върху Файл —> Нов —> Spring Starter Project елемент от менюто, който да се отвори под Нов проект Spring Starter съветник. Въведете свързана с проекта информация, както е по-долу. И щракнете върху бутона Напред.
  2. Добавете JPA , MySQL, и Мрежата библиотеки в съветника за зависимости. И щракнете върху Край бутон, за да завършите инициализацията на проекта.

3. Spring Boot JPA CRUD Примерни проектни файлове.

По-долу са изходните файлове в този проект. Ще ги представим един по един.

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

Това е примерът за пролетно зареждане при стартиране на java клас. Той ще бъде зареден и стартиран първо в приложението за зареждане на пружината.

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

Това е java класът на пружинния MVC контролер, който ще съпоставя URL адреса на потребителската заявка към метода на обработка.

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

}
"); } връщане retBuf.toString(); } /* * Пример за съпоставяне на URL адрес:* http://localhost:8080/userAccount/findByName?userName=Jerry */ @GetMapping(path ="/findByName") @ResponseBody публичен низ findByName(@RequestParam String userName) {B StufBufferName =нов StringBuffer(); List userAccountList =(Списък) userAccountRepository.findByUsername(userName); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("user name ="); retBuf.append(userAccount.getUsername()); retBuf.append(", парола ="); retBuf.append(userAccount.getPassword()); retBuf.append(", имейл ="); retBuf.append(userAccount.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() ==0) { retBuf.append("Няма намерен запис."); } връщане retBuf.toString(); } /* * Пример за съпоставяне на URL адрес:* http://localhost:8080/userAccount/findByNameAndPassword?userName=Jerry&* password=888888 */ @GetMapping(path ="/findByNameAndPassword") @ResponseByNameAndPassword") @ResponseNameAndPassword() @ResponseNameAndPassword , @RequestParam String password) { StringBuffer retBuf =new StringBuffer(); List userAccountList =(Списък) userAccountRepository .findByUsernameAndPassword(потребителско име, парола); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("user name ="); retBuf.append(userAccount.getUsername()); retBuf.append(", парола ="); retBuf.append(userAccount.getPassword()); retBuf.append(", имейл ="); retBuf.append(userAccount.getEmail()); retBuf.append("
"); } } if (retBuf.length() ==0) { retBuf.append("Няма намерен запис."); } връщане retBuf.toString(); } /* * Пример за съпоставяне на URL адрес:* http://localhost:8080/userAccount/updateUser?userName=Jerry&password=hello&* [email protected] */ @GetMapping(path ="/updateUser") @ResponseBody публичен низ updateUser( @RequestParam String потребителско име, @RequestParam String парола, @RequestParam String имейл) { StringBuffer retBuf =new StringBuffer(); Списък userAccountList =userAccountRepository.findByUsername(userName); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { userAccount.setUsername(userName); userAccount.setPassword(парола); userAccount.setEmail(имейл); userAccountRepository.save(userAccount); } } retBuf.append("Актуализиране на потребителските данни успешно."); връщане retBuf.toString(); } /* * Пример за съпоставяне на URL адрес:* http://localhost:8080/userAccount/deleteByUserName?userName=Richard */ @GetMapping(path ="/deleteByUserName") @ResponseBody публичен низ deleteByUserName(@RequestmeParam) =нов StringBuffer(); userAccountRepository.deleteByUsername(userName); retBuf.append("Потребителските данни са изтрити успешно."); връщане retBuf.toString(); } /* * Пример за съпоставяне на URL адреса:* http://localhost:8080/userAccount/deleteByUserNameAndPassword?userName=* Richard&password=888888 */ @GetMapping(path ="/deleteByUserNameAndPassword") @Urespon St.P.St.Password @RequestParam String password) { StringBuffer retBuf =new StringBuffer(); userAccountRepository.deleteByUsernameAndPassword(потребителско име, парола); retBuf.append("Потребителските данни са изтрити успешно."); връщане retBuf.toString(); }}

3.3 UserAccount.java

Това е java класът на обекта, който ще бъде съпоставен с MySQL таблица user_account . Моля, обърнете внимание на id стратегията за генериране трябва да е GenerationType.IDENTITY , ако използвате Generation.AUTO и колоната с идентификатор на таблицата на MySQL е настроена на автоматично увеличение, след което ще бъде изведена грешка.

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

Това е персонализираният интерфейс на JPA за хранилище с данни за пружинно зареждане, който разширява CrudRepository . Просто трябва да дефинирате свързани методи, след което пружинната рамка автоматично ще изпълни свързаната SQL команда, за да приложи метода. Това прави кодирането по-бързо.

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

Това е ресурсният файл, който съдържа данни за връзка с MySQL JDBC източник на данни, използвани в примера.

# 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 Изпълнете примера.

  1. Щракнете с десния бутон върху името на проекта.
  2. Щракнете върху Изпълни като —> Spring Boot App елемент от менюто от списъка с изскачащи менюта.
  3. След стартирането на приложението въведете URL адреса за съпоставяне за свързания UserAccountController java клас метод в уеб браузър, за да видите резултата.

4. Въпрос и отговор.

4.1 Методите за пролетно зареждане findAll, findById, deleteById всички връщат празни резултати.

  1. Искам да използвам Spring boot + MySQL, за да внедря REST приложение, което ще изпълнява CRUD действия за манипулиране на MySQL таблица. Но намирам, когато изпълня findAll() метод, той връща празен списък, това не е това, което очаквам. Когато изпълня findById() метод, той връща съобщението за грешка java.util.NoSuchElementException:Няма налична стойност . И когато извърша действие за изтриване чрез метода на пружинно зареждане deleteById() , също така ми казва, че Не съществува обект от клас org.dev2qa.entity.Article с идентификатор 10 ! Изглежда моята таблица на базата данни е празна, но не е така. В какъв случай могат да възникнат тези грешки?
  2. Моят персонализиран клас хранилище разширява JpaRepository клас и неговия findAll() методът също връща празен списък. Моята база данни също е базата данни MySql. Когато добавя един запис в MySQL базата данни, findAll() метод връщане [{}] и когато добавя два записа в базата данни MySQL, findAll() метод връщане [{},{}] . Номерът на елемента от списъка е правилен, но данните за елемента са празни, това не е правилно. Може ли някой да ми помогне? Благодаря много.
  3. Ако свойствата на вашия клас обект не са публични, тази грешка може да възникне. Първо трябва да декларирате свойствата на класа на обекта с @Column анотацията и декларацията на свойствата могат да бъдат частни, след което добавете метода на getters и setter към тези свойства и направете метода getters и setters публичен. След това JpaRepository може да създаде обект на обект и да попълни свойствата на обекта с данните, прочетени обратно от базата данни MySQL. И вашият findAll() методът изобщо няма да върне празен списък.

Справка

  1. Как да инсталирате MySQL на Ubuntu
  2. Разрешаване на грешка в JPA таблицата на Spring Boot „dbname.hibernate_sequence“ не съществува

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Запитване на ИНФОРМАЦИОННА СХЕМА на MySQL:Защо? Как?

  2. изберете count(*) от таблицата на mysql в php

  3. Въведение в SQL командите

  4. MySQL параметризирани заявки

  5. Най-добрият тип поле на база данни за URL