API REST desenvolvida com Java e Spring Boot para gerenciamento de carros e marcas, com arquitetura em camadas, relacionamentos JPA, queries customizadas e integração com banco de dados PostgreSQL.
Este repositório contém apenas o backend da aplicação. Para o frontend em Angular, acesse: carros-front
| Tecnologia | Função |
|---|---|
| Java 17 | Linguagem principal do projeto |
| Spring Boot 3 | Framework base da aplicação |
| Spring Web (MVC) | Criação dos controllers e endpoints REST |
| Spring Data JPA | Abstração do banco de dados com repositórios |
| Hibernate | ORM para mapeamento objeto-relacional |
| PostgreSQL | Banco de dados relacional |
| Lombok | Redução de boilerplate com anotações (@Getter, @Setter, etc.) |
| Maven | Gerenciamento de dependências e build |
spring.datasource.url=jdbc:postgresql://localhost:5432/carros
spring.datasource.username=postgres
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=trueCom
ddl-auto=update, o Hibernate cria e atualiza as tabelas automaticamente ao subir a aplicação. Não é necessário rodar scripts SQL manualmente.
┌─────────────────────┐ ┌─────────────────────┐
│ Marca │ │ Carro │
├─────────────────────┤ ├─────────────────────┤
│ id (PK) │◄────┐ │ id (PK) │
│ nome │ └────│ marca_id (FK) │
│ carros (OneToMany) │ │ nome │
└─────────────────────┘ │ ano │
└─────────────────────┘
Relacionamento: Uma Marca pode ter muitos Carros (@OneToMany / @ManyToOne), com CascadeType.ALL e orphanRemoval = true — ao remover uma marca, todos os seus carros são removidos automaticamente.
Base URL: http://localhost:8080
| Método | Rota | Descrição |
|---|---|---|
GET |
/api/carro/findAll |
Lista todos os carros |
GET |
/api/carro/findById/{id} |
Busca carro por ID |
GET |
/api/carro/findByNome?nome= |
Busca carros por nome |
GET |
/api/carro/findByMarca?idMarca= |
Filtra carros por marca |
GET |
/api/carro/findAcimaAno?ano= |
Lista carros acima de um determinado ano |
POST |
/api/carro/save |
Cadastra novo carro |
PUT |
/api/carro/update/{id} |
Atualiza carro existente |
DELETE |
/api/carro/delete/{id} |
Remove carro |
| Método | Rota | Descrição |
|---|---|---|
GET |
/api/marca/findAll |
Lista todas as marcas |
GET |
/api/marca/findById/{id} |
Busca marca por ID |
GET |
/api/marca/findByNome?nome= |
Busca marcas por nome (contém, ignora maiúsculas) |
POST |
/api/marca/save |
Cadastra nova marca |
PUT |
/api/marca/update/{id} |
Atualiza marca existente |
DELETE |
/api/marca/deleteById/{id} |
Remove marca |
POST /api/marca/save
{
"nome": "Toyota"
}POST /api/carro/save
{
"nome": "Corolla",
"ano": 2022,
"marca": {
"id": 1
}
}GET /api/carro/findAcimaAno?ano=2020
[
{ "id": 1, "nome": "Corolla", "ano": 2022, "marca": { "id": 1, "nome": "Toyota" } },
{ "id": 2, "nome": "Civic", "ano": 2021, "marca": { "id": 2, "nome": "Honda" } }
]O filtro por ano utiliza uma query JPQL customizada diretamente no repositório, demonstrando o uso de @Query com Spring Data:
@Query("FROM Carro c WHERE c.ano > :ano")
public List<Carro> findAcimaAno(int ano);A busca de marcas por nome ignora diferença entre maiúsculas e minúsculas e aceita trechos parciais, usando o método derivado do Spring Data:
public List<Marca> findByNomeContainingIgnoreCase(String nome);As entidades utilizam Lombok para eliminar boilerplate, mantendo o código legível:
@Getter @Setter
@AllArgsConstructor @NoArgsConstructor
@Entity @Table(name = "carros")
public class Carro { ... }Todos os controllers utilizam @CrossOrigin("*") para permitir requisições do frontend Angular sem bloqueios:
@RestController
@RequestMapping("/api/carro")
@CrossOrigin("*")
public class CarroController { ... }- Java 17+ instalado
- Maven instalado
- PostgreSQL instalado e rodando
git clone https://github.com/seu-usuario/carros-api.git
cd carros-apiCREATE DATABASE carros;Abra o arquivo src/main/resources/application.properties e ajuste:
spring.datasource.url=jdbc:postgresql://localhost:5432/carros
spring.datasource.username=seu_usuario
spring.datasource.password=sua_senha./mvnw spring-boot:runA API estará disponível em:
http://localhost:8080
- Listagem de todos os carros e marcas
- Busca de carro/marca por ID
- Busca de carro por nome
- Busca de marca por nome (parcial e case-insensitive)
- Filtro de carros por marca
- Filtro de carros acima de um determinado ano (JPQL customizado)
- Cadastro de novo carro e nova marca
- Atualização de carro e marca existentes
- Remoção de carro e marca
- Relacionamento
@ManyToOne/@OneToManyentre Carro e Marca - CORS habilitado para integração com frontend
- Desenvolvimento de uma API REST completa com Spring Boot seguindo boas práticas
- Arquitetura em camadas: Controller → Service → Repository → Entity
- Mapeamento de relacionamentos JPA (
@ManyToOne,@OneToMany,CascadeType,orphanRemoval) - Uso de Lombok para código mais limpo e produtivo
- Criação de queries customizadas com
@Query(JPQL) - Uso de métodos derivados do Spring Data para buscas dinâmicas
- Tratamento adequado de status HTTP nas respostas (
201 CREATED,200 OK,400 BAD_REQUEST) - Configuração de CORS para integração com aplicação Angular