Persistencia
Spring Data
Repositorios
Representan las operaciones de persistencia que se pueden realizar sobre las entidades. La interfaz CrudRepository de Spring Data JPA ya viene con las operaciones básicas para crear, leer, actualizar y borrar (CRUD) su entidad asociada. Para ver cómo se usa, vamos a mejorar el API de contadores para que los guarde en BD:
- Crea el repositorio CRUD de la entidad
Contadoren un paquete llamado "repositorio":public interface RepoContador extends CrudRepository<Contador, Long> {} - Crea el controlador del API REST de contadores en un paquete llamado "controlador":
@RestController public class ControladorContadores { @Autowired RepoContador repoContador; @PostMapping("/api/contadores") @ResponseStatus(HttpStatus.CREATED) public Contador crea(@RequestBody Contador contadorNuevo) { return null; } @GetMapping("/api/contadores/{nombre}") public Contador lee(@PathVariable String nombre) { return null; } @PutMapping("/api/contadores/{nombre}/incremento/{incremento}") public Contador incrementa(@PathVariable String nombre, @PathVariable Long incremento) { return null; } @DeleteMapping("/api/contadores/{nombre}") public void borra(@PathVariable String nombre) { } }
❓ Ejercicio 1: Implementa el método
creautilizando la operación de guardar entidad derepoContador1. Arranca la aplicación JPA y llama al endpoint del API para crear un contador. Reinicia la aplicación y vuelve a crear el mismo contador. Explica el comportamiento ayudándote de las trazas del servidor.
❓ Ejercicio 2: Para implementar el método
leenecesitamos consultar por nombre, yRepoContadorno tiene esa consulta particular. Para añadir una, basta con crear un método con nombre específico en el repositorio:Contador findByNombre(String nombre). Añádelo aRepoContadory úsalo para implementarlee. ¿Cuál sería suselectequivalente?
❓ Ejercicio 3: Implementa el método
incrementa, primero leyendo (ejercicio 2), y luego guardando (ejercicio 1) la entidad incrementada.
❓ Ejercicio 4: JPA permite utilizar SQL para consultas más complejas que no puedan hacerse con los mecanismos anteriores. Para implementar
borra2, añade el siguiente método al repositorio, y completa su "SQL" para que borre por nombre del contador:@Query(value = "SQL", nativeQuery = true) @Transanctional @Modifying int borraPorNombre(String nombre).
Su valor ha sido inyectado automáticamente por el contenedor de Spring con la implementación automática del repositorio del punto 1.
Para borrar por nombre, también podríamos usar la misma mécanica del ejercicio 2, pero con "delete": @Transactional void deleteByNombre(String nombre).