SpringBoot
Tutorial SpringBoot: Repositorios Spring Data
Spring Boot repositorios CRUD: manejo y ejemplos. Domina la creación y gestión de repositorios CRUD en Spring Boot con ejemplos prácticos y detallados.
Aprende SpringBoot GRATIS y certifícateUno de los aspectos más interesantes de Spring Boot es su integración con Spring Data, una suite de librerías que proporciona un framework consistente y fácil de usar para el acceso a datos y operaciones de persistencia con bases de datos.
Dentro de Spring Data existen multitud de proyectos como Spring Data JPA, Spring Data MongoDB, Spring Data Redis, etc.
Estos proyectos proporcionan interfaces de las que extender nuestras propias interfaces, lo que nos permite heredar métodos con funcionalidades CRUD (Create, Read, Update, Delete).
CrudRepository
CrudRepository
es una interfaz proporcionada por Spring Data que proporciona métodos genéricos para operaciones CRUD (Create, Read, Update, Delete) en una entidad de dominio.
Al extender CrudRepository
, el desarrollador obtiene varios métodos listos para usar sin necesidad de implementarlos manualmente. Algunos de estos métodos son:
save(S entity)
: Guarda la entidad dada. Si la entidad ya existe, la actualiza.findById(ID id)
: Retorna una entidad por su ID.existsById(ID id)
: Verifica si una entidad existe por su ID.findAll()
: Retorna todas las entidades.deleteById(ID id)
: Borra la entidad por su ID.deleteAll()
: Borra todas las entidades.
Por ejemplo, si se tiene una entidad User
, se puede crear un repositorio UserRepository
de la siguiente manera:
import org.springframework.data.repository.CrudRepository;
public interface UserRepository extends CrudRepository<User, Long> {
}
Una vez que se ha creado este repositorio, se puede inyectar en cualquier clase y usarlo para realizar operaciones CRUD en la entidad User
.
JpaRepository
JpaRepository
es otra interfaz proporcionada por Spring Data que extiende CrudRepository
y PagingAndSortingRepository
(que proporciona métodos para paginar y ordenar registros). Por lo tanto, JpaRepository
hereda todos los métodos de estas dos interfaces.
JpaRepository
también proporciona algunas funcionalidades adicionales específicas de JPA, como:
flush()
: Aplica todas las operaciones pendientes a la base de datos.deleteAllInBatch(Iterable<T> entities)
: Borra las entidades en un lote, lo que es más eficiente que borrar una por una.<S extends T> List<S> findAll(Example<S> example)
: Soporte para consultas de ejemplo con la API Query By Example.
Aquí hay un ejemplo de cómo se puede crear un repositorio UserRepository
que extiende JpaRepository
:
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
De igual manera que con CrudRepository
, una vez que se ha creado este repositorio, se puede inyectar en cualquier clase y usarlo para realizar operaciones CRUD, además de las operaciones adicionales proporcionadas por JpaRepository
, en la entidad User
.
Es importante mencionar que, si bien JpaRepository
proporciona más funcionalidad que CrudRepository
, no todas las aplicaciones necesitarán esta funcionalidad adicional. Por lo tanto, el desarrollador debe considerar cuidadosamente qué interfaz es la más adecuada para sus necesidades específicas.
Operaciones derivadas del nombre del método
Spring Data JPA tiene una característica poderosa que permite crear consultas simplemente definiendo una interfaz de método en el repositorio. Este enfoque es mejor conocido como "operaciones derivadas del nombre del método".
En este sistema, el nombre de los métodos de la interfaz del repositorio sigue una convención que Spring Data interpreta y traduce en la consulta SQL correspondiente. Por ejemplo, si tu entidad tiene un campo llamado email
y quieres buscar una entidad basándote en ese campo, puedes añadir el método findByEmail(String email)
a tu repositorio. No necesitas proporcionar ninguna implementación para este método. En tiempo de ejecución, Spring Data generará una implementación adecuada.
Aquí hay un ejemplo con una entidad User
y un repositorio UserRepository
:
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface UserRepository extends CrudRepository<User, Long> {
List<User> findByEmail(String email);
}
Cuando este código se ejecuta, Spring Data JPA creará una implementación del método findByEmail
que ejecuta una consulta SQL similar a SELECT * FROM user WHERE email = ?
.
La convención de nomenclatura soporta varias palabras clave que pueden ayudar a construir consultas más complejas, como And
, Or
, Between
, LessThan
, GreaterThan
, Like
, OrderBy
, y muchas más. Por ejemplo:
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface UserRepository extends CrudRepository<User, Long> {
List<User> findByEmailAndFirstName(String email, String firstName);
List<User> findByAgeBetween(int startAge, int endAge);
List<User> findByLastNameLike(String lastName);
List<User> findByAgeGreaterThan(int age);
List<User> findByFirstNameOrderByLastNameAsc(String firstName);
}
Estos métodos se traducirán en las siguientes consultas SQL:
SELECT * FROM user WHERE email = ? AND firstName = ?
SELECT * FROM user WHERE age BETWEEN ? AND ?
SELECT * FROM user WHERE lastName LIKE ?
SELECT * FROM user WHERE age > ?
SELECT * FROM user WHERE firstName = ? ORDER BY lastName ASC
Es importante recordar que, aunque las operaciones derivadas del nombre del método pueden simplificar la implementación de las operaciones de consulta comunes, también pueden llevar a nombres de métodos largos y difíciles de leer para consultas más complejas. En tales casos, puede ser preferible utilizar la anotación @Query
para definir la consulta directamente.
Consultas personalizadas
Si bien las operaciones derivadas del nombre del método son poderosas y cubren una gran cantidad de casos de uso comunes, hay momentos en que se necesita un mayor control sobre la consulta de la base de datos. Para estos casos, Spring Data JPA proporciona una forma de especificar consultas personalizadas a través de la anotación @Query
.
La anotación @Query
se puede utilizar para especificar una consulta JPQL (Java Persistence Query Language) que será ejecutada. La consulta puede hacer referencia a los parámetros del método utilizando un índice basado en 1 precedido por un signo de interrogación.
Por ejemplo, si se quiere buscar usuarios por su apellido, pero solo se quiere retornar aquellos usuarios que tengan un correo electrónico que termine con un cierto dominio, se podría utilizar la anotación @Query
para definir esta consulta personalizada en la interfaz del repositorio:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.lastName = ?1 AND u.email LIKE %?2")
List<User> findByLastNameAndEmailDomain(String lastName, String emailDomain);
}
En este caso, ?1
se refiere al primer parámetro del método (lastName
) y %?2
se refiere al segundo parámetro (emailDomain
), con un símbolo de porcentaje (%) añadido para la operación LIKE.
La anotación @Query
también puede ser utilizada para ejecutar consultas nativas SQL, simplemente pasando el atributo nativeQuery = true
a la anotación. Por ejemplo:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT * FROM Users u WHERE u.last_name = ?1 AND u.email LIKE %?2", nativeQuery = true)
List<User> findByLastNameAndEmailDomain(String lastName, String emailDomain);
}
Aquí se está ejecutando una consulta SQL nativa en lugar de una consulta JPQL. Por favor, ten en cuenta que las consultas nativas son específicas de la base de datos y no son portables entre diferentes tipos de bases de datos.
Las consultas personalizadas proporcionan un gran nivel de control sobre las operaciones de la base de datos y permiten al desarrollador escribir consultas complejas que no pueden ser fácilmente expresadas a través de las operaciones derivadas del nombre del método.
Conclusión
Los repositorios de Spring Data representan una poderosa abstracción que simplifica el desarrollo de capas de persistencia en aplicaciones Spring Boot. Permiten a los desarrolladores centrarse en la lógica de negocio de su aplicación, evitando el código repetitivo y reduciendo la posibilidad de errores en la manipulación de datos.
Las interfaces CrudRepository
y JpaRepository
proporcionan una amplia gama de métodos para realizar operaciones de la base de datos sin necesidad de implementarlos. Estos repositorios pueden adaptarse a casi cualquier requisito, ya que ofrecen una manera de realizar operaciones básicas de CRUD, así como paginación y ordenación.
Además, los repositorios de Spring Data tienen la característica única de permitir la creación de consultas simplemente definiendo métodos en la interfaz del repositorio, una funcionalidad conocida como "operaciones derivadas del nombre del método". Esta característica puede simplificar enormemente el proceso de escritura de consultas para casos comunes.
Sin embargo, para casos más complejos que requieran consultas personalizadas, Spring Data JPA ofrece la anotación @Query
. Esta anotación permite a los desarrolladores escribir consultas personalizadas utilizando JPQL o incluso SQL nativo, proporcionando un gran nivel de flexibilidad y control.
En general, los repositorios de Spring Data aportan una gran productividad y eficiencia al proceso de desarrollo, ya que minimizan la cantidad de código que se necesita escribir y mantienen la base de código más limpia y fácil de mantener. Independientemente de las necesidades específicas de la aplicación, es probable que los repositorios de Spring Data puedan adaptarse y proporcionar una solución efectiva y eficiente para la persistencia de datos.
Ejercicios de esta lección Repositorios Spring Data
Evalúa tus conocimientos de esta lección Repositorios Spring Data con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Web y Test Starters
Entidades JPA
Repositorios reactivos
Inserción de datos
Borrar datos de base de datos
Controladores Spring MVC
CRUD Customers Spring MVC + Spring Data JPA
Backend API REST con Spring Boot
Operadores Reactivos
Controladores Spring REST
Uso de Spring con Thymeleaf
Crear entidades JPA
Registro de usuarios
CRUD y JPA Repository
Anotaciones y mapeo en JPA
Integración con Vue
Consultas JPQL con @Query en Spring Data JPA
Open API y cómo agregarlo en Spring Boot
Uso de Controladores REST
API Specification
Inyección de dependencias
Introducción a Spring Boot
Consultas JPQL con @Query en Spring Data JPA
API Query By Example (QBE)
Inyección de dependencias
Vista en Spring MVC con Thymeleaf
Servicios en Spring
Configuración de Vue
Integración con Angular
API Query By Example (QBE)
API Specification
Controladores MVC
Métodos find en repositorios
Repositorios Spring Data
Inyección de dependencias
Data JPA y Mail Starters
Configuración de Angular
Controladores Spring REST
Configuración de Controladores MVC
Asociaciones de entidades JPA
Actualizar datos de base de datos
Identificadores y relaciones JPA
Verificar token JWT en peticiones
Login de usuarios
Integración con React
Configuración de React
Asociaciones en JPA
Consultas JPQL
Todas las lecciones de SpringBoot
Accede a todas las lecciones de SpringBoot y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Spring Boot
Introducción Y Entorno
Spring Boot Starters
Introducción Y Entorno
Inyección De Dependencias
Introducción Y Entorno
Controladores Spring Mvc
Spring Web
Vista En Spring Mvc Con Thymeleaf
Spring Web
Controladores Spring Rest
Spring Web
Open Api Y Cómo Agregarlo En Spring Boot
Spring Web
Servicios En Spring
Spring Web
Crear Entidades Jpa
Persistencia Con Spring Data
Asociaciones De Entidades Jpa
Persistencia Con Spring Data
Repositorios Spring Data
Persistencia Con Spring Data
Métodos Find En Repositorios
Persistencia Con Spring Data
Inserción De Datos
Persistencia Con Spring Data
Actualizar Datos De Base De Datos
Persistencia Con Spring Data
Borrar Datos De Base De Datos
Persistencia Con Spring Data
Consultas Jpql Con @Query En Spring Data Jpa
Persistencia Con Spring Data
Api Query By Example (Qbe)
Persistencia Con Spring Data
Repositorios Reactivos
Persistencia Con Spring Data
Api Specification
Persistencia Con Spring Data
Integración Con React
Integración Frontend
Integración Con Vue
Integración Frontend
Integración Con Angular
Integración Frontend
Registro De Usuarios
Seguridad Con Spring Security
Login De Usuarios
Seguridad Con Spring Security
Verificar Token Jwt En Peticiones
Seguridad Con Spring Security
En esta lección
Objetivos de aprendizaje de esta lección
- Entender y utilizar las interfaces
CrudRepository
yJpaRepository
: Estas interfaces proporcionan operaciones CRUD listas para usar en cualquier entidad, así como capacidades adicionales como paginación y ordenación. - Crear consultas utilizando operaciones derivadas del nombre del método: Spring Data puede inferir consultas de la base de datos basándose en la convención de nombres de los métodos en la interfaz del repositorio.
- Definir consultas personalizadas utilizando la anotación
@Query
: Para consultas más complejas, Spring Data permite la definición de consultas personalizadas usando JPQL o SQL nativo. - Aplicar correctamente la elección del repositorio según el caso de uso: Distinguir cuándo usar
CrudRepository
,JpaRepository
o consultas personalizadas, dependiendo de las necesidades específicas del proyecto.