Search buenodc

Nesta página
  1. Prof. Me. Danilo Bueno
  2. Fluxo da atualização
  3. 1. Adicionar um link para edição
  4. 2. Recuperando os dados do produto
  5. 3. Preenchendo os dados do formulário
  6. 1. Recebendo os dados alterados
  7. 2. Código do repositório

bg cover

CRUD - método UPDATE

Prof. Me. Danilo Bueno


Operação UPDATE

Operação responsável por atualizar os dados de um registro existente no banco de dados.

Fluxo da atualização

  1. Usuário acessa o formulário de edição
  2. Sistema carrega os dados atuais
  3. Usuário altera os dados
  4. Formulário é enviado
  5. Sistema atualiza o registro
  6. Usuário é redirecionado para a listagem

Fluxo do UPDATE

LISTA DE PRODUTOS
        ↓
clicar em "Editar"
        ↓
FORMULÁRIO DE EDIÇÃO
        ↓
alterar dados
        ↓
enviar formulário
        ↓
ATUALIZAÇÃO NO BANCO
        ↓
REDIRECT PARA LISTAGEM

Exibição do Formulário (GET)

<a th:href="@{/produtos/{id}/editar(id=${produto.id})}"> Editar </a>

O ID do produto será enviado dinamicamente pela URL.


Exibição do Formulário (GET)

2. Recuperando os dados do produto

@GetMapping("/produtos/{id}/editar")
public String editar(@PathVariable int id, Model model) {

    Produto produto = produtoRepository.findById(id);

    if(produto == null) {
        return "redirect:/produtos";
    }

    model.addAttribute("produto", produto);

    return "produtos/editar.html";
}

Precisamos recuperar os dados atuais para preencher o formulário.


Exibição do Formulário (GET)

3. Preenchendo os dados do formulário

<form method="POST" th:action="@{/produtos/{id}/atualizar(id=${produto.id})}">
  <input type="text" name="nome" th:value="${produto.nome}" />

  <input type="number" step="0.01" name="preco" th:value="${produto.preco}" />

  <button type="submit">Atualizar</button>
</form>

Os campos do formulário recebem os valores atuais do produto.


Submissão do Formulário (POST)

1. Recebendo os dados alterados

@PostMapping("/produtos/{id}/atualizar")
public String atualizar(
        @PathVariable int id,
        @RequestParam String nome,
        @RequestParam double preco
) {

    Produto produto = produtoRepository.findById(id);

    if(produto == null) {
        return "redirect:/produtos";
    }

    produto.setNome(nome);
    produto.setPreco(preco);

    produtoRepository.update(produto);

    return "redirect:/produtos";
}

Estamos utilizando POST por simplicidade. Em APIs REST normalmente utilizaríamos PUT ou PATCH.


Submissão do Formulário (POST)

2. Código do repositório

@Transactional
public void update(Produto produto) {

    String sql = """
        UPDATE produtos
        SET nome = :nome,
            preco = :preco
        WHERE id = :id
    """;

    Query query = em.createNativeQuery(sql);

    query.setParameter("id", produto.getId());
    query.setParameter("nome", produto.getNome());
    query.setParameter("preco", produto.getPreco());

    query.executeUpdate();
}

Observação importante

Nesta aula estamos trabalhando diretamente com a entidade Produto.

Em aplicações maiores normalmente utilizamos:

  • DTOs
  • Form Objects
  • Camadas de serviço

Mas neste momento o objetivo é compreender o fluxo completo do CRUD.


Mapeamento Completo

OperaçãoMétodoRotaArquivo HTML
Listar todosGET/produtoslista.html
Formulário novoGET/produtos/novocriar.html
Criar recursoPOST/produtosredirect
DetalhesGET/produtos/{id}detalhes.html
Formulário editarGET/produtos/{id}/editareditar.html
AtualizarPOST/produtos/{id}/atualizarredirect
ExcluirPOST/produtos/{id}/excluirredirect

Obrigado!

[email protected] · website/docs · github