Me sumo a los comentrios. Me encanta como desglosa los conceptos complicados y los hace accesibles para todos los niveles. Además genera coriosidad por seguir aprendiendo. (mapStruct y métodos query )
Después de buscar entre un mar de videos, contenido y cosas sin sentidos, al fin encuentro algo que si se entiende y que me puede servir de impulso para mi futuro en Spring, muchas gracias profe, de verdad le agradezco, espero siga subiendo contenido!
tengo aprox. 8 dias para aprender lo básico de springboot, incluido las APIs rest, este es mi primer video y puedo decir que entendí muchos conceptos que antes parecían complicados, muchas gracias
Mis mejores deseos, tu canal el de los más valorados para mi persona ya que sueles crear excelente contenido, personalmente mejor que cursos de pago de udemy.
Muchas gracias por compartir tu conocimiento y sobre todo porque además de completo y actualizado, está muy bien explicado. De igual forma, la forma en la que explicas paso a paso es de lo mejor que he visto en youtube, porque llevas lo complejo a lo sencillo y eso no lo hace cualquiera. Muchas felicitaciones por esta labor que simplemente te engrandece. Nunca dejes esta obra que ayuda a tantas personas, para en un futuro mejorar su calidad de vida. Un abrazo. Muchas bendiciones.
Excelente, muy bien explicado. Eres un gran maestro y explicas con mucha humildad. Esto lo que necesitaba para aprender de api rest, como hacer los crud y la importancia del DTO.
te hago una consulta: veo que se usan en algunos proyectos otras dependencias, es decir, al crear el proyecto en Sprint. Sera que depende el tipo de Api? cuando puedas agradeceria tu comentario. Mil gracias.
Yo tengo una duda, cuál es la diferencia de api rest y un CRUD ? O es lo mismo ? 🤔 Por qué se que creas eliminas etc pero no sé cuándo es api y cuando es CRUD por qué siempre veo todo completo
@@jonnathangonzalez8639 Bueno un crud en un conjunto basico de operaciones que vendrían a ser Crear,Leer,Actualizar y Borrar, mientras la api rest es un estilo de arquitectura para diseñar servicios web y por la cual la apirest implementa las operaciones crud
@@jonnathangonzalez8639 api rest es un crud sin front, el crud es un api rest con un front donde ves todo lindo y simple, en un api rest haces un crud pero mediante rutas url
Muchas gracias por el gran aporte me sirve mucho para practicar, y tomar algunas cosas que me parecen mas practicas de la forma que tu lo haces, me voy construyendo como backend con aportes de muchos y claro algo mío, me considero no junior sino baby ja ja ja ja ja ja ja
Hola, muchas gracias por tu comentario. Todos iniciamos así, no te preocupes. Solo sigue adelante y no te frustres si se te hace complicado algún tema, tu solo sigue. Un programador nace programando. ¡Saludos!
un vido explicando más a detalle el uso de queryes ya que los ejemplos son los convencionales el tipico crud con jpa o crud repository, pero para hacer consultas más avanzadas
Muchísimas, muchísimas gracias en verdad por este video Tutorial, este ha sido mi primer API que he hecho en toda mi vida, y le doy las gracias por guiarme en este camino. Espero que pueda también crear un video sobre cómo consumir esta API en un frontEnd(Android o Web). Saludos y bendiciones :D
Excelente contenido, tienes pensado hacer un video sobre el manejo de errores con RestControllerAdvice y Handler? Estaría genial, gracias por compartir tus conocimientos ✌️
WOWWWW El mejor video sobre Spring Boot en todo youtube, muchas gracias, en caso de tener cursos en Udemy nos avisa ojala haga tambien de microservicios Muchas gracias por compartir su conocimiento 🙏☺
Muchas gracias por el video, es perfecto, espero y continúes con algún video para mejorar la parte del Testeo con Junit y mockito siempre y cuando puedas, muchas gracias y un cordial saludo.
gracias por otro video sensacional, escuche de una tecnologia llamada swagger podrias hacer un video enseñando como implementar con este mismo proyecto :3
Hola, viendo este video me he fijado en algunas cosas y me surgieron las siguientes dudas, seria bueno que por favor me contestaras por puro aprendizaje, ya que no se cuando usar una u otra cosa: 1- Por que se utiliza CrudRepository en vez de JPARepository? 2- Por que utilizar el patrón DAO y no un DTO al momento de realizar la persistencia de la data? Muchas gracias, excelente contenido!
Hola, muchas gracias por tu comentario. Tus preguntas son bastante habituales al empezar a trabajar con Spring, así que intentaré explicar de la manera más clara posible, aunque el segundo punto amerita un tutorial completo. Respuestas: 1) JPA dispone de distintos repositorios, entre ellos se encuentran CrudRepository, JpaRepository y PagingAndSortingRepository, entre muchos otros. Puedes elegir el que prefieras, pero la elección dependerá de las necesidades de tu proyecto, ya que cada repositorio ofrece características propias. En este caso, utilizamos CrudRepository porque solo necesitamos las operaciones básicas de un CRUD. 2) Los DTO (Data Transfer Object) son objetos que se utilizan para transferir y propagar datos dentro de nuestra aplicación, mientras que los DAO (Data Access Object) se emplean exclusivamente para el acceso a datos. En conclusión, utiliza DTO cuando necesites recibir, devolver y propagar datos en tu aplicación, y DAO cuando estés realizando operaciones con la base de datos. Es una mala práctica interactuar con bases de datos utilizando DTO, así como también lo es devolver datos directamente al cliente usando DAO. Espero que estas aclaraciones te hayan sido de ayuda. ¡Saludos!
Excelente video, te felicito!! Gracias por compartir tus conocimientos!! Me queda la duda de cómo manejar las validaciones de los inputs, por ejemplo sanitizar la entrada en caso de que traiga información adicional, validar que los tipos sean correctos, etc. Ojalá más adelante puedas hacer un video sobre eso 😇
Hola, ya tengo un vídeo en el canal en dónde enseño a validar la información, te comparto el enlace: ruclips.net/video/a3l1zmcNwjQ/видео.htmlsi=yOPgFbRtSW5SYZJe Te invito a darte un paseo por los vídeos del canal, sé que encontrarás información interesante. Espero que te sirva. ¡Saludos!
Hola, gracias por comentar. Te explico brevemente: DAO y DTO son 2 patrones de arquitectura que cumplen funciones diferentes. DAO (Data access Object) son objetos que se usan para interactuar con la base de datos, punto. DTO (Data transfer Object) se usa para transferir o compartir atributos entre objetos. Básicamente es eso. ¡Saludos!
Hermano de antemano mil gracias por su valioso aporte. Excelente!! sabe que hice todo lo indicado en el video (soy nuevo con springboot), en el min 48 al levantar la aplicación y e intentar hacer las pruebas con el postman...no da error pero..., se produce una desconexión inusual de la aplicación 😕tengo más de una semana intentando resolver este error y nada, he ingresado a stackoverflow buscando la solución a este problema, he hecho lo que allí sugieren para resolver este inconveniente pero nada resulta. Es una gran piedra en el zapato este No error pero si desconexión inusual de la apliación pues..al no estar ejecutandose no puedo hacer las pruebas del postman. 😵😕. Las últimas lineas al ejecutar la aplicación=>Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 2024-10-18T11:21:09.187-04:00 INFO 12124 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2024-10-18T11:21:09.189-04:00 INFO 12124 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2024-10-18T11:21:09.194-04:00 INFO 12124 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. Acá el proyecto en github=> github.com/djaimes99/ApiRestFul-with-SpringBoot. 😕👍
Hola Santi, primero quiero felicitarte porque se entiende todo a la perfección igual que tus otros videos. Quería consultarte por las clases implement tanto de DAO como las de servicio. En ningún momento se utilizan, si se utilizan las interfaces. Probé cambiando las clases por las interfaces donde estaban siendo utilizadas y sigue funcionando a la perfección. Mi pregunta es, puede haber algún inconveniente con esto o es lo mismo? Saludos.
Hola, el principio de inyeccion de dependencias nos dice que debemos inyectar los componentes mas genericos y spring boot buscará la implementacion por ti, es por eso que inyectamos las interfaces. ¡Saludos!
Perfecto, voy a investigar sobre el tema entonces. Una última pregunta, que patrón de diseño sería este? Porque se usa DAO pero también se usa repository.
Hola, repository no es un patron de diseño como tal, simplemente es un objeto que por debajo usa el patron DAO. En este video explico a detalle como funciona el patron DAO y su relacion con DTO. ruclips.net/video/XgUEjrTX9Bs/видео.htmlsi=AetgL0-UHRreQWKG ¡Saludos!
Hola, por ahora la mayoría de videos trabajan con arquitectura en capas, por ahora no tengo videos sobre arquitectura limpia pero no descarto la posibilidad de hacerlo. ¡Saludos!
Hola, muchas gracias por el trabajo que haces, por cierto, muy bien hecho. Me gustaria, por mi parte, que fueras mas despacio. Para mi explicas muy rapido, podrias ir mas lento, simplemente una opinion, constructiva. Aun asi, mil gracias, un saludo desde España :)
Excelente canal muy completa la información... podrias hacer alguno con el patron de diseño mvc? Quizas parecido a este? Para saber bien las diferencias entre mvc y dao
Hola, tendré en cuenta tu sugerencia. Te aclaro algo, MVC es un patrón de arquitectura y DAO es un patrón de diseño. Son dos cosas completamente diferentes, más bien la comparación correcta sería: MVC vs Rest. ¡Saludos!
Santiago, gran video, una consulta, he visto que en multiples foros se debate acerca de en cual capa se debe gestionar la conversión de Entity a DTO. ¿En service o en controller? he visto multiples respuestas que recomiendan caminos distintos, en este video veo que lo estas haciendo desde el controller ¿no significaría ello delegar lógica al controller, lo cual no deberia hacerse? ¿que recomendarías en general para hacer la conversión de entity a dto? gracias de antemano.
Muy buen video me encanta xq es un tutorial donde dejas claro las buenas practicas, solo 3cositas: 1. la estructura de carpetas que seguis con el persistence del patron DAO si pudieras indagar mas por que lo usaste, o si con lo que hace JPA por detras ya estaria aplicando DAO? 2. El ResponseEntitity con comodin es mejor usarlo o especificar? que es lo que se usa? 3.Y por ultimo el query que me crea JPA por defecto no me funciono, será que habria que extender de JPARepository y no de CRUDRepository? Y gracias por tan buenos videos, con esta calidad vas a llegar lejos, ya que en el mundo hispano no hay tan buenos tutoriales como los tuyos
Hola, con respecto a tu comentario te comento lo siguiente: 1) La estructura de carpetas no tiene nada que ven con JPA, simplemente uno de los principios de arquitectura de software es el desacoplamiento. En la estructura que usamos dejamos bien separadas las capa servicio, persistencia, controladores, etc. Es un tema muy amplio y daría para un curso completo. 2) Puedes usar el ResponseEntity con comodín o especificar el tipo de dato, cualquiera de las 2 está bien, sin embargo es un poco más recomendable dejar que sea Spring Boot el que gestione la respuesta para poder serializarla con el Jackson ya que en ocasiones tenemos tipos de datos distintos. 3) JpaRepository extiende de CrudRepository, los repositorios de JPA nos sirven para lo mismo con algunas funcionalidades muy específicas, en nuestro caso es indiferente usar uno u otro. En el vídeo no testeamos ese query method, en un próximo video podría ahondar un poco más sobre ese tema. ¡Saludos!
@@Ana-sn5pb Hola, ambos son patrones diferentes, DAO (Data Acceso object) se usa para interactuar con bases de datos y DTO (Data Transfer Object) se usa cuando quieres mapear información de algún objeto. Por ejemplo mapear campos de un objeto DTO a un objeto entity para insertarlo en una BD. ¡Saludos!
Excelente explicacion, muy buenas practicas. De lo mejor que he visto en español !!!! Me gustaria saber si es posible en spring implementar middlewares para validar los parametros de las rutas. Saludos
Hola, usualmente los parametros de validan con una librerìa llamada VALIDATION, puedes agregar dicha libreria desde el Spring Initializr. Pero si quieres tener un codigo que se ejecute antes de llegar al controller podrias implementar un INTERCEPTOR http. Lo interceptores se ejecutan antes del controller y allì puedes ejecutar lo que quieras. Saludos.
@@unprogramadornace gracias por el aporte. Me gustaria ver un video de API REST con todo lo que utilizas en el video y ademas incorporarle INTERCEPTOR , WEBSOCKETS y manejar imagenes desde el backend. Sin duda seria el tutorial mas completo y mejor de youtube. Bendiciones!! Gracias por todo!!!
Buenas profesor, no entiendo el error null cuando lanzas el findbyId, ya que List tiene valores en el 48:30. Sin embargo le pones un JsonIgnore y sí que te muestra los productos, cuando sólo debería obtener el id y nombre del maker al decirle que ignore la lista de productos.
Hola, tu pregunta es bastante interesante. Para que entiendas el concepto debes tener en cuenta el fetch que estamos usando. En el vídeo usamos LAZY, eso quiere decir "carga perezosa", eso lo que hace es que solo se hará la consulta a base de datos cuando se llame al método Get correspondiente del atributo en cuestión. Es por eso que nos devuelve un null, porque no estamos llamando explícitamente al método Get, entonces para evitar ese null le decimos al serializador de Spring que ignore ese campo. ¡Saludos!
@@unprogramadornace Eso es correcto y lo comprendo, pero una vez pones el JsonIgnore, no ignora el campo y SÍ se obtiene el resultado de Lista de Productos, aunque le pones JsonIgnore. Evitas el error de null, pero luego te ofrece el dato. La pregunta concreta es, por qué el endpoint devuelve los datos del maker y el productList, cuando a productList le has puesto un ignore para que no te lo muestre
Hola, le puse @JsonIgnore al entity para que no intente seriazarlo en una primera instancia, despues llamamos al metodo get product list en la clase MakerController en la linea 32. Alli se hace una consulta explicita al metodo get del listado y por eso el me retorna la respuesta. ¡Saludos!
Solo una observación compañero, me corriges si estoy mal; pero me parece que en el min 59:55 cuando creas el update Maker, estas actualizando la entidad Maker y no el makerDTO.
Hola, en efecto tu afirmación es incorrecta. Pero no te preocupes, te digo el por qué. El Maker es un Entity, todas las operaciones que se hagan contra la base de datos deben hacerse con objetos ENTITY. MakerDTO es una clase que implementa el patrón DTO (Data transfer Object), y estos objetos se usan solamente para transferencia de datos o campos. Es un error grande hacer operaciones contra la base de datos con objetos DTO y es por eso que en el segundo 59:55 enviamos el update a la base de datos con el Maker. ¡Saludos!
Gracias por todo hermano, me ha servido mucho... Tengo una duda. Cuando realizas la inyeccion de la dependencia en el MakerServiceImpl, ¿Por se inyecta la interfaz IMakerDao y no la implementacion (MakerDAOImp)? ¿Cual es la diferencia entre inyectar una u otra? De antemano gracias hermano.
Hola, es un primcipio de inyeccion de dependencias, siempre debes inyectar la interface y spring se encargará de buscar la implementacion por ti. ¡Saludos!
Muy bueno tus vídeos y tu enseñanza excelente ,solo tengo una pregunta, sería mejor o buena práctica dejarle la conversión de entidad a dto al service o a otra capa de abstracción para que Endpoint solo tenga la función de entrada y retorno?
Hola, si lo haces en el controller o en el service no hay problema o si quieres abstraer más la aplicación creando otra capa lo puedes hacer, sin embargo ya existen librerías que te hacen el mapeo por ti como mapStruct, orikaMapper, etc. Normalmente esas se usan en el controller. Se tiene la creencia de que el controller solo tiene que tener el llamado al service y ya, y eso no es cierto. El controller puede tener cierta lógica pero no puede ser lógica compleja. ¡Saludos!
Una duda en 1:13:41 aprox, en el método findAll de Product controller, cuando construyes el objeto de respuesta que es una lista , le haces un stream, luego un map y dentro del map una funcion lambda donde cada product lo conviertes a un ProductDTO le seteas el maker con product.getMaker(), aqui no se estaría violando el principio de no enviar en la respuesta entidades de negocio, y deberia ser un makerDTO, es decir se tendría que hacer una nueva conversión del maker a un makerDTO?
Excelente aporte mi estimado. Tengo una duda, sería conveniente utilizar dos DTO por cada entity?, osea una para las respuestas y otra solo para las solicitudes. Generalmente (en mi caso) uso dos para no exponer datos sensibles, por ejm. una clase User que tenga como atributo password, lo estaría utilizando solo en mi DTO de solicitud necesario para crear un usuario, mas no en la respuesta que sería lo que llevo al frontend... mi duda era esa. Se agradece.
Hola, puedes usar cuantos DTO quieras, el patron nos dice que los datos de los DTO se pueden mapear de diferentes fuentes, sin embargo debes analizar muy bien cada caso para no afectar la escalabilidad del proyecto. ¡Saludos!
Gracias por tu respuesta. Tengo otra duda 🙂 si quiero usar un método para actualizar un maker: public Maker update(Long id, Maker maker) tendríamos que agregarlo e implementarlo en el DAOImpl para luego jalarlo en el Service?, pero si antes de actualizarlo quiero validar que exista ese maker, con un if, ¿dónde debería hacerse esa lógica? Pienso que en el DAOImpl porque en el service veo que solo jalamos los metodos del DAO y en mi makerService dicho metodo update quedaría: makerDAO.update(id, maker)?. Espero se me pueda entender. Gracias de antemano.
No encontré el link del repositorio, pero copié la inserción de los datos sql INSERT INTO fabricante(id,nombre) VALUES (1,"Asus"); INSERT INTO fabricante(id,nombre) VALUES (2,"Lenovo"); INSERT INTO fabricante(id,nombre) VALUES (3,"Hewlett-packard"); INSERT INTO fabricante(id,nombre) VALUES (4,"Samsung"); INSERT INTO fabricante(id,nombre) VALUES (5,"Seageate"); INSERT INTO fabricante(id,nombre) VALUES (6,"Crucial"); INSERT INTO fabricante(id,nombre) VALUES (7,"Gigabyte"); INSERT INTO fabricante(id,nombre) VALUES (8,"Huawei"); INSERT INTO fabricante(id,nombre) VALUES (9,"Xiaomi"); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (1,"Disco duro STA3 1TB",86.99,5); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (2,"Memoria RAM DDR4 8GB",120,6); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (3,"Disco SSD 1 TB",150.99,4); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (4,"GeForce GTX 1050tu",185,7); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (5,"GeForce GTX 1080 Xtreme",755,6); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (6,"Monitor 24 LED Full HD",202,1); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (7,"Monitor 27 LED Full HD ", 245.99,1); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (8,"Portatil Yoga 520",559,2); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (9,"Portatil Ideapd 320",444,2); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (10,"Impresora HP Deskjet 3720",59.99,3); INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (11,"Impresora HP Laserjet Pro M26nw",180,3);
Estoy en el minuto 30:46 y cuando voy escribiendo el Query Method no me aparece las sugerencias como en el video. Tengo la version 2023.3.6 Community Edition.
Muchas gracias por el video. Me surgió una duda, por qué se utiliza DAO y Repository al mismo tiempo? No es redundante crear un DAO sobre un Repository?
Hola, no necesariamente es redundante aunque puede parecer que sí, lo que hice fue agregarle una capa más de abstracción para desacoplar aún más la funcionalidad de conexión a base de datos, a veces es útil, otras veces no, pero todo depende de la funcionalidad que se quiera dar. ¡Saludos!
Hola, una pregunta, ¿Hay alguna documentación para poder visualizar de forma más gráfica los usages que tiene cada clase / interfaz java / package ? Espero se entienda la pregunta, buen video por cierto 👍👍
Hola, creo que entiendo tu pregunta. Pienso que lo mas cercano a eso seria el javadoc. Practicamente vamos documentando el codigo a medido que lo vamos escribiendo. Te doy un ejemplo de como se hace: /** * Calcula la suma de dos enteros. * * @param a El primer entero a sumar. * @param b El segundo entero a sumar. * @return La suma de 'a' y 'b'. */ public int sumar(int a, int b) { return a + b; } Saludos.
Hola, existen 3 repositorios bases en jpa: CrudRepository, JpaRepository, PaginAndSortingRepository. CrudRe. Se usa cuando trabajamos con funcionalidades básicas de un Crud. JpaRe. Se usa cuando tienen que usar funcionalidades más avanzadas y también trabajar con procesos batch. PaginAndSortRe. Se usa cuando vamos a manejar paginacion en una aplicación. Todos sirven para lo mismo pero los repos 2 y 3 extienden de CurdRepository entonces tienen los mismos métodos. Uso Crud repository por la simplicidad del repositorios ya que no necesito la funcionalidad extra de los otros pero podrías trabajar con cualquiera. ¡Saludos!
el video esta bueno, bien explicado en detalle salvo algunos detallitos como "stream", pero no pasa nada, lo que si es de recapitular es la cantidad de publicidad que tiene el video, realmente es muy molesto, osea corta la onda de aprender, pues cada tanto sale publicidad...solo eso, poner pero no tanta publi
Hola, muchas gracias por comentar. Streams es un tema que daria para un video completo y es complicado explicarlo sin algunos conceptos previos. Frente a la publicidad te aclaro que yo no controlo eso, lo hace directamente RUclips. Obviamente habilitamos los anuncios para ganar al menos un poco por los videos, pero los anuncios los pone directamente RUclips y no los RUclipsrs. ¡Saludos Crack!
@@unprogramadornace ah bueno, crei que se podia controlar un poco en volumen sobre los anuncios.Por otro lado estaria bueno un video usando quarkus que nadie lo hace o mas bien pocos con algun proyecto no tan grande pero algo asi como un sistema de ventas u otro ecommerce,entonces harias la diferencia con otros canales por muy encima
Una pregunta?? Que plugin o extensión usas de intellij idea para que se vean así los iconos o carpetas y otra cosa.. la parte del controllers, cuando haces la conversión de datos de la entidad al dto, eso no se hace en la parte del servicio directamente?? escuché que dijiste eso que todas las funcionalidad se debe hacer en el servicio, eso estoy confundido te agradecería si me puedes explicar eso
Hola, me preguntan frecuentemente sobre la configuración que tengo en mi intellij, por ese motivo hice un vídeo completo en dónde explico mi configuración, te comparto el enlace: ruclips.net/video/xyKsnuuHHRI/видео.html Por otro lado, el mapeo de objetos debería hacerse en el Service, en el vídeo por motivos educativos y prácticos lo hicimos en el controller debido a que profesionalmente se usan tecnologías llamadas Mappers, pero eso es otro tema. ¡Saludos!
Tengo una consulta cuando hablas de la carga perezosa dices que a veces es necesario traernos esos datos en este caso los productos pero en otras ocasiones no, pero al momento de hacer llamar al endpoint para listar todos los fabricantes se listan todos con sus respectivos productos. Hay una manera de solo listar los fabricantes sin tener que llamar a los productos?. Excelente vídeo!
Claro que sí, puedes utilizar la anotación @JsonIgnore en el atributo que quieras excluir de la respuesta, de igual modo eso se maneja también con los famosos mappers en dónde tú decides que es lo que quieres devolver como respuesta. ¡Saludos!
@@unprogramadornace Buenas, buen curso!! mi pregunta es relacionada con esta. Comentabas que con @JsonIgnore se omite lo que se muestra en el json, pero sim embargo en postman vemos que se muestra la lista de productos, entonces esa parte no entiendo porque!! gracias de antemano
@@unprogramadornace Estaria muy bueno la incorporacion entonces en el proyecto, que se lo ve excelente, de hecho quisiera replicarlo con DTOs, como te parece que seria ideal hacerlo? utilizando MapStruct claro
@@nicolasgarcia253 Es una idea genial, una aclaración. Los mappers como MapStruct son una cosa y los DTO son otra diferente. Pero en general interactuan juntos. Pero es una gran idea tratar de hacerlo con DTO. ¡Saludos!
Hola, la desarrollé en el controller por motivos de economizar un poco de tiempo en el vídeo, pero tienes toda la razón. La lógica debe ir en el servicio. ¡Saludos!
hasta el minuto 4:39 no he podido levantar el proyecto con eclipse porque inteliJ Idea tiene licencia y no me deja instalarlo ya que lo tuve de prueba y he estado intentandolo con eclipse y o me deja
Hola, puedes usar intellij IDEA en la versión community, esa es gratis. Lamentablemente no puedo ayudarte más porque el error debe ser causado por la configuración de tu PC entonces es difícil darte una solución. ¡Saludos!
Hola, los mapping libraries serán un tema para otro vídeo, por ahora quise mostrar la forma tradicional de hacer las cosas para que en futuros episodios se entienda y se evidencie la utilidad de ModelMapper, mapStruct, orikaMapper, etc. ¡Saludos!
Hola, no es necesario un microservicio, solo levantas esta APP y listo la puedes consumir. El tema es que debes darle manejo a los cors, que son el mecanismo de de intercambio de datos entre un back y un front. ¡Saludos!
@@alexischavarria7634 No uso extensiones, trabajo con lo que el IDE me ofrece por defecto, en ocasiones uso un que otro plugin para GraphQL, AWS, YML, etc. Pero normalmente trabajo solo con lo que me ofrece el IDE. ¡Saludos!
Buenas, tengo otra pregunta, si a postman se le pasa un makerDto, por que cuando incluimos el @JsonIgnore lo hacemos en la entidad Maker y no en MakerDto. Es que veo que al incluir esta anotación en Maker, igualmente si que se muestra la lista de productos en postman.Gracias por tu curso
Hola, en este caso no sería conveniente utilizar @JsonIgnore en el DTO debido a que si haces eso ya no vas a obtener el listado de productos en tu respuesta porque @JsonIgnore le dice a Jackson que no serialice el parámetro. Si lo ponemos en el Entity tampoco causaría problemas aunque lo pusimos allí porque estábamos devolviendo directamente el listado de entity. Pero al usar el DTO ya no es necesaria esa anotación. ¡Saludos!
Wenas, muy buen tutorial, me he suscrito a tu canal. Aunque tengo una duda, cuando coloco la inyección al servicio o repositorio con @Autowired, me aparece la siguiente advertencia: "Field injection is not recommended" que significa "No se recomienda la inyección en el campo", osea que el método que proporcionas no es recomendado por Spring o algo así, pero me parece raro porque vengo de otros lenguajes y también se usa este tipo de método de manera similar, aunque aveces en un constructor como en Nest.js, por eso me es muy rara la advertencia. Además que el IDE no me indica si debo usar otro método para la inyección de dependencias, asi que me es más confuso aún XD Busque en Google y usan algo llamado Spring Context y por lo que entendí, lo inyectán en el constructor o algo así, pero hay que hacer muchos más pasos y honestamente me gusta más tu método de hacerlo. Me gustaría saber porque sucede ese warning, ¿y que puedo hacer para evitarlo? ¿O simplemente la ignoro? Muchas gracias de antemano.
Hola, efectivamente los beans se guardan en el Spring Context. El warning es completamente normal, pero si quieres resolverlo debes tener en cuenta lo siguiente: Existen 3 formas de inyectar un bean: Por autowired, por constructor o por método setter. En este caso yo estoy inyectando por medio de autowired, pero últimamente esa forma se está dejando de usar y por eso te marca el warning, si quieres eliminar el warning solo debes hacer la inyección por medio de método constructor y listo. Una aclaración. Cualquiera de los 3 métodos de inyección son correctos y está bien usarlos. Saludos.
@@unprogramadornace Hola de nuevo, estaba terminando el vídeo y surgió este error: ERROR: duplicate key value violates unique constraint "fabricante_pkey" Detail: Key (id)=(3) already exists. 2023-12-07T12:19:48.700-03:00 ERROR 60486 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.DataIntegrityViolationException: could not execute statement [ERROR: duplicate key value violates unique constraint "fabricante_pkey" Detail: Key (id)=(3) already exists.] [insert into fabricante (nombre) values (?)]; SQL [insert into fabricante (nombre) values (?)]; constraint [fabricante_pkey]] with root cause org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "fabricante_pkey" Detail: Key (id)=(3) already exists. Las diferencias claves que hay es que yo estoy usando Docker con PostgreSQL, pero todo lo demás es exactamente igual, he seguido paso a paso lo que explicaste y esto es lo único que no me funciona. Mi teoría es que al usar el archivo de import, hibernate no sabe cual es el ultimo id, por ende empieza del 1 de nuevo. Ya que en un inicio daba error con el id 1, luego copie el código desde github y empezo a aumentar la secuencia. ¿Es debido a que uso PostgreSQL? ¿Qué recomiendas para solucionar este error?
Tengo una curiosidad porque los atributos en la base de datos en el caso del producto porque no se genera en orden como esta en el modelo de java? es decir primero el id luego el nombre despues el precio. por ultimo la fk ? hay forma de hacer respetar eso?
Hola, en su momento tuve esa misma pregunta, investigué sobre eso y encontré que JPA no maneja un orden en específico sino que lo hace en desorden y lamentablemente no hay forma de darle un orden. Si quieres tener tus atributos de la tabla ordenados es mejor que crees la tabla manualmente y lo dejes que JPA lo haga por ti. ¡Saludos!
Hola, usualmente suelo ingresar de vez en cuando a las documentaciones para ver los nuevos cambios, también googleando un poco sobre las tecnologías que uso pero en general siempre el mejor lugar para buscar información es la documentación oficial. ¡Saludos!
Como pocos videos , muy bien explicado , podrías por favor ampliar lo de los query methods , gracias.
Me sumo a los comentrios. Me encanta como desglosa los conceptos complicados y los hace accesibles para todos los niveles. Además genera coriosidad por seguir aprendiendo. (mapStruct y métodos query )
Muchas gracias por comentar. Los mappers son un tema que trataré en un vídeo específico más adelante.
¡Saludos!
Después de buscar entre un mar de videos, contenido y cosas sin sentidos, al fin encuentro algo que si se entiende y que me puede servir de impulso para mi futuro en Spring, muchas gracias profe, de verdad le agradezco, espero siga subiendo contenido!
Muchas gracias por tu comentario y por tomarte el tiempo de escribirlo.
¡Saludos!
Un verdadero maestro, 1 de 1000 un verdadero y completo tutorial. aquí un seguidor. felicidades maestro.
Bienvenido a la comunidad.
¡Saludos Crack!
tengo aprox. 8 dias para aprender lo básico de springboot, incluido las APIs rest, este es mi primer video y puedo decir que entendí muchos conceptos que antes parecían complicados, muchas gracias
y lo lograste? xd
Nuevamente te felicito, quedan aun mas afianzados los conocimientos de Spring Boot. Un abrazo grande amigo
Muchas gracias por comentar. Saludos.
muy bueno yo ando queriendo aprender spring boot y me vino de perlas el video
Mis mejores deseos, tu canal el de los más valorados para mi persona ya que sueles crear excelente contenido, personalmente mejor que cursos de pago de udemy.
Muchas gracias por el apoyo y por tu comentario.
¡Saludos!
Master!!!
Pocas personas hacen esto !
Realmente muy bueno, te felicito…
estás son las cosas que se agradecen,
saludos desde Bogota.
Gracias por comentar.
¡Saludos!
Gracias por el aporte a la comunidad, muchas gracias.
Uyyy Bro en serio muy buen video, buena explicación bien detallada eres una maquina
Saludos desde Perú
Hola, me alegro que te haya gustado el vídeo, gracias por tomarte el tiempo de comentar.
¡Saludos Crack!
muchas gracias por el aporte brother, muchas felicidades por tu canal!!
Excente tutorial. Dices que fue un poco largo pero completamente funcional, vale completamente la pena.
Muchas gracias por compartir tu conocimiento y sobre todo porque además de completo y actualizado, está muy bien explicado. De igual forma, la forma en la que explicas paso a paso es de lo mejor que he visto en youtube, porque llevas lo complejo a lo sencillo y eso no lo hace cualquiera. Muchas felicitaciones por esta labor que simplemente te engrandece. Nunca dejes esta obra que ayuda a tantas personas, para en un futuro mejorar su calidad de vida. Un abrazo. Muchas bendiciones.
Muchas gracias por tu comentario. Me alegra mucho que mis videos sean de ayuda para todos ustedes.
¡Saludos!
Excelente, muy bien explicado. Eres un gran maestro y explicas con mucha humildad. Esto lo que necesitaba para aprender de api rest, como hacer los crud y la importancia del DTO.
Muchas gracias por comentar. Me alegra que mi contenido sea de utilidad para ti.
¡Saludos!
Gracias por enseñar, me estaban matando las relaciones y mas claro no me pudiste dejar,,,,,
Excelente muchas gracias por compartir tus conocimientos me has ayudado mucho aprendí bastante más que la universidad 🙂
Muchas gracias por tu comentario.
¡Saludos!
Waooo.. excelente amigo y un millon de gracias por ayudarme a comprender de un modo sencillo este tema.
te hago una consulta: veo que se usan en algunos proyectos otras dependencias, es decir, al crear el proyecto en Sprint. Sera que depende el tipo de Api? cuando puedas agradeceria tu comentario. Mil gracias.
TIO NACE, HAZ UN VIDEO FULL STACK CON UN API REST EN SPRING BOOT CON SPRING SECURITY, DTO's Y JWT, PERO USANDO REACT O ANGULAR EN EL FRONTEND
Si por favor en angular 😊
Yo tengo una duda, cuál es la diferencia de api rest y un CRUD ? O es lo mismo ? 🤔 Por qué se que creas eliminas etc pero no sé cuándo es api y cuando es CRUD por qué siempre veo todo completo
@@jonnathangonzalez8639 Bueno un crud en un conjunto basico de operaciones que vendrían a ser Crear,Leer,Actualizar y Borrar, mientras la api rest es un estilo de arquitectura para diseñar servicios web y por la cual la apirest implementa las operaciones crud
@@jonnathangonzalez8639 api rest es un crud sin front, el crud es un api rest con un front donde ves todo lindo y simple, en un api rest haces un crud pero mediante rutas url
@@jonnathangonzalez8639la diferencia entre otro, es que en las API vos devolves Json, y podés hacerlo a diferneias clientes
Excelente! Para los que usan Postgres, hay que actualizar la secuencia en la BD.
Muchas gracias por el gran aporte me sirve mucho para practicar, y tomar algunas cosas que me parecen mas practicas de la forma que tu lo haces, me voy construyendo como backend con aportes de muchos y claro algo mío, me considero no junior sino baby ja ja ja ja ja ja ja
Hola, muchas gracias por tu comentario. Todos iniciamos así, no te preocupes. Solo sigue adelante y no te frustres si se te hace complicado algún tema, tu solo sigue.
Un programador nace programando.
¡Saludos!
Bro, estoy de acuerdo contigo. ¿Qué canal recomiendas que haga excelente contenido en español? Aparte de este, claro está.
@@brandonrodriguez935 este canal claro, TodoCode, Sacavix Tech, Lucas Moy y una colección enorme de programadores de la India!!!😂😂😂
un vido explicando más a detalle el uso de queryes ya que los ejemplos son los convencionales el tipico crud con jpa o crud repository, pero para hacer consultas más avanzadas
Magnífico!!! muchas gracias por compartir el conocimiento. Saludos.
Gracias Bro por el aporte. Ahora desayuno y me siento a ver el video
seria interesante un video tuyo sobre programacion funcional, te haces entender muy bien...
Exelente,muchas gracias por los videos son de gran importancia para mi aprendizaje
Me agrada que te haya gustado mi vídeo.
¡Saludos!
Excelente video! Seria un gran aporte un tutorial de manejar excepciones con spring boot para apis rest
wao por fin entendi bien esta merga, las api que eh aprendido en curso de pago ni buenas practicas tenian, buen re cool video
Felicitaciones, por fin entendiste.
Gracias por comentar.
¡Saludos!
Muchísimas, muchísimas gracias en verdad por este video Tutorial, este ha sido mi primer API que he hecho en toda mi vida, y le doy las gracias por guiarme en este camino. Espero que pueda también crear un video sobre cómo consumir esta API en un frontEnd(Android o Web). Saludos y bendiciones :D
Hola, felicidades por lograr crear tu primer API, sigue adelante. Voy a tener en cuenta tu sugerencia.
¡Saludos!
muy buen video, bien esplicado, muchas gracias, si pudiera tener el proyecto mucho mejor
Gracias por el tiempo, trabajo y esfuerzo realizado.
gracias por el tutorial profe!!
tenia que ser paisa, muy buen tutorial felicidades profesor
Me encantan tus videos profe de lo mejor!!
Excelente video, muchas gracias por compartir su conocimiento.
Genial el video, espero te animes a hacer uno sobre los Query methods
Excelente contenido, tienes pensado hacer un video sobre el manejo de errores con RestControllerAdvice y Handler? Estaría genial, gracias por compartir tus conocimientos ✌️
Hola muchas gracias comentar, tendré en cuenta tu sugerencia.
¡Saludos!
WOWWWW El mejor video sobre Spring Boot en todo youtube, muchas gracias, en caso de tener cursos en Udemy nos avisa ojala haga tambien de microservicios Muchas gracias por compartir su conocimiento 🙏☺
Muchas gracias por tu comentario. Por ahora no tengo contenido en Udemy pero gracias por tu apoyo.
¡Saludos!
@@unprogramadornace Mientras siga habiendo contenido aunque sea aqui por youtube le seguiremos apoyando saludos.
Muchas gracias, he aprendido mucho.
Genial.
¡Saludos!
Gracias por compartir tu conocimiento, Bendiciones
Muy buena explicación Bro, se entendio muy bien....
Dios lo bendiga y le multiplique! 😅👍🏻
Muchas gracias por tu comentario.
Bendiciones para ti también.
¡Saludos!
Genial, estaria bueno un video testeando api rest, un abrazo y buen video
Excelente video, me ayudó a entender muchas cosas
Muchas gracias por el video, es perfecto, espero y continúes con algún video para mejorar la parte del Testeo con Junit y mockito siempre y cuando puedas, muchas gracias y un cordial saludo.
Lo tendré en cuenta.
¡Saludos!
De lo mejor en contenido, muy agradecido
Excelente, muchas gracias!
Gracias por comentar.
¡Saludos!
Tremendo!! ..se nota que sabe lo que hace. Podría por favor subir a github el proyecto?
me hiciste facil lo que era dificil nuevo sub ojala sigas subiendo mucho mas contenido de spring de lo mejor en español
lindo
Excelente video muy bien explicado.
gracias por otro video sensacional, escuche de una tecnologia llamada swagger podrias hacer un video enseñando como implementar con este mismo proyecto :3
Vale, tendré en cuenta tu sugerencia.
¡Saludos!
Hola, viendo este video me he fijado en algunas cosas y me surgieron las siguientes dudas, seria bueno que por favor me contestaras por puro aprendizaje, ya que no se cuando usar una u otra cosa:
1- Por que se utiliza CrudRepository en vez de JPARepository?
2- Por que utilizar el patrón DAO y no un DTO al momento de realizar la persistencia de la data?
Muchas gracias, excelente contenido!
Hola, muchas gracias por tu comentario. Tus preguntas son bastante habituales al empezar a trabajar con Spring, así que intentaré explicar de la manera más clara posible, aunque el segundo punto amerita un tutorial completo.
Respuestas:
1) JPA dispone de distintos repositorios, entre ellos se encuentran CrudRepository, JpaRepository y PagingAndSortingRepository, entre muchos otros. Puedes elegir el que prefieras, pero la elección dependerá de las necesidades de tu proyecto, ya que cada repositorio ofrece características propias. En este caso, utilizamos CrudRepository porque solo necesitamos las operaciones básicas de un CRUD.
2) Los DTO (Data Transfer Object) son objetos que se utilizan para transferir y propagar datos dentro de nuestra aplicación, mientras que los DAO (Data Access Object) se emplean exclusivamente para el acceso a datos. En conclusión, utiliza DTO cuando necesites recibir, devolver y propagar datos en tu aplicación, y DAO cuando estés realizando operaciones con la base de datos. Es una mala práctica interactuar con bases de datos utilizando DTO, así como también lo es devolver datos directamente al cliente usando DAO.
Espero que estas aclaraciones te hayan sido de ayuda.
¡Saludos!
Excelente video, te felicito!! Gracias por compartir tus conocimientos!! Me queda la duda de cómo manejar las validaciones de los inputs, por ejemplo sanitizar la entrada en caso de que traiga información adicional, validar que los tipos sean correctos, etc. Ojalá más adelante puedas hacer un video sobre eso 😇
Hola, ya tengo un vídeo en el canal en dónde enseño a validar la información, te comparto el enlace:
ruclips.net/video/a3l1zmcNwjQ/видео.htmlsi=yOPgFbRtSW5SYZJe
Te invito a darte un paseo por los vídeos del canal, sé que encontrarás información interesante.
Espero que te sirva.
¡Saludos!
@@unprogramadornace Muchas gracias, me lo apunto!!!
como siempre da gusto ver tus videos,,,, pero me confunde un poco el uso de DAO Y DTO, podrias ayudarme con eso
Hola, gracias por comentar. Te explico brevemente: DAO y DTO son 2 patrones de arquitectura que cumplen funciones diferentes. DAO (Data access Object) son objetos que se usan para interactuar con la base de datos, punto. DTO (Data transfer Object) se usa para transferir o compartir atributos entre objetos.
Básicamente es eso.
¡Saludos!
Hermano de antemano mil gracias por su valioso aporte. Excelente!! sabe que hice todo lo indicado en el video (soy nuevo con springboot), en el min 48 al levantar la aplicación y e intentar hacer las pruebas con el postman...no da error pero..., se produce una desconexión inusual de la aplicación 😕tengo más de una semana intentando resolver este error y nada, he ingresado a stackoverflow buscando la solución a este problema, he hecho lo que allí sugieren para resolver este inconveniente pero nada resulta. Es una gran piedra en el zapato este No error pero si desconexión inusual de la apliación pues..al no estar ejecutandose no puedo hacer las pruebas del postman. 😵😕. Las últimas lineas al ejecutar la aplicación=>Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
2024-10-18T11:21:09.187-04:00 INFO 12124 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2024-10-18T11:21:09.189-04:00 INFO 12124 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2024-10-18T11:21:09.194-04:00 INFO 12124 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. Acá el proyecto en github=> github.com/djaimes99/ApiRestFul-with-SpringBoot. 😕👍
que video tan GOD
Excelente explicación!
Hola Santi, primero quiero felicitarte porque se entiende todo a la perfección igual que tus otros videos.
Quería consultarte por las clases implement tanto de DAO como las de servicio. En ningún momento se utilizan, si se utilizan las interfaces.
Probé cambiando las clases por las interfaces donde estaban siendo utilizadas y sigue funcionando a la perfección.
Mi pregunta es, puede haber algún inconveniente con esto o es lo mismo?
Saludos.
Hola, el principio de inyeccion de dependencias nos dice que debemos inyectar los componentes mas genericos y spring boot buscará la implementacion por ti, es por eso que inyectamos las interfaces.
¡Saludos!
Perfecto, voy a investigar sobre el tema entonces. Una última pregunta, que patrón de diseño sería este? Porque se usa DAO pero también se usa repository.
Hola, repository no es un patron de diseño como tal, simplemente es un objeto que por debajo usa el patron DAO. En este video explico a detalle como funciona el patron DAO y su relacion con DTO.
ruclips.net/video/XgUEjrTX9Bs/видео.htmlsi=AetgL0-UHRreQWKG
¡Saludos!
tendrás algún video con arquitectura limpia? me gusta mucho tu forma de explicar, lo entiendo mejor jejeje 😁😁
Hola, por ahora la mayoría de videos trabajan con arquitectura en capas, por ahora no tengo videos sobre arquitectura limpia pero no descarto la posibilidad de hacerlo.
¡Saludos!
@@unprogramadornace estaría genial, gracias 😃
Genial la clase, por cierto que tema o estilos usas en tu interfaz del IntelliJ Dea para que sea vea con esos iconos y fondos azul?? gracias!!
El tema de llama Gradianto y los iconos Atom icons.
¡Saludos!
Hola, muchas gracias por el trabajo que haces, por cierto, muy bien hecho. Me gustaria, por mi parte, que fueras mas despacio. Para mi explicas muy rapido, podrias ir mas lento, simplemente una opinion, constructiva. Aun asi, mil gracias, un saludo desde España :)
Hola, gracias por comentar. Tomaré en cuenta tu sugerencia.
¡Saludos!
excelente video
Excelente canal muy completa la información... podrias hacer alguno con el patron de diseño mvc? Quizas parecido a este? Para saber bien las diferencias entre mvc y dao
Hola, tendré en cuenta tu sugerencia. Te aclaro algo, MVC es un patrón de arquitectura y DAO es un patrón de diseño. Son dos cosas completamente diferentes, más bien la comparación correcta sería: MVC vs Rest.
¡Saludos!
Excelente video, te pregunto, tienes pensado hacer video sobre la creación de Microservicios con Spring Boot?
Hola, la respuesta es sí.
Un vídeo sobre microservicios está dentro de los planes.
¡Saludos!
Yo hice un CRUD algo similar, pero en ves de crear las bases de datos desde el codigo lo hice en el workbench
Excelente aporte, por favor puedes compartir los archivos de trabajo
Ojala puedas subir al Git los archivos de trabajo
Santiago, gran video, una consulta, he visto que en multiples foros se debate acerca de en cual capa se debe gestionar la conversión de Entity a DTO. ¿En service o en controller? he visto multiples respuestas que recomiendan caminos distintos, en este video veo que lo estas haciendo desde el controller ¿no significaría ello delegar lógica al controller, lo cual no deberia hacerse? ¿que recomendarías en general para hacer la conversión de entity a dto? gracias de antemano.
Hola, lo más recomendable es crear componentes nuevos llamados mappers, ellos se encargan de convertir los DTO y Entities.
¡Saludos!
Muy buen video me encanta xq es un tutorial donde dejas claro las buenas practicas, solo 3cositas:
1. la estructura de carpetas que seguis con el persistence del patron DAO si pudieras indagar mas por que lo usaste, o si con lo que hace JPA por detras ya estaria aplicando DAO?
2. El ResponseEntitity con comodin es mejor usarlo o especificar? que es lo que se usa?
3.Y por ultimo el query que me crea JPA por defecto no me funciono, será que habria que extender de JPARepository y no de CRUDRepository?
Y gracias por tan buenos videos, con esta calidad vas a llegar lejos, ya que en el mundo hispano no hay tan buenos tutoriales como los tuyos
Hola, con respecto a tu comentario te comento lo siguiente:
1) La estructura de carpetas no tiene nada que ven con JPA, simplemente uno de los principios de arquitectura de software es el desacoplamiento. En la estructura que usamos dejamos bien separadas las capa servicio, persistencia, controladores, etc. Es un tema muy amplio y daría para un curso completo.
2) Puedes usar el ResponseEntity con comodín o especificar el tipo de dato, cualquiera de las 2 está bien, sin embargo es un poco más recomendable dejar que sea Spring Boot el que gestione la respuesta para poder serializarla con el Jackson ya que en ocasiones tenemos tipos de datos distintos.
3) JpaRepository extiende de CrudRepository, los repositorios de JPA nos sirven para lo mismo con algunas funcionalidades muy específicas, en nuestro caso es indiferente usar uno u otro. En el vídeo no testeamos ese query method, en un próximo video podría ahondar un poco más sobre ese tema.
¡Saludos!
Cuándo usar DAO Y Cuándo usar DTO 🐣
@@Ana-sn5pb Hola, ambos son patrones diferentes, DAO (Data Acceso object) se usa para interactuar con bases de datos y DTO (Data Transfer Object) se usa cuando quieres mapear información de algún objeto. Por ejemplo mapear campos de un objeto DTO a un objeto entity para insertarlo en una BD.
¡Saludos!
Excelente explicacion, muy buenas practicas. De lo mejor que he visto en español !!!! Me gustaria saber si es posible en spring implementar middlewares para validar los parametros de las rutas. Saludos
Hola, usualmente los parametros de validan con una librerìa llamada VALIDATION, puedes agregar dicha libreria desde el Spring Initializr. Pero si quieres tener un codigo que se ejecute antes de llegar al controller podrias implementar un INTERCEPTOR http. Lo interceptores se ejecutan antes del controller y allì puedes ejecutar lo que quieras.
Saludos.
@@unprogramadornace gracias por el aporte. Me gustaria ver un video de API REST con todo lo que utilizas en el video y ademas incorporarle INTERCEPTOR , WEBSOCKETS y manejar imagenes desde el backend. Sin duda seria el tutorial mas completo y mejor de youtube. Bendiciones!! Gracias por todo!!!
Buenas profesor, no entiendo el error null cuando lanzas el findbyId, ya que List tiene valores en el 48:30. Sin embargo le pones un JsonIgnore y sí que te muestra los productos, cuando sólo debería obtener el id y nombre del maker al decirle que ignore la lista de productos.
Hola, tu pregunta es bastante interesante. Para que entiendas el concepto debes tener en cuenta el fetch que estamos usando. En el vídeo usamos LAZY, eso quiere decir "carga perezosa", eso lo que hace es que solo se hará la consulta a base de datos cuando se llame al método Get correspondiente del atributo en cuestión. Es por eso que nos devuelve un null, porque no estamos llamando explícitamente al método Get, entonces para evitar ese null le decimos al serializador de Spring que ignore ese campo.
¡Saludos!
@@unprogramadornace Eso es correcto y lo comprendo, pero una vez pones el JsonIgnore, no ignora el campo y SÍ se obtiene el resultado de Lista de Productos, aunque le pones JsonIgnore. Evitas el error de null, pero luego te ofrece el dato. La pregunta concreta es, por qué el endpoint devuelve los datos del maker y el productList, cuando a productList le has puesto un ignore para que no te lo muestre
Hola, le puse @JsonIgnore al entity para que no intente seriazarlo en una primera instancia, despues llamamos al metodo get product list en la clase MakerController en la linea 32. Alli se hace una consulta explicita al metodo get del listado y por eso el me retorna la respuesta.
¡Saludos!
en mi caso al no poner el @JsonIgnore al intentar hacer la consulta de la api me salia una referencia circular {
"id": 2,
"name": "Lenovo",
"productList": [
{
"id": 8,
"name": "Portatil Yoga 520",
"price": 559.00,
"maker": {
"id": 2,
"name": "Lenovo",
"productList": [
{
"id": 8,
"name": "Portatil Yoga 520",
"price": 559.00,
"maker": {
"id": 2,
"name": "Lenovo",
"productList": [
{
"id": 8,
"name": "Portatil Yoga 520",
"price": 559.00,
"maker": {
"id": 2,
"name": "Lenovo",
"productList": [
....
Solo una observación compañero, me corriges si estoy mal; pero me parece que en el min 59:55 cuando creas el update Maker, estas actualizando la entidad Maker y no el makerDTO.
Hola, en efecto tu afirmación es incorrecta. Pero no te preocupes, te digo el por qué.
El Maker es un Entity, todas las operaciones que se hagan contra la base de datos deben hacerse con objetos ENTITY.
MakerDTO es una clase que implementa el patrón DTO (Data transfer Object), y estos objetos se usan solamente para transferencia de datos o campos.
Es un error grande hacer operaciones contra la base de datos con objetos DTO y es por eso que en el segundo 59:55 enviamos el update a la base de datos con el Maker.
¡Saludos!
Gracias por todo hermano, me ha servido mucho... Tengo una duda. Cuando realizas la inyeccion de la dependencia en el MakerServiceImpl, ¿Por se inyecta la interfaz IMakerDao y no la implementacion (MakerDAOImp)? ¿Cual es la diferencia entre inyectar una u otra? De antemano gracias hermano.
Hola, es un primcipio de inyeccion de dependencias, siempre debes inyectar la interface y spring se encargará de buscar la implementacion por ti.
¡Saludos!
Muy bueno tus vídeos y tu enseñanza excelente ,solo tengo una pregunta, sería mejor o buena práctica dejarle la conversión de entidad a dto al service o a otra capa de abstracción para que Endpoint solo tenga la función de entrada y retorno?
Hola, si lo haces en el controller o en el service no hay problema o si quieres abstraer más la aplicación creando otra capa lo puedes hacer, sin embargo ya existen librerías que te hacen el mapeo por ti como mapStruct, orikaMapper, etc. Normalmente esas se usan en el controller. Se tiene la creencia de que el controller solo tiene que tener el llamado al service y ya, y eso no es cierto. El controller puede tener cierta lógica pero no puede ser lógica compleja.
¡Saludos!
@@unprogramadornace muchas gracias me aclaras más ideas y conceptos
Geniooooo 💯
Una duda en 1:13:41 aprox, en el método findAll de Product controller, cuando construyes el objeto de respuesta que es una lista , le haces un stream, luego un map y dentro del map una funcion lambda donde cada product lo conviertes a un ProductDTO le seteas el maker con product.getMaker(), aqui no se estaría violando el principio de no enviar en la respuesta entidades de negocio, y deberia ser un makerDTO, es decir se tendría que hacer una nueva conversión del maker a un makerDTO?
Hola, tienes toda la razón. Es un pequeño detalle que pasé por alto. Es genial tu apreciación.
¡Saludos!
Excelente aporte mi estimado. Tengo una duda, sería conveniente utilizar dos DTO por cada entity?, osea una para las respuestas y otra solo para las solicitudes. Generalmente (en mi caso) uso dos para no exponer datos sensibles, por ejm. una clase User que tenga como atributo password, lo estaría utilizando solo en mi DTO de solicitud necesario para crear un usuario, mas no en la respuesta que sería lo que llevo al frontend... mi duda era esa. Se agradece.
Hola, puedes usar cuantos DTO quieras, el patron nos dice que los datos de los DTO se pueden mapear de diferentes fuentes, sin embargo debes analizar muy bien cada caso para no afectar la escalabilidad del proyecto.
¡Saludos!
Gracias por tu respuesta. Tengo otra duda 🙂 si quiero usar un método para actualizar un maker: public Maker update(Long id, Maker maker) tendríamos que agregarlo e implementarlo en el DAOImpl para luego jalarlo en el Service?, pero si antes de actualizarlo quiero validar que exista ese maker, con un if, ¿dónde debería hacerse esa lógica? Pienso que en el DAOImpl porque en el service veo que solo jalamos los metodos del DAO y en mi makerService dicho metodo update quedaría: makerDAO.update(id, maker)?. Espero se me pueda entender. Gracias de antemano.
Otra duda, la anotacion @Build en las entidades es lo que te permite el método builder() cuando haces una save de las entidades?
Hola, la anotación @Builder te permite usar el método builder para construir los objetos.
¡Saludos!
No encontré el link del repositorio, pero copié la inserción de los datos sql
INSERT INTO fabricante(id,nombre) VALUES (1,"Asus");
INSERT INTO fabricante(id,nombre) VALUES (2,"Lenovo");
INSERT INTO fabricante(id,nombre) VALUES (3,"Hewlett-packard");
INSERT INTO fabricante(id,nombre) VALUES (4,"Samsung");
INSERT INTO fabricante(id,nombre) VALUES (5,"Seageate");
INSERT INTO fabricante(id,nombre) VALUES (6,"Crucial");
INSERT INTO fabricante(id,nombre) VALUES (7,"Gigabyte");
INSERT INTO fabricante(id,nombre) VALUES (8,"Huawei");
INSERT INTO fabricante(id,nombre) VALUES (9,"Xiaomi");
INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (1,"Disco duro STA3 1TB",86.99,5);
INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (2,"Memoria RAM DDR4 8GB",120,6);
INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (3,"Disco SSD 1 TB",150.99,4);
INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (4,"GeForce GTX 1050tu",185,7);
INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (5,"GeForce GTX 1080 Xtreme",755,6);
INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (6,"Monitor 24 LED Full HD",202,1);
INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (7,"Monitor 27 LED Full HD ", 245.99,1);
INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (8,"Portatil Yoga 520",559,2);
INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (9,"Portatil Ideapd 320",444,2);
INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (10,"Impresora HP Deskjet 3720",59.99,3);
INSERT INTO producto(id,nombre,precio,id_fabricante) VALUES (11,"Impresora HP Laserjet Pro M26nw",180,3);
Gracias!
@@leandroj.gonzalez6436 gracias sir
Estoy en el minuto 30:46 y cuando voy escribiendo el Query Method no me aparece las sugerencias como en el video. Tengo la version 2023.3.6 Community Edition.
Hola, yo uso la versión ultimate. Debe ser eso.
¡Saludos!
Muchas gracias por el video. Me surgió una duda, por qué se utiliza DAO y Repository al mismo tiempo? No es redundante crear un DAO sobre un Repository?
Hola, no necesariamente es redundante aunque puede parecer que sí, lo que hice fue agregarle una capa más de abstracción para desacoplar aún más la funcionalidad de conexión a base de datos, a veces es útil, otras veces no, pero todo depende de la funcionalidad que se quiera dar.
¡Saludos!
Hola, una pregunta, ¿Hay alguna documentación para poder visualizar de forma más gráfica los usages que tiene cada clase / interfaz java / package ?
Espero se entienda la pregunta, buen video por cierto 👍👍
Hola, creo que entiendo tu pregunta. Pienso que lo mas cercano a eso seria el javadoc. Practicamente vamos documentando el codigo a medido que lo vamos escribiendo. Te doy un ejemplo de como se hace:
/**
* Calcula la suma de dos enteros.
*
* @param a El primer entero a sumar.
* @param b El segundo entero a sumar.
* @return La suma de 'a' y 'b'.
*/
public int sumar(int a, int b) {
return a + b;
}
Saludos.
hola gracias por el video, tengo una duda debo descargar el SQL? por que vi que mostrate
saludos.
Hola, claro que sí. Doy por sentado que ya tienes el SQL y el workbech instalado.
¡Saludos!
Gracias por el video estimado, veo que tienes una preferencia sobre CrudRepository a JpaRepository, ¿Por que?. Gracias.
Hola, existen 3 repositorios bases en jpa:
CrudRepository, JpaRepository, PaginAndSortingRepository.
CrudRe. Se usa cuando trabajamos con funcionalidades básicas de un Crud.
JpaRe. Se usa cuando tienen que usar funcionalidades más avanzadas y también trabajar con procesos batch.
PaginAndSortRe. Se usa cuando vamos a manejar paginacion en una aplicación.
Todos sirven para lo mismo pero los repos 2 y 3 extienden de CurdRepository entonces tienen los mismos métodos.
Uso Crud repository por la simplicidad del repositorios ya que no necesito la funcionalidad extra de los otros pero podrías trabajar con cualquiera.
¡Saludos!
@@unprogramadornace Muchas gracias.
el video esta bueno, bien explicado en detalle salvo algunos detallitos como "stream", pero no pasa nada, lo que si es de recapitular es la cantidad de publicidad que tiene el video, realmente es muy molesto, osea corta la onda de aprender, pues cada tanto sale publicidad...solo eso, poner pero no tanta publi
Hola, muchas gracias por comentar. Streams es un tema que daria para un video completo y es complicado explicarlo sin algunos conceptos previos.
Frente a la publicidad te aclaro que yo no controlo eso, lo hace directamente RUclips. Obviamente habilitamos los anuncios para ganar al menos un poco por los videos, pero los anuncios los pone directamente RUclips y no los RUclipsrs.
¡Saludos Crack!
@@unprogramadornace ah bueno, crei que se podia controlar un poco en volumen sobre los anuncios.Por otro lado estaria bueno un video usando quarkus que nadie lo hace o mas bien pocos con algun proyecto no tan grande pero algo asi como un sistema de ventas u otro ecommerce,entonces harias la diferencia con otros canales por muy encima
existe alguna diferencia en el tiempo de respuesta usando la notacion query o el metodo del CRUD?
Hola, no afecta el rendimiento hacerlo de una forma u otra.
¡Saludos!
Una pregunta?? Que plugin o extensión usas de intellij idea para que se vean así los iconos o carpetas y otra cosa.. la parte del controllers, cuando haces la conversión de datos de la entidad al dto, eso no se hace en la parte del servicio directamente?? escuché que dijiste eso que todas las funcionalidad se debe hacer en el servicio, eso estoy confundido te agradecería si me puedes explicar eso
Hola, me preguntan frecuentemente sobre la configuración que tengo en mi intellij, por ese motivo hice un vídeo completo en dónde explico mi configuración, te comparto el enlace:
ruclips.net/video/xyKsnuuHHRI/видео.html
Por otro lado, el mapeo de objetos debería hacerse en el Service, en el vídeo por motivos educativos y prácticos lo hicimos en el controller debido a que profesionalmente se usan tecnologías llamadas Mappers, pero eso es otro tema.
¡Saludos!
@@unprogramadornace genial eres un crack, gracias por el dato.. 👌
Tengo una consulta cuando hablas de la carga perezosa dices que a veces es necesario traernos esos datos en este caso los productos pero en otras ocasiones no, pero al momento de hacer llamar al endpoint para listar todos los fabricantes se listan todos con sus respectivos productos. Hay una manera de solo listar los fabricantes sin tener que llamar a los productos?. Excelente vídeo!
Claro que sí, puedes utilizar la anotación @JsonIgnore en el atributo que quieras excluir de la respuesta, de igual modo eso se maneja también con los famosos mappers en dónde tú decides que es lo que quieres devolver como respuesta.
¡Saludos!
@@unprogramadornace Buenas, buen curso!! mi pregunta es relacionada con esta. Comentabas que con @JsonIgnore se omite lo que se muestra en el json, pero sim embargo en postman vemos que se muestra la lista de productos, entonces esa parte no entiendo porque!! gracias de antemano
Genio! verias necesario utilizar DTOs en este tipo de proyecto?
Hola, definitivamente si. Los DTO siempre son una pieza muy importante. De hecho debería usarse en la mayoría de proyectos.
¡Saludos!
@@unprogramadornace Estaria muy bueno la incorporacion entonces en el proyecto, que se lo ve excelente, de hecho quisiera replicarlo con DTOs, como te parece que seria ideal hacerlo? utilizando MapStruct claro
@@nicolasgarcia253 Es una idea genial, una aclaración. Los mappers como MapStruct son una cosa y los DTO son otra diferente. Pero en general interactuan juntos. Pero es una gran idea tratar de hacerlo con DTO.
¡Saludos!
Hola! Consulto, la lógica no se desarrolla en el service o porque lo haces en los controller? Gracias!!!
Hola, la desarrollé en el controller por motivos de economizar un poco de tiempo en el vídeo, pero tienes toda la razón. La lógica debe ir en el servicio.
¡Saludos!
@@unprogramadornace graciass 🙌🏻
hasta el minuto 4:39 no he podido levantar el proyecto con eclipse porque inteliJ Idea tiene licencia y no me deja instalarlo ya que lo tuve de prueba y he estado intentandolo con eclipse y o me deja
Hola, puedes usar intellij IDEA en la versión community, esa es gratis. Lamentablemente no puedo ayudarte más porque el error debe ser causado por la configuración de tu PC entonces es difícil darte una solución.
¡Saludos!
Tio Nace, ¿Por que no usaste la libreria ModelMapper para las DTOs como en videos anteriores?.
Hola, los mapping libraries serán un tema para otro vídeo, por ahora quise mostrar la forma tradicional de hacer las cosas para que en futuros episodios se entienda y se evidencie la utilidad de ModelMapper, mapStruct, orikaMapper, etc.
¡Saludos!
Para consumir uno de estos rest api debo implementarlo dentro de un micro servicio para consumirlo desde Angular?
Hola, no es necesario un microservicio, solo levantas esta APP y listo la puedes consumir. El tema es que debes darle manejo a los cors, que son el mecanismo de de intercambio de datos entre un back y un front.
¡Saludos!
La personalización de tu IDE esta una chimba, cual usas?
Hola, utilizo un plugin llamado Gradianto el cual trae muchos temas pero el que más me gusta es el dark blue, ese es el que uso.
¡Saludos!
Mi rey, que extensiones usas para tu IDE
@@alexischavarria7634 No uso extensiones, trabajo con lo que el IDE me ofrece por defecto, en ocasiones uso un que otro plugin para GraphQL, AWS, YML, etc. Pero normalmente trabajo solo con lo que me ofrece el IDE.
¡Saludos!
Buenas, tengo otra pregunta, si a postman se le pasa un makerDto, por que cuando incluimos el @JsonIgnore lo hacemos en la entidad Maker y no en MakerDto. Es que veo que al incluir esta anotación en Maker, igualmente si que se muestra la lista de productos en postman.Gracias por tu curso
Hola, en este caso no sería conveniente utilizar @JsonIgnore en el DTO debido a que si haces eso ya no vas a obtener el listado de productos en tu respuesta porque @JsonIgnore le dice a Jackson que no serialice el parámetro. Si lo ponemos en el Entity tampoco causaría problemas aunque lo pusimos allí porque estábamos devolviendo directamente el listado de entity. Pero al usar el DTO ya no es necesaria esa anotación.
¡Saludos!
Tengo una duda, el método save() de la interfaz CrudRepository no hace el update en caso de que ya exista el recurso?
Hola, si el registro ya existe el metodo save() actualizará el registro tal como lo has dicho.
!Saludos!
Wenas, muy buen tutorial, me he suscrito a tu canal.
Aunque tengo una duda, cuando coloco la inyección al servicio o repositorio con @Autowired, me aparece la siguiente advertencia: "Field injection is not recommended" que significa "No se recomienda la inyección en el campo", osea que el método que proporcionas no es recomendado por Spring o algo así, pero me parece raro porque vengo de otros lenguajes y también se usa este tipo de método de manera similar, aunque aveces en un constructor como en Nest.js, por eso me es muy rara la advertencia. Además que el IDE no me indica si debo usar otro método para la inyección de dependencias, asi que me es más confuso aún XD
Busque en Google y usan algo llamado Spring Context y por lo que entendí, lo inyectán en el constructor o algo así, pero hay que hacer muchos más pasos y honestamente me gusta más tu método de hacerlo.
Me gustaría saber porque sucede ese warning, ¿y que puedo hacer para evitarlo? ¿O simplemente la ignoro?
Muchas gracias de antemano.
Hola, efectivamente los beans se guardan en el Spring Context. El warning es completamente normal, pero si quieres resolverlo debes tener en cuenta lo siguiente:
Existen 3 formas de inyectar un bean: Por autowired, por constructor o por método setter. En este caso yo estoy inyectando por medio de autowired, pero últimamente esa forma se está dejando de usar y por eso te marca el warning, si quieres eliminar el warning solo debes hacer la inyección por medio de método constructor y listo.
Una aclaración. Cualquiera de los 3 métodos de inyección son correctos y está bien usarlos.
Saludos.
@@unprogramadornace Muchas gracias!
@@unprogramadornace Hola de nuevo, estaba terminando el vídeo y surgió este error:
ERROR: duplicate key value violates unique constraint "fabricante_pkey"
Detail: Key (id)=(3) already exists.
2023-12-07T12:19:48.700-03:00 ERROR 60486 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.DataIntegrityViolationException: could not execute statement [ERROR: duplicate key value violates unique constraint "fabricante_pkey"
Detail: Key (id)=(3) already exists.] [insert into fabricante (nombre) values (?)]; SQL [insert into fabricante (nombre) values (?)]; constraint [fabricante_pkey]] with root cause
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "fabricante_pkey"
Detail: Key (id)=(3) already exists.
Las diferencias claves que hay es que yo estoy usando Docker con PostgreSQL, pero todo lo demás es exactamente igual, he seguido paso a paso lo que explicaste y esto es lo único que no me funciona.
Mi teoría es que al usar el archivo de import, hibernate no sabe cual es el ultimo id, por ende empieza del 1 de nuevo. Ya que en un inicio daba error con el id 1, luego copie el código desde github y empezo a aumentar la secuencia. ¿Es debido a que uso PostgreSQL? ¿Qué recomiendas para solucionar este error?
Tengo una curiosidad porque los atributos en la base de datos en el caso del producto porque no se genera en orden como esta en el modelo de java? es decir primero el id luego el nombre despues el precio. por ultimo la fk ? hay forma de hacer respetar eso?
Hola, en su momento tuve esa misma pregunta, investigué sobre eso y encontré que JPA no maneja un orden en específico sino que lo hace en desorden y lamentablemente no hay forma de darle un orden. Si quieres tener tus atributos de la tabla ordenados es mejor que crees la tabla manualmente y lo dejes que JPA lo haga por ti.
¡Saludos!
Hola, estas usando intellij idea de pago o community?
Hola, uso la versión community.
¡Saludos!
Hola ...de donde salen las propiedades para la conexión a base de datos
Hola, las propiedades se setean en el application.properties.
¡Saludos!
Parce como te mantenes tan actualzado que recursos utilizas ??Saludos
Hola, usualmente suelo ingresar de vez en cuando a las documentaciones para ver los nuevos cambios, también googleando un poco sobre las tecnologías que uso pero en general siempre el mejor lugar para buscar información es la documentación oficial.
¡Saludos!