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

Como construir uma API Rest com Spring Boot usando MySQL e JPA


Olá a todos! No ano passado, tenho aprendido JavaScript para desenvolvimento web full-stack. Para variar, comecei a dominar Java — a poderosa linguagem orientada a objetos.

Nesse caso, encontrei um framework muito limpo e elegante chamado Spring Boot para construir um back-end.

Anteriormente, no desenvolvimento JavaScript, eu usava:
  1. Mongoose — um ORM (Object Relational Mapping) para Mongo DB
  2. Sequelizar — um ORM para MySQL

Para desenvolvimento relacionado a Java, existem muitos ORMs como Hibernate, JPA (Java Persistence API) e Java Object Oriented Querying.

Eu escolho construir com JPA que é tradicionalmente usado em aplicativos Java.

Foi muito interessante, e levou cerca de uma semana para terminar, pois tive que aprender Spring Boot (existem muitas anotações “@ ” e outros tipos legais de coisas para aprender), JPA e Hibernate ao longo do caminho.

Toda essa mágica é feita principalmente pelas anotações (“@ ” símbolo) usado no Spring Boot.

Criando um projeto Spring Boot Maven


Vamos criar um aplicativo de projeto Spring Boot Maven usando este link.

Especialista ” é uma ferramenta de gerenciamento de projetos usada para gerenciar o gerenciamento de dependências. É como o Node Package Manager (NPM ) no ambiente de desenvolvimento JS.

Temos package.json no NodeJS para gerenciamento de dependências e pom.xml no Spring Boot para gerenciamento de dependências.

Em Grupo, escreva o nome que quiser. Normalmente, o nome de domínio da organização é escrito da direita para a esquerda.

Por exemplo, nosso nome de domínio é www.javaAPI.com, então o nome do grupo pode ser com.javaAPI.www

Em seguida, no Artefato, digite o nome da pasta que você deseja .

No lado direito, adicione as seguintes dependências:
  1. WEB — Para usar as dependências do Spring (o framework mais antigo do Spring Boot usado para desenvolver aplicativos da web)
  2. JPA — API de persistência Java
  3. MYSQL

Em seguida, clique em “Gerar Projeto”. Você encontrará um arquivo rar - extraia-o. Em seguida, abra essa pasta em seu IDE favorito.

Clique em com.rest.API e você encontrará um ApiApplication.java arquivo da seguinte forma:
package com.rest.API;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ApiApplication {
public static void main(String[] args) {
      SpringApplication.run(ApiApplication.class, args);
   }
}

Este código é suficiente para iniciar seu servidor. Normalmente, a inicialização por mola é executada em localhost:8080 .

Digite seu terminal da seguinte forma:
mvn spring-boot:run

Veja seu localhost rodando no navegador web na porta 8080. Parece em branco porque ainda não fizemos nada.

Vamos explorar os arquivos e suas tags


Se você der uma olhada no arquivo pom.xml você pode notar que as dependências que você colocou ao criar o aplicativo no Spring Initialize como MySQL, JPA e Web estarão dentro de um cy> marca.

As dependências do iniciador e do testador são o núcleo para criar o aplicativo Spring Boot para servir no servidor.

Agora, vamos para APIApplication.java que é o arquivo principal.
package com.rest.API;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ApiApplication {
public static void main(String[] args) {
      SpringApplication.run(ApiApplication.class, args);
   }
}

Aqui o nome do pacote está na primeira linha do código. Usando esse nome de pacote, você pode importar qualquer classe, método ou instância em outro arquivo de pacote.

Depois disso, dois módulos são importados do pacote “org.springframework.boot”.
  1. Aplicativo Spring
  2. Aplicativo SpringBoot

Como o Spring boot é o framework de desenvolvimento de aplicativos mais recente do Spring, ele precisa dos pacotes do Spring Application, bem como de seus pacotes específicos.

Depois disso @SpringBootApplication A anotação é usada. Esta anotação consiste em uma anotação que é usada no Spring:
  1. @Componente — Diz ao compilador que a classe a seguir é um componente que deve ser incluído ao compilar todo o aplicativo.
  2. @ComponentScan — Este faz o Scan de quais pacotes vamos usar na seguinte classe Java.
  3. @EnableAutoConfiguration — permite que o mecanismo de autoconfiguração do Spring Boot importe módulos importantes para que o Spring Boot seja executado.

