
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
- Usuário acessa o formulário de edição
- Sistema carrega os dados atuais
- Usuário altera os dados
- Formulário é enviado
- Sistema atualiza o registro
- 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)
1. Adicionar um link para edição
<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ção | Método | Rota | Arquivo HTML |
|---|---|---|---|
| Listar todos | GET | /produtos | lista.html |
| Formulário novo | GET | /produtos/novo | criar.html |
| Criar recurso | POST | /produtos | redirect |
| Detalhes | GET | /produtos/{id} | detalhes.html |
| Formulário editar | GET | /produtos/{id}/editar | editar.html |
| Atualizar | POST | /produtos/{id}/atualizar | redirect |
| Excluir | POST | /produtos/{id}/excluir | redirect |