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.