Essas são as anotações usadas para iniciar o aplicativo Spring Boot para ser executado em um servidor.

Aqui está um artigo que escrevi sobre anotação e seus usos em Java.

Vamos criar um modelo para nossos dados


Vamos criar uma classe Model para salvar, recuperar, atualizar e excluir os detalhes de um livro.

Para isso, tenho que criar um novo pacote chamado model e dentro disso criando um Book.java class para colocar meu código.
package com.rest.API.model;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
@Entity
@Table(name = "books")
public class Book {
    @Id
    @GeneratedValue
    private Long id;
@NotBlank
    private String book_name;
@NotBlank
    private String author_name;
@NotBlank
    private String isbn;
public Book(){
        super();
    }
public Book(Long id, String book_name, String author_name, String isbn) {
        super();
        this.id = id;
        this.book_name = book_name;
        this.author_name = author_name;
        this.isbn=isbn;
    }
public Long getId() {
        return id;
    }
public void setId(Long id) {
        this.id = id;
    }
public String getBook_name() {
        return book_name;
    }
public void setBook_name(String book_name) {
        this.book_name = book_name;
    }
public String getAuthor_name() {
        return author_name;
    }
public void setAuthor_name(String author_name) {
        this.author_name = author_name;
    }
public String getIsbn() {
        return isbn;
    }
public void setIsbn(String isbn) {
        this.isbn = isbn;
    }
}

Aqui estou usando JPA (Java Persistence API) que é uma coleção de classes e métodos para armazenar dados continuamente em um banco de dados.

@Entidade — usado para denotar que esta classe será uma Entidade no banco de dados.

@Tabela — que recebe alguns valores como o nome que você vai nomear sua tabela

@ID — denota que o id é a chave primária/chave de identificação para esta tabela

@NotBlank — é usado para dizer que esses atributos não devem ficar em branco.

Fora isso, existe um construtor vazio que possui um super método para satisfazer os costumes do JPA. Os métodos getter e setter geralmente estão em uma classe POJO (objeto Java antigo simples ).

Criando o repositório


Em seguida, vamos criar um repositório pacote para lidar com gerenciamento de banco de dados em Java.

Crie uma interface chamada BookRepository.java dentro do repositório pacote.
package com.rest.API.repository;
import com.rest.API.model.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface BookRepository extends JpaRepository<Book, Long> {
}

Eu importei o JpaRepository pacote para usar esse repositório no BookRepository interface conectando meu modelo de livro codificado mais recentemente para fazer CRUD operações.

Já existem métodos embutidos nesses repositórios para realizar operações CRUD.

Por exemplo:
.findAll() - to get All datas
.save()    - to save the got Data
.delete()  - to delete the data

Dentro da tag <> estamos pegando o nome do modelo que vamos usar e o tipo de dados da chave primária.

@Repositório :anotação usada para indicar o DAO (objeto de acesso a dados ) componente na camada de persistência.

Ele informa ao compilador que a interface usará o Repositório para realizar as atividades do banco de dados.

Criando controlador e tratamento de exceção


Crie um novo pacote chamado controlador, e dentro que cria um BookController.java arquivo que contém os terminais.
package com.rest.API.controller;

import com.rest.API.exception.BookNotFoundException;
import com.rest.API.model.Book;
import com.rest.API.repository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;
import javax.validation.Valid;
import java.util.List;

