Ejecución de Store Procedures en Spring Data
Clase 24 de 25 • Curso de Java Spring Data JPA: Bases de Datos
Contenido del curso
Primeros pasos
Spring Data Repositories
- 7

Uso de Spring Data Repositories para Gestión de Datos
08:39 min - 8

Guardar y Actualizar Registros con Spring Data Repositories
08:34 min - 9

Eliminar elementos con Spring Data JPA: método deleteById
05:36 min - 10

Gestión de Relaciones en JPA: Lazy vs Eager Fetching
15:09 min - 11

Query Methods en Spring para Consultas Personalizadas
08:28 min - 12

Filtrado de Pizzas por Ingredientes usando Query Methods
07:27 min - 13

Consultas Avanzadas con Query Methods en Java Spring
11:25 min - 14

Uso de Query Methods para Filtrar y Ordenar Datos en Spring
09:30 min - 15

Paginación y Ordenación con Spring Data Repositories
07:39 min - 16

Ordenamiento Dinámico con Paging and Sorting Repository
07:58 min
Personalización de queries
- 17

Consultas de Base de Datos con JPQL en Spring Boot
08:01 min - 18

Consultas SQL nativas y ordenación con Hibernate en Spring Data
08:26 min - 19

Uso de Proyecciones en Queries Personalizados con Java y SQL
13:47 min - 20

Actualización de Precios de Pizza con Spring Data JPA
11:50 min - 21

Propiedades ACID y Spring Data: Uso de @Transactional
10:07 min
Características avanzadas
Próximos pasos
¿Cómo utilizar store procedures en Spring Data?
En el desarrollo de aplicaciones, recurrir a los store procedures es una práctica común para manejar operaciones complejas en bases de datos, garantizando mantenimiento y eficiencia. Spring Data, un proyecto del ecosistema Spring, nos facilita esta tarea a través de la anotación @Procedure, permitiendo declarar y ejecutar store procedures de una manera sencilla. En esta guía aprenderás a implementar funciones que añaden valor a tus aplicaciones mediante un ejemplo práctico.
¿Qué es un store procedure y cómo lo manejamos?
Un store procedure es un bloque de código almacenado y reutilizable que permite realizar operaciones complejas en la base de datos, agrupando múltiples instrucciones SQL. Esto puede incluir selecciones, inserciones, o control de transacciones, incrementando tanto la eficiencia como la seguridad de las operaciones. En nuestro caso, utilizamos un store procedure que brinda una promoción del 20% de descuento al ordenar una pizza aleatoria.
¿Cómo implementar un store procedure en Spring Data?
Paso 1: Definir el store procedure en la base de datos
En este ejemplo, comenzamos definiendo nuestro store procedure en MySQL, nombrando el procedimiento TakeRandomPizzaOrder. Este procedimiento:
- Recibe como parámetros: la identificación del usuario y el método de envío.
- Gira dentro de una transacción para controlar errores y asegurar el rollback en casos de fallo.
- Selecciona una pizza de manera aleatoria, calcula el precio con un 20% de descuento y registra la orden en la base de datos.
Código del store procedure
DELIMITER //
CREATE PROCEDURE TakeRandomPizzaOrder(
IN userId INT,
IN method VARCHAR(255),
OUT orderTaken BOOLEAN
)
BEGIN
DECLARE pId INT;
DECLARE price DECIMAL(8,2);
DECLARE discountPrice DECIMAL(8,2);
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET orderTaken = FALSE;
ROLLBACK;
END;
START TRANSACTION;
SELECT id, price INTO pId, price
FROM pizza
WHERE available = TRUE
ORDER BY RAND() LIMIT 1;
SET discountPrice = price - (price * 0.2);
INSERT INTO pizza_order (customer_id, date, discounted_price, method, notes)
VALUES (userId, NOW(), discountPrice, method, '20% discount for random order');
SET orderTaken = TRUE;
COMMIT;
END //
DELIMITER ;
Paso 2: Implementación en el repositorio de Spring Data
Declara el store procedure en tu repositorio utilizando la anotación @Procedure. Define los parámetros de entrada y el parámetro de salida que recibirá su valor booleano.
Código en Java en el repositorio
public interface OrderRepository extends CrudRepository<Order, Integer> {
@Procedure(name = "TakeRandomPizzaOrder")
boolean saveRandomOrder(@Param("id_customer") String idCustomer,
@Param("method") String method);
}
¿Cómo crear un servicio y controlador que utilicen el store procedure?
Paso 3: Crear el servicio
Utiliza la anotación @Transactional para manejar de manera adecuada las transacciones del store procedure en tu método saveRandomOrder.
Código del servicio
@Service
public class OrderService {
private final OrderRepository orderRepository;
@Autowired
public OrderService(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
@Transactional
public boolean saveRandomOrder(RandomOrderDTO dto) {
return orderRepository.saveRandomOrder(dto.getIdCustomer(), dto.getMethod());
}
}
Paso 4: Configurar el controlador
Desarrolla el controlador para gestionar las peticiones HTTP. Esto permitirá recibir peticiones POST y ejecutar el store procedure en consecuencia.
Código del controlador
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
@PostMapping("/order/random")
public ResponseEntity<Boolean> randomOrder(@RequestBody RandomOrderDTO dto) {
boolean result = orderService.saveRandomOrder(dto);
return ResponseEntity.ok(result);
}
}
¿Qué aspectos debemos verificar antes de ejecutar el Store Procedure?
- Asegúrate de que el store procedure esté correctamente definido en tu base de datos antes de su ejecución.
- Utiliza herramientas como Postman para enviar las solicitudes post y verificar su correcto funcionamiento.
- Con la anotación
@Transactional, gestiona el compromiso de los datos evitando inconsistencias.
Con estos pasos, estarás listo para integrar store procedures eficazmente en tus aplicaciones desarrolladas con Spring Data. ¡Ah! Y dale la bienvenida al 20% de descuento para tus clientes más aventureros.