Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Exemplo de Spring Boot CRUD com MySQL


Este exemplo mostrará como usar o JPA de dados de inicialização de mola para implementar a operação de inserção, atualização, exclusão e seleção de tabela de banco de dados na tabela de banco de dados MySQL. Com o JPA de dados de inicialização de mola, o comando de operação da tabela de banco de dados foi empacotado em um método, você só precisa criar uma interface java que estenda a interface de repositório JPA de dados básicos de inicialização de mola (por exemplo, CrudRepository ), então você só precisa definir o método de operação da tabela de banco de dados (como findBy , excluirPor, etc) na interface de repositório personalizada, e o nome do método deve seguir regras de nomenclatura especiais. Você não precisa escrever comandos SQL na interface do Repositório.


1. Crie uma tabela de banco de dados MySQL.

  1. Crie um banco de dados MySQL com o nome dev2qa_example . O agrupamento padrão do banco de dados deve ser utf8 – utf8_bin .
    CREATE SCHEMA `dev2qa_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
  2. Crie uma tabela user_account no dev2qa_example acima banco de dados com a instrução SQL abaixo. O código a coluna deve ser AI ( incremento automático ), caso contrário um erro Spring Boot JPA Table 'dbname.hibernate_sequence' Doesn't Exist será lançado.
    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. Crie o projeto Spring Boot.

  1. Inicie o pacote de ferramentas Spring, clique em Arquivo —> Novo —> Projeto Spring Starter item de menu a ser aberto abaixo do Novo Projeto Spring Starter bruxo. Insira informações relacionadas ao projeto como abaixo. E clique no botão Avançar.
  2. Adicionar JPA , MySQL, e Web bibliotecas no assistente de dependências. E clique no botão Concluir botão para concluir a inicialização do projeto.

3. Arquivos de projeto de exemplo do Spring Boot JPA CRUD.


Abaixo estão os arquivos de origem neste projeto. Vamos apresentá-los um por um.
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


Este é o exemplo de inicialização de mola iniciando a classe java. Ele será carregado e executado primeiro no aplicativo de inicialização por mola.
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


Esta é a classe java do controlador Spring MVC que mapeará a URL de solicitação do usuário para o método de processamento.
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();
    }

}
"); } return retBuf.toString(); } /* * Exemplo de URL de mapeamento:* 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(userName); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("user name ="); retBuf.append(userAccount.getUsername()); retBuf.append(", senha ="); retBuf.append(userAccount.getPassword()); retBuf.append(", email ="); retBuf.append(userAccount.getEmail()); retBuf.append("\r\n"); } } if (retBuf.length() ==0) { retBuf.append("Nenhum registro encontrado."); } return retBuf.toString(); } /* * Exemplo de URL de mapeamento:* 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 userAccountList =(List) userAccountRepository .findByUsernameAndPassword(userName, password); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { retBuf.append("user name ="); retBuf.append(userAccount.getUsername()); retBuf.append(", senha ="); retBuf.append(userAccount.getPassword()); retBuf.append(", email ="); retBuf.append(userAccount.getEmail()); retBuf.append("
"); } } if (retBuf.length() ==0) { retBuf.append("Nenhum registro encontrado."); } return retBuf.toString(); } /* * Exemplo de URL de mapeamento:* http://localhost:8080/userAccount/updateUser?userName=Jerry&password=hello&* [email protected] */ @GetMapping(path ="/updateUser") @ResponseBody public String updateUser( @RequestParam String userName, @RequestParam String senha, @RequestParam String email) { StringBuffer retBuf =new StringBuffer(); List userAccountList =userAccountRepository.findByUsername(userName); if (userAccountList !=null) { for (UserAccount userAccount :userAccountList) { userAccount.setUsername(userName); userAccount.setPassword(senha); userAccount.setEmail(email); userAccountRepository.save(userAccount); } } retBuf.append("Dados do usuário atualizados com sucesso."); return retBuf.toString(); } /* * Exemplo de URL de mapeamento:* 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("Os dados do usuário foram excluídos com sucesso."); return retBuf.toString(); } /* * Exemplo de URL de mapeamento:* 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("Os dados do usuário foram excluídos com sucesso."); return retBuf.toString(); }}

3.3 UserAccount.java


Esta é a classe java da entidade que será mapeada para a tabela MySQL user_account . Observe o id a estratégia de geração deve ser GenerationType.IDENTITY , se você usar Geração.AUTO e a coluna id da tabela MySQL estiver configurada para incremento automático, um erro será gerado.
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


Esta é a interface de repositório JPA de dados de inicialização de primavera personalizada que estende o CrudRepository . Você só precisa definir métodos relacionados, então a estrutura de mola executará automaticamente o comando SQL relacionado para implementar o método. Isso torna a codificação mais rápida.
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 aplicativo.propriedades


Este é o arquivo de recurso que contém os dados de conexão da fonte de dados MySQL JDBC usados ​​pelo exemplo.
# 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 Execute o exemplo.

  1. Clique com o botão direito do mouse no nome do projeto.
  2. Clique em Executar como —> Aplicativo Spring Boot item de menu da lista do menu pop-up.
  3. Após a inicialização do aplicativo, insira o URL de mapeamento para o UserAccountController relacionado método de classe java em um navegador da Web para ver o resultado.

4. Pergunta e resposta.

4.1 Os métodos de inicialização Spring findAll, findById, deleteById todos retornam resultados vazios.

  1. Quero usar Spring boot + MySQL para implementar um aplicativo REST que executará ações CRUD para manipular uma tabela MySQL. Mas acho quando executo o findAll() método, ele retorna uma lista vazia, não é isso que eu espero. Quando executo o findById() método, ele retorna a mensagem de erro java.util.NoSuchElementException:Nenhum valor presente . E quando executo uma ação de exclusão pelo método de inicialização de mola deleteById() , também me diz que Não existe nenhuma entidade de classe org.dev2qa.entity.Article com ID 10 ! Parece que minha tabela de banco de dados está vazia, mas não está. Em que caso esses erros podem ocorrer?
  2. Minha classe de repositório personalizado estende o JpaRepository classe e seu findAll() O método também retorna uma lista vazia. Meu banco de dados é o banco de dados MySql também. Quando eu adiciono um registro no banco de dados MySQL, o findAll() método de retorno [{}] , e quando adiciono dois registros no banco de dados MySQL, o findAll() retorno de método [{},{}] . O número do elemento da lista está correto, mas os dados do elemento estão vazios, isso não está correto. Alguém pode me dar alguma ajuda? Muito obrigado.
  3. Se as propriedades da sua classe de entidade não forem públicas, esse erro poderá ocorrer. Você deve primeiro declarar as propriedades da classe de entidade com o @Column anotação e a declaração de propriedades podem ser privadas, então adicione os métodos getters e setters a essas propriedades e torne o método getters e setters público. Depois disso, o JpaRepository pode criar um objeto de entidade e preencher as propriedades do objeto com os dados lidos do banco de dados MySQL. E seu findAll() O método não retornará uma lista vazia.

Referência
  1. Como instalar o MySQL no Ubuntu
  2. Resolver o erro da tabela JPA do Spring Boot 'dbname.hibernate_sequence' não existe