¿Qué son los repositorios de Spring Data y cómo nos ayudan?
Spring Data nos ofrece herramientas poderosas y los repositorios son una de las más destacadas. Diseñados para simplificar el desarrollo de aplicaciones empresariales en Java, estos repositorios nos permiten realizar operaciones en bases de datos sin tener que escribir código complejo. A través de ellos, operaciones comunes como eliminar, encontrar registros o guardar información se ejecutan de manera automática. Los tipos de repositorios que Spring Data ofrece incluyen:
CrudRepository: Permite realizar operaciones básicas como crear, leer, actualizar y borrar.
PagingAndSortingRepository: Además de las capacidades del CrudRepository, permite el paginado y ordenamiento de datos.
JpaRepository: Combina las funcionalidades anteriores y ofrece características específicas de JPA, como Flush.
¿Cómo crear un repositorio usando Spring Data?
Para utilizar los repositorios de Spring Data, primero creamos una interfaz dentro de nuestro paquete CRUD. Sigue estos pasos:
Crea una nueva interfaz llamada ProductoCrudRepository.
Indica que esta interfaz extiende de CrudRepository.
Sustituye Java class por interfaz en el editor. La interfaz es generada automáticamente.
Especifica dos tipos para CrudRepository: el tipo de la tabla (e.g., Producto) y el tipo de la clave primaria (e.g., Integer).
Este simple código nos permite delegar las operaciones de base de datos a las capacidades de Spring Data, evitando la necesidad de un código más extenso y complejo.
¿Qué métodos proporciona un CrudRepository?
Los métodos que incluye CrudRepository son variados y útiles para gestionar datos:
save: Guarda una entidad específica.
saveAll: Guarda una lista completa de entidades.
findById: Recupera una entidad usando su ID.
existsById: Verifica la existencia de un registro en la base de datos.
findAll: Recupera todos los registros de una tabla.
findAllById: Recupera los registros que pertenecen a una lista de IDs.
count: Cuenta cuántos registros existen en una tabla.
deleteById: Borra un registro específico por su ID.
deleteAll: Borra todos los registros o una lista específica de registros.
Estos métodos simplifican enormemente el manejo de datos y son inmediatos de usar sin necesidad de implementación adicional.
¿Cómo implementar un repositorio personalizado?
Para implementar un repositorio personalizado que recupere todos los productos de una base de datos, sigue estos pasos:
Crea una nueva clase llamada ProductoRepositorio.
Define un atributo privado del tipo ProductoCrudRepository.
Implementa un método para recuperar todos los productos.
Este método utiliza el método findAll de ProductoCrudRepository para obtener y devolver la lista completa de productos desde la base de datos.
Ventajas de usar Spring Data
Simplificación del desarrollo: Al abstraer las operaciones de base de datos, Spring Data reduce significativamente la cantidad de código necesario.
Flexibilidad y eficiencia: Permite implementar operaciones complejas de manera simple.
Mantenibilidad: El uso de interfaces y métodos predefinidos facilita la actualización y el mantenimiento del código a lo largo del tiempo.
Explorar y entender los repositorios de Spring Data es esencial para mejorar tus habilidades en el desarrollo de aplicaciones Java eficientes y robustas. ¡Mantén la curiosidad y sigue aprendiendo!
Me está pareciendo de los mejores cursos de código que he visto en Platzi, espero que siga así de claro y entretenido!
A mi tambien
opino lo mismo, esta genial este curso
Tres tipos de repositorios:
CrudRepository: realizar el crue
PagingAndSortingRepository: incluye lo de Crud repository ademas de paginación y ordenamiento.
JPARepository: Ademas de tener CrudRepository y PagingAndSortingRepository nos permite tareas específicas como Flush.
Hasta el momento, me parece unos de los mejores cursos estructurados y explicados de toda la plataforma, excelente
De los pocos cursos de Platzi que verdaderamente son joyas
Excelente! hasta el momento, este curso me ha encantado esta muy bien estructurado
Muy buen curso la verdad
Que buen curso, buen profesor, estuve haciendo el otro de spring boot y me decepcione, este curso si esta bien hecho, bien explicado, ejemplos reales y se llega a cierta profundidad de spring
Dos preguntas:
¿Qué hay de la anotación @Repository para la interfaz ProductoCrudRepository?
¿ProductoRepository no debería ser llamada ProductoService, debido a que es la clase que expondrá la comunicación con la capa de persistencia?
La interfaz ProductoCrudRepository no recibe la anotación @Repository (De hecho por herencia recibe @NoRepositoryBean). Ya vas a ver que en un par de clases más adelante es la clase ProductoRepository la que recibe esta anotación.
Como vimos cuando creamos la estructura del proyecto, el servicio (más adelante ProductService) está en la capa del dominio y llama al repositorio (que es una interfaz implementada luego por ProductoRepository). En algunas clases más adelante te encontrarás con esto.
Mucgas gracia
Repositorios de Spring DataCrudRepository: Permite hacer las operaciones de CRUD.
PagingAndSortingRepository: Nos permite hacer todo lo que hace el CrudRepository pero adicionalmente nos permite hacer tareas de ordenación y paginamiento de nuestro repositorio.
JPARepository: Nos permite hacer lo mismo que los dos anteriores, pero además nos permite hacer tareas de JPA específicas como Flush que combina o guarda todo en memoria sin que otras entidades o entornos vean esos cambios en la base de datos.
Por si les interesa les comparto el link los metodos implementados para la interface CrudRepository<T, ID>
Tengo una duda,¿por qué tenemos que crear una clase ProductRepository si podemos usar directamente la interfaz CrudRepository?
¿es para no depender de la implementación de spring?
Más que no depender de la implementación de Spring, esto nos ayuda a no acoplar nuestra aplicación a una base de datos puntual. Más adelante vas a ver como creamos algunas otras interfaces y clases para que la desacoplemos directamente de las bases de datos relacionales.
Esto se hace para seguir los principos SOLID que nos ayuda a desarrollar código de calidad.
S.O.L.I.D. por sus siglas en inglés:
Single responsibility.
Open/closed principle.
Liskov substitution.
Interface segregation principle.
Dependency inversion principle (Esta especificamente es la respuesta a tu pregunta, nos dice que debemos depender de abstracciones, en este caso la interfaz).
En este artículo lo explican muy bien
De los mejores cursos de Platzi.. de verdad... porque no hay mas de este muchacho
A mi solo me quedo duda de por que no utilizo la interfaz JPARepository si esta implementa a las otras dos, así aprovechariamos todas sus funcionalidades. O si es más bien decisión de uno cual utilizar.
Usar uno u otro es una cuestión de necesidades. En este caso no necesito todas las funcionalidades de JPARepository y con el CrudRepository me basta para lo que debo ocupar en el proyecto.
Por si alguno tenía aún la duda del por qué usamos <u>Wrappers </u>u objetos como Integer en lugar de el primitivo int, aquí en esta clase hay una muy buena razón del por qué.
La interfaz CrudRepository<T, ID> usa generics. Los generics son los parámetros que van dentro del operador diamante y tienen una particularidad; ellos solo reciben Objetos, nada de primitivos. Es por esto que si tenemos nuestro id como tipo int, no podríamos pasarlo a esta interfaz pues ella solo recibe objetos como Integer.
¿En los videos anteriores también es considerado como Spring Data?, ya que observe que se importaban bibliotecas desde persistence en los videos anteriores y en este ya se importaba desde springframework.data
¿Qué tal Luis? Que bueno verte tan activo en el curso.
Toda esta sección se llama "Spring Data" porque incluye implicitamente JPA.
Ves que se importan clases e interfaces de javax.persistence porque al incluir en nuestro proyecto la dependencia de Spring Data también estamos incluyendo todo lo referente a la especificación JPA. Es decir, dicha dependencia incluye internamente todo lo necesario para trabajar con JPA (Por eso se llama Spring Data JPA).
Cabe mencionar también que Spring Data JPA usa Hibernate por defecto como implementación de JPA.
Gracias @soyalejoramirez :)
Cuál sería el patrón de diseño de esta aplicación?
La Arquitectura es por Capas orientado al Dominio.
Dios mio que buen paso lleva, asi deberian de ser todas las clases.
Curso bueno y este ala.. excelente omeee.
¿El CrudRepository es como el DAO?
Si compañero lo puedes ver de esa manera, en el patrón de diseño DAO también creamos una interfaz DAO donde agregamos los métodos del CRUD para implementarlos en otras clases, la diferencia de esto es que con CrudRepository de SpringData simplemente tenemos que extender de CrudRepository y nos hace la magia en cambio en dao tenemos que hacer la implementación de todo el crud :S o de los métodos que agregaste en tu interfaz DAO . nota: Esto solo lo menciono por hacer una comparación con lo que tu ya conoces pero son patrones de diseño distintos. Dao es un patrón de diseño y spring ocupa n patrones de diseño.
Excelente que buen comentario gracias por despejar esa duda @dutey
jajajaja vengo de la seccion 23 y ya se me quitaron las ganas de seguir con el curso jajaja
¿Por qué?
no, ya regresé al buen camino
Haciendo un Test al método getAll(), este no pasa el Test ya que el valor de productoCrudRepository es null. Esto es así porque falta incluir la anotación @Autowired para inyectar esa dependencia, tema q debió enseñarse primero para que pueda entenderse bien esta clase ya que tal como está el código no funciona
Es correcto compañero, o en su defecto anotar la clase ProductRepository con @Repository y definir el campo productCrudRepository como final e inyectar la dependencia por constructor.