API REST desarrollada con Spring Boot 2.2.1, MySQL y Spring Data JPA, que permite la gestión completa de productos: creación, actualización, listado, búsqueda, eliminación y paginación.
El proyecto CRUD Productos ofrece un conjunto de endpoints RESTful para administrar productos en una base de datos MySQL.
Incluye integración con Swagger UI, manejo de DTOs, validaciones, paginación y respuestas estandarizadas mediante un envoltorio (ApiResponser, PageableResponse).
- ☕ Java 8 (1.8.0_202)
- 🚀 Spring Boot 2.2.1
- 🗄️ Spring Data JPA
- 🔄 Hibernate
- 🧰 MySQL 8
- 🔧 ModelMapper 3.1.1
- 🧱 Lombok 1.18.30
- ✅ Spring Validation
- 🧭 Swagger / OpenAPI (springdoc-openapi-starter-webmvc-ui 2.8.3)
src/main/java/com/prueba/crudproductos/
│
├── dto/
│ ├── ProductoCreateDTO.java
│ └── ProductoRequestDTO.java
│
├── rest/
│ └── ProductoController.java
│
├── resource/
│ └── ProductoResource.java
│
├── util/
│ └── response/
│ ├── ApiResponser.java
│ ├── PageableResponse.java
│ └── ProductoResponse.java
│
└── CrudProductosApplication.java
El proyecto sigue una arquitectura en capas:
- Controller (
rest) → Expone los endpoints HTTP. - Resource (
resource) → Contiene la lógica de negocio. - DTOs (
dto) → Estructuras de datos para requests y responses. - Entities & Repositories → Mapeo con la base de datos.
- Utils (
util.response) → Clases auxiliares para respuestas estandarizadas.
spring:
application:
name: crudproductos
datasource:
url: jdbc:mysql://localhost:3306/db_producto?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
dialect: org.hibernate.dialect.MySQL8Dialect
server:
port: 7080
logging:
level:
org.springframework: INFO
com.prueba.crudproductos: DEBUGBase URL:
http://localhost:7080/v1/api/Productos
| Método | Endpoint | Descripción | Cuerpo / Parámetros |
|---|---|---|---|
| POST | /SaveProducto |
Crea un nuevo producto | ProductoCreateDTO |
| PUT | /UpdateProducto/{productoId} |
Actualiza un producto existente | productoId (path), ProductoCreateDTO |
| DELETE | /DeleteProducto/{productoId} |
Elimina un producto por su ID | productoId |
| GET | /GetProductoList |
Obtiene una lista simple de todos los productos | — |
| GET | /GetProductoById/{productoId} |
Obtiene un producto específico | productoId |
| GET | /GetAllProducto |
Obtiene productos paginados | ?Page={n}&Rows={n} |
Request
POST /v1/api/Productos/SaveProducto
Content-Type: application/jsonBody
{
"nombre": "Laptop Pro X",
"descripcion": "Laptop potente con procesador Intel i7, 16GB RAM y SSD 1TB",
"cantidad": 10,
"precio": 4899.99
}Response
{
"status": 201,
"message": "Producto registrado correctamente",
"data": {
"productoId": 1,
"nombre": "Laptop Pro X"
}
}Request
PUT /v1/api/Productos/UpdateProducto/1
Content-Type: application/jsonBody
{
"nombre": "Laptop Pro X 2025",
"descripcion": "Laptop actualizada con procesador i9 y 32GB RAM",
"cantidad": 8,
"precio": 6299.99
}Response
{
"status": 200,
"message": "Producto actualizado correctamente"
}Request
DELETE /v1/api/Productos/DeleteProducto/1Response
{
"status": 200,
"message": "Producto eliminado correctamente"
}Request
GET /v1/api/Productos/GetProductoListResponse
[
{
"productoId": 1,
"nombre": "Laptop Pro X",
"descripcion": "Laptop potente con procesador Intel i7",
"cantidad": 10,
"precio": 4899.99
},
{
"productoId": 2,
"nombre": "Mouse Ergo",
"descripcion": "Mouse inalámbrico ergonómico",
"cantidad": 50,
"precio": 120.5
}
]Request
GET /v1/api/Productos/GetAllProducto?Page=1&Rows=10Response
{
"page": 1,
"totalPages": 5,
"totalElements": 50,
"data": [
{
"productoId": 1,
"nombre": "Laptop Pro X",
"descripcion": "Laptop potente con procesador Intel i7",
"cantidad": 10,
"precio": 4899.99
}
]
}Estandariza las respuestas del API.
public class ApiResponser {
private int status;
private String message;
private Object data;
}Modelo genérico para devolver listas paginadas.
public class PageableResponse<T> {
private int page;
private int totalPages;
private long totalElements;
private List<T> data;
}- Java 8 instalado
- MySQL ejecutándose
- Base de datos creada:
CREATE DATABASE db_producto;
mvn clean install
mvn spring-boot:runEl servicio estará disponible en:
📍 http://localhost:7080
Y la documentación Swagger en:
📘 http://localhost:7080/swagger-ui/index.html
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.8.3</version>
</dependency>
</dependencies>Giancarlo Silva
📚 Proyecto: API REST CRUD Productos
📦 Versión: v1.0.0
🧠 Lenguaje: Java 8
🔗 Framework: Spring Boot