A meta de hoje é demonstrar um CRUD no Spring-boot. O Spring-boot é uma evolução do Spring e possui diversos pacotes de implementação incluindo JPA que faz parte da persistência do objeto relacional. No JPA os objetos da camada de modelo de banco de dados são tratados com o nome de Entities ou Entity.
Vamos inciar abrindo o Eclipse com suporte a Java, levando em consideração o JDK e Jre já instalados assim como as variáveis de ambiente.
Na caixa input de acesso rápido digite marketplace e deverá abrir uma janela.
Na caixa de entrada de texto digite STS e clique GO. Deverá aparecer um plugin String Tool Suite que vai nos ajudar a implementar o Spring-boot no Eclipse.
No meu caso o STS já está instalado. Se não estiver clique em Install e proceda com a instalação. O Eclipse deverá ser reiniciado ao término.
Com o Eclipse aberto novamente vamos clicar em File>>New>>Other e selecionar dentro da pasta Spring um projeto do tipo Spring Starter Project e clicar em next.
Deverá abri a janela abaixo:
Clique em next e na próxima janela selecione o projeto web:
Na janela seguinte clique em finish.
O projeto será criado. Na estrutura de arquivos deverá aparecer o seguinte:
O arquivo pom.xml é a alma do Maven. Através dele faremos a importação das libs necessárias. Para isso, serão adicionadas algumas dependências e o arquivo deverá ficar com o seguinte aspecto:
- <?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 https://mvnrepository.com/artifact/mysql/mysql-connector-java http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.example</groupId>
- <artifactId>demo</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>demo</name>
- <description>Demo project for Spring Boot</description>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>1.4.1.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-jersey</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web-services</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
- <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.6</version>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
Feito isso, clique com o direito sobre o projeto acesse Maven>>Update Project.
Veja a classe DemonstraAplication.java dentro do pacote exemplo.com.
Esta classe implementa uma chamada básica com o seguinte conteúdo:
- package com.example;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- @SpringBootApplication
- public class DemoApplication {
- public static void main(String[] args) {
- SpringApplication.run(DemoApplication.class, args);
- }
- }
Vamos criar uma classe ClienteController.java dentro de um novo pacote com o nome com.example.controller com o seguinte conteúdo:
- package com.example.controller;
- import java.util.Collection;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.http.HttpStatus;
- import org.springframework.http.MediaType;
- import org.springframework.http.ResponseEntity;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestBody;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.RestController;
- import com.example.model.Cliente;
- import com.example.service.ClienteService;
- @RestController
- public class ClienteController {
- @Autowired
- ClienteService clienteService;
- @RequestMapping(method=RequestMethod.POST, value="/clientes", consumes=MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity<Cliente> cadastrarCliente(@RequestBody Cliente cliente){
- Cliente clienteCadastrado = clienteService.cadastrar(cliente);
- return new ResponseEntity<Cliente>(clienteCadastrado, HttpStatus.CREATED);
- }
- @RequestMapping(method=RequestMethod.GET, value="/clientes", produces=MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity<Collection<Cliente>> buscarTodosClientes(){
- Collection<Cliente> clientesBuscados = clienteService.buscarTodos();
- return new ResponseEntity<>(clientesBuscados, HttpStatus.OK);
- }
- @RequestMapping(method=RequestMethod.DELETE, value="/clientes/{id}")
- public ResponseEntity<Cliente> excluirCliente(@PathVariable Integer id){
- Cliente clienteEncontrado = clienteService.buscarPorId(id);
- if(clienteEncontrado==null){
- return new ResponseEntity<>(HttpStatus.NOT_FOUND);
- }
- clienteService.excluir(clienteEncontrado);
- return new ResponseEntity<Cliente>(HttpStatus.OK);
- }
- @RequestMapping(method=RequestMethod.PUT, value="/clientes", consumes=MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity<Cliente> alterarCliente(@RequestBody Cliente cliente){
- Cliente clienteAlterado = clienteService.alterar(cliente);
- return new ResponseEntity<Cliente>(clienteAlterado, HttpStatus.OK);
- }
- }
Vamos criar um pacote com.example.service com a classe ClienteService.java com o seguinte conteúdo:
- package com.example.service;
- import java.util.Collection;
- import java.util.HashMap;
- import java.util.Map;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import com.example.model.Cliente;
- import com.example.repository.ClienteRepository;
- @Service
- public class ClienteService {
- @Autowired
- ClienteRepository clienteRepository;
- public Cliente cadastrar(Cliente cliente){
- return clienteRepository.save(cliente);
- }
- public Collection<Cliente> buscarTodos(){
- return clienteRepository.findAll();
- }
- public void excluir(Cliente cliente){
- clienteRepository.delete(cliente);
- }
- public Cliente buscarPorId(Integer id) {
- return clienteRepository.findOne(id);
- }
- public Cliente alterar(Cliente cliente){
- return clienteRepository.save(cliente);
- }
- }
Vamos criar o pacote com.example.model com o objeto Cliente.java com o seguinte conteúdo.
- package com.example.model;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- @Entity
- public class Cliente {
- @Id
- @GeneratedValue
- private Integer id;
- private String nome;
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getNome() {
- return nome;
- }
- public void setNome(String nome) {
- this.nome = nome;
- }
- }
Repare a @nnotation @Entity, é ela que define a classe como objeto e permite o acesso do service. Dentro do banco de dados a tabela precisa ter o mesmo nome da classe e as variáveis private precisam ter o mesmo nome que as colunas do banco de dados. Essa é a regra.
Vamos criar o arquivo ClienteRepository.java dentro do pacote com.example.repository com o seguinte conteúdo:
- package com.example.repository;
- import org.springframework.data.jpa.repository.JpaRepository;
- import org.springframework.stereotype.Repository;
- import com.example.model.Cliente;
- @Repository
- public interface ClienteRepository extends JpaRepository<Cliente, Integer>{
- }
Agora vamos configurar o arquivo application.properties com os dados de acesso ao BD com o nome da database, usuário e senha:
- server.port=${port:8081}
- spring.datasource.url= jdbc:mysql://localhost:3306/db_cli
- spring.datasource.username=root
- spring.datasource.password=root123
- spring.jpa.hibernate.ddl-auto=create-drop
Se o BD ainda não foi criado ainda, crie conforme o modelo Entity, com os mesmos nomes conforme já descrito.
Feito isso, todos os erros do projeto deverão desaparecer.
A estrutura deverá ficar da seguinte forma:
O sistema de arquivos já pode ser executado. Clique com o direito sobre o projeto em Run as>>Spring Boot App. A página poderá ser testada utilizando o Plugin do Chrome Postman. Depois de testar o projeto pode parar o servidor e vamos fazer uma alteração para entender um pouco o Hibernate. O Hibernate é nativo do Spring-boot.
Vamos alterar o arquivo ClienteRepository que na verdade é uma interface. Troque "public interface ClienteRepository" por "public class ClienteRepository" e salve o arquivo.
O Eclipse deverá mostrar um erro sublinhado em JpaRepository. Clique com o direito sobre a palavra para corrigir e escolha a opção "change extends to implements".
O Eclipse deverá mostrar um novo erro na palavra ClienteRepository. Clique com o direito sobre a palavra para corrigir e escolha a opção "add unimplemented methods".
A classe deverá exibir todos os métodos nativos do Hibernate que podem ser invocados pelo service, como: save(), delete(), listAll(), findOne(), getOne(), ...
Repare que em nenhum momento foram utilizados Beans. Essa implementação deverá se repetir para todas as tabelas do sistema. Este é um formato de implementação de Spring muito tradicional. O processo é muito simples e sistêmico. Isso é Java!!
Ainda existe a possibilidade de várias outras formas de implementação se for necessário, mas essa é uma das melhores. Um formato MVC de requisição com uma variante de interfaces em todas as camadas e um Dao herdado, utilizei de forma similar em um dos projetos Spring que trabalhei.
No caso do Spring tradicional com o Hibernate são gerados automaticamente arquivos *.hbm.xml que geram acesso automático ao BD através de uma serialização.
Em um post mais para frente vou abordar internacionalização e sessão de usuário.
Esta implementação especificamente foi retirada da viddeo aula High Tech Cursos:
https://www.youtube.com/watch?v=dg0aZbP8NAU&index=1&list=PLKvsMn7xWutbSELeX5j8CXF2Lxd2cj19J
Muito bom! Me ajudou muito! Obrigado pelas informações!
ResponderExcluirSempre quando alguém me pede algo básico sobre o spring boot eu indico esse post porque explica corretamente para o pessoal iniciante. Gostaria de deixar a recomendação para o pessoal que está começando também fazerem o download gratuito do e-boo API RESTful com Spring Boot no link → https://www.javaavancado.com/ebook-spring-boot/index.html
ResponderExcluir