@RestController
public class BookController {

@Autowired
    BookRepository bookRepository;

// Get All Notes
    @GetMapping("/books")
    public List<Book> getAllNotes() {
        return bookRepository.findAll();
    }

// Create a new Note
    @PostMapping("/books")
    public Book createNote(@Valid @RequestBody Book book) {
        return bookRepository.save(book);
    }

// Get a Single Note
    @GetMapping("/books/{id}")
    public Book getNoteById(@PathVariable(value = "id") Long bookId) throws BookNotFoundException {
        return bookRepository.findById(bookId)
                .orElseThrow(() -> new BookNotFoundException(bookId));
    }

// Update a Note
    @PutMapping("/books/{id}")
    public Book updateNote(@PathVariable(value = "id") Long bookId,
                           @Valid @RequestBody Book bookDetails) throws BookNotFoundException {

Book book = bookRepository.findById(bookId)
                .orElseThrow(() -> new BookNotFoundException(bookId));

book.setBook_name(bookDetails.getBook_name());
        book.setAuthor_name(bookDetails.getAuthor_name());
        book.setIsbn(bookDetails.getIsbn());

Book updatedBook = bookRepository.save(book);

return updatedBook;
    }

// Delete a Note
    @DeleteMapping("/books/{id}")
    public ResponseEntity<?> deleteBook(@PathVariable(value = "id") Long bookId) throws BookNotFoundException {
        Book book = bookRepository.findById(bookId)
                .orElseThrow(() -> new BookNotFoundException(bookId));

bookRepository.delete(book);

return ResponseEntity.ok().build();
    }
}

O primeiro pacote importado é para a exceção Book Not Found (para a qual vamos criar um arquivo daqui a pouco).

Explicação das anotações que usamos aqui:
  1. RestController: Esta anotação é usada para denotar cada método na classe anotada como Objeto de Domínio.

Então, o que é Objeto de Domínio…?

Ele simplesmente diz que Objeto de Domínio ==Objeto de Negócios.

Eles geralmente são representados por entidades e objetos de valor relacionados ao endpoint que estamos fornecendo para obter os dados do banco de dados.

2. Autowired :Esta anotação é usada para conectar as classes de bean automaticamente.

Para isso, você precisa saber sobre “O que é uma classe de bean..?

Basicamente, uma Java Bean Class é uma classe simples que encapsula muitos objetos nela.

Este é um artigo que escrevi sobre Java Bean Classes.

A seguir estão as Anotações de Mapeamento para os pontos de extremidade executarem Operações CRUD.

3. GetMapping: Esta é uma interface que contém o caminho do endpoint para executar um método Get. Essa interface GetMapping usa a interface RequestMapping que pode ter o método “path, value, params, headers” para executar o método Get em versões anteriores do Spring.

Agora é simplificado usando GetMapping.

4. Pós-mapeamento :Esta é uma interface que contém o caminho do endpoint para executar o método Post.

5. PutMapping: Esta é uma interface que contém o caminho do endpoint para executar o método Put to Update.

6. Excluir mapeamento: Esta é uma interface que contém o caminho do endpoint para executar o método Delete.

Nas linhas finais, você provavelmente notou o “ResponseEntity ” palavra-chave.

O que é isso …??

É uma classe Java que herda HttpEntity classe para manipular as respostas HTTP. Se a solicitação da conexão é “OK ” ou se houver algum problema, lance uma exceção da HttpEntity aula.

ouElseThrow(): Este é um método encontrado na classe opcional em Java8 que foi introduzido para lidar com exceções. A classe opcional fornece vários métodos utilitários para verificar a presença ou ausência de um objeto, o que ajuda a lidar com NullPointerException.

ouElseThrow é um método que retorna valor se estiver presente, caso contrário invoca uma exceção.

Criando uma NotFoundException se não houver tal book_id


Como o método orElseThrow lança uma exceção NotFound. A seguir está a parte de Manipulação de Exceções. Crie um BookNotFoundException.java arquivo dentro do pacote de exceção.
package com.rest.API.exception;
public class BookNotFoundException extends Exception {
private long book_id;
public BookNotFoundException(long book_id) {
        super(String.format("Book is not found with id : '%s'", book_id));
        }
}

A classe criada estende a Superclasse de Exceção. No construtor, estou passando o book_id e imprime a exceção.

Então é isso…

Concluímos a parte da API REST. Agora você pode construir o aplicativo (que foi explicado na Parte 1) e fazer alguns testes com o Postman.

Conectando com banco de dados MySql


Dentro do application.properties dos seus recursos pasta, adicione o seguinte:
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url = jdbc:mysql://localhost:3306/library
spring.datasource.username = root //normally put your MySQL username 
spring.datasource.password = YOUR_MYSQL_PASSWORD
## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update

É isso.

Construímos uma API REST básica no Spring Boot. Parabéns!

Se algo estiver errado ou precisar ser corrigido, por favor me avise na seção de comentários.

Entre em contato comigo no twitter.

Boa Codificação!