Taller de Desarrollo BackEnd:
Ecommerce
Profesor:
Darwin Solano Vivas
Senior Developer Full Stack
¡Vamos a programar !
Abriremos nuestro IDE
Vamos a crear un nuevo
proyecto
Debemos definir las
configuraciones del proyecto
Vamos a descargar las
dependencias y la versión de
Spring Boot que vamos a usar
Finalizamos
Con esto ya tendremos el
proyecto creado y
empezaremos su desarrollo
Crearemos un nuevo paquete
Este será nuestro paquete de
modelo
La capa de modelo en una aplicación sigue el
patrón de diseño MVC (Modelo-Vista-
Controlador) y se encarga de representar los
datos y la lógica de negocio de la aplicación.
La capa de modelo es responsable de manejar
la estructura de datos, la validación y la
interacción con la capa de persistencia de
datos (base de datos, API, etc.).
Crearemos una nueva clase
Vamos a crear nuestra clase de
productos
Definiremos los atributos que
vamos a usar
Crearemos los atributos de la
clase
Crearemos una nueva clase
Vamos a crear la clase de
recibo
Crearemos una nueva clase
Vamos a crear nuestra clase de
usuarios
Vamos a definir los atributos de
la clase
Creamos un constructor
Volveremos a la clase de recibo
Luego, se definen los atributos
de nuestra clase
Creamos un constructor
Crearemos una nueva clase
Vamos a crear nuestra clase
para gestionar los tipos de
usuarios
La clase GenericArrayUserType sirve como una
implementación personalizada de UserType que
permite mapear un tipo de dato de arreglo
personalizado en una base de datos relacional
utilizando Hibernate.
La declaración <T extends Serializable> implements
UserType en la clase GenericArrayUserType establece
que la clase es parametrizada por un tipo T que debe ser
una subclase de Serializable y que implementa la interfaz
UserType. Esto permite utilizar la clase
GenericArrayUserType con tipos de datos personalizados
y define los métodos necesarios para interactuar con
Hibernate en el contexto de tipos de datos
personalizados.
Esta línea declara una variable estática y final llamada
SQL_TYPES que es un arreglo de enteros. En este caso,
el arreglo contiene un solo elemento, [Link]. Esta
constante representa el tipo de datos SQL que esta
implementación de UserType puede manejar. En este
caso, [Link] indica que esta implementación
puede manejar un tipo de datos de matriz en la base de
datos.
Esta línea declara una variable de instancia
typeParameterClass de tipo Class<T>, donde T es
un parámetro de tipo genérico. Esta variable se
utiliza para almacenar la clase del tipo de dato
manejado por esta implementación de UserType.
Por ejemplo, si esta clase se utiliza para manejar
matrices de enteros (Integer[]), entonces
typeParameterClass contendrá [Link].
El método assemble en la clase
GenericArrayUserType toma un objeto
serializado y lo convierte de nuevo en
un objeto en memoria, utilizando el
método deepCopy.
Este método deepCopy en la clase
GenericArrayUserType no realiza ninguna
copia profunda y simplemente devuelve el
objeto original. Esto significa que no se crea
una nueva instancia del objeto ni se copian
sus valores o referencias internas.
El método disassemble en la clase
GenericArrayUserType se utiliza para
desmontar un objeto y convertirlo en una
representación serializable, utilizando el
método deepCopy para asegurarse de que
se realice una copia del objeto original.
Este método equals sobrescrito se utiliza
para comparar dos objetos y determinar si
son iguales. La comparación se realiza
utilizando el método equals del objeto x.
Este método hashCode sobrescrito se utiliza
para obtener el código hash de un objeto. En
este caso, simplemente devuelve el código
hash del objeto x sin realizar ninguna
modificación adicional.
Este método isMutable sobrescrito en la
clase GenericArrayUserType se utiliza para
indicar que el tipo de dato manejado es
mutable, permitiendo cambios en los objetos
de ese tipo
Este método nullSafeGet en la clase
GenericArrayUserType se utiliza para
obtener un valor de arreglo de la base de
datos y convertirlo a un objeto de tipo T. Esto
implica el manejo de valores nulos y la
conversión de tipos necesaria.
Este método nullSafeSet en la clase
GenericArrayUserType se utiliza para establecer
un valor en un objeto PreparedStatement en
función del objeto value. Si el valor es nulo, se
establece un valor nulo en el PreparedStatement.
Si el valor no es nulo, se realiza una conversión y
se establece un arreglo en el PreparedStatement.
Este método replace sobrescrito en la clase
GenericArrayUserType se utiliza para
proporcionar una estrategia de reemplazo por
defecto para los objetos manejados por el tipo de
dato personalizado. En este caso, la
implementación devuelve el objeto original sin
realizar ningún cambio.
Este método returnedClass sobrescrito en la clase
GenericArrayUserType se utiliza para obtener la
clase del objeto manejado por el tipo de dato
personalizado. Esto permite a Hibernate conocer la
clase del objeto para realizar operaciones y
conversiones adecuadas en el contexto de
persistencia y recuperación de datos.
Este método sqlTypes en la clase
GenericArrayUserType se utiliza para
especificar el tipo SQL correspondiente al
tipo de dato personalizado manejado por
esta implementación de UserType. En este
caso, se indica que el tipo SQL es
[Link].
Este método getSqlType en la clase
GenericArrayUserType se utiliza para obtener el tipo
SQL correspondiente al tipo de dato personalizado
manejado por esta implementación de UserType.
Sin embargo, en la implementación actual, no se
realiza ninguna operación y devuelve un valor
predeterminado de 0.
Este método nullSafeGet en la clase
GenericArrayUserType se utiliza para
recuperar un valor del tipo de dato
personalizado de un ResultSet. Sin
embargo, en la implementación actual, no se
realiza ninguna operación y se devuelve null.
Este método nullSafeSet en la clase
GenericArrayUserType se utiliza para
establecer un valor del tipo de dato
personalizado en un PreparedStatement. Sin
embargo, en la implementación actual, no se
realiza ninguna operación en el método.
Crearemos un nuevo paquete
Crearemos el paquete de
repository
El repositorio (repository) es una capa que forma
parte del patrón de diseño de persistencia de
datos, como el patrón Repository. Su función
principal es proporcionar una abstracción para
acceder a los datos y realizar operaciones de
persistencia, como guardar, actualizar, recuperar
y eliminar objetos en una base de datos u otro
sistema de almacenamiento.
Vamos a crear una nueva
interface
Ahora crearemos nuestro
ProductRepository
El código extends JpaRepository<product, Integer> indica que la clase
que lo contiene es una interfaz que hereda de JpaRepository, una interfaz
proporcionada por Spring Data JPA. Esta interfaz extiende la
funcionalidad para realizar operaciones de persistencia en una entidad
específica, en este caso, la entidad product. Al heredar de JpaRepository,
la interfaz obtiene métodos predefinidos para realizar operaciones CRUD
en la entidad, como guardar, actualizar, eliminar y buscar registros en la
base de datos. Esto simplifica el desarrollo al no tener que implementar
manualmente estas operaciones y permite acceder a ellas a través de la
interfaz. Además, se especifica que el tipo de identificador (ID) de la
entidad product es Integer.
Ahora, crearemos una nueva
interface
Luego, crearemos nuestro
ReceiptRepository
Volveremos implementar el
JpaRepositoey
El código List<receipt>
getReceiptsByUser(Integer u) indica la
declaración de un método en una interfaz
o clase que retorna una lista (List) de
objetos de tipo receipt (recibo) y toma
como argumento un objeto Integer que
representa un usuario.
Vamos a crear una nueva
interface
Ahora crearemos nuestro User
Repository
Volveremos implementar el
JpaRepositoey
El código List<receipt>
getReceiptsByUser(Integer u) define la firma de
un método que devuelve una lista (List) de
objetos de tipo receipt (recibo) y recibe como
argumento un objeto Integer llamado u. Este
método sugiere que se trata de un método de
acceso a datos que busca y devuelve los recibos
asociados a un usuario específico.
Vamos a crear un nuevo
paquete
Ahora, vamos a crear la capa de
services
Vamos a crear una nueva clase
Creamos la nueva clase
Importaremos toda la capa de
servicio
Hacemos la llamada a la clase
ProductRepository
Creamos el primer método para
crear un producto
Creamos el método para leer
un producto
Creamos el método para leer
todos los productos
Creamos el método actualizar
un producto
Creamos el método para
eliminar el producto
Vamos a crear una nueva clase
Importamos todos las clases
que vamos a usar
Creamos el método para crear
un recibo
Creamos el método para crear
un recibo de tipo 2
Creamos el método leer el
recibo
Creamos el método para
actualizar un recibo
Creamos el método para
eliminar un recibo
Luego, crearemos una nueva
clase
Llamamos a la clase
UserRepository
Vamos a crear un nuevo
paquete
Vamos a crear una nueva clase
Ahora, procedemos a crear
nuestra clase para crear las
excepciones personalizadas
Crearemos la excepción
personalizada
Vamos a crear una nueva clase
Crearemos la excepción
personalizada
Volvemos a nuestra clase de
Servicio y creamos el método
para registrar un usuario
Ahora, el método para loguear
un usuario
Luego, el método para leer un
usuario
Ahora, el método para actualizar
un usuario
Luego, el método para eliminar
un usuario
Vamos a crear un nuevo
paquete
Vamos a crear una nueva clase
Procedemos a crear la capa de
controlador
Importamos las anotaciones de
esta capa
Luego, importamos la capa de
ProctoService
Creamos la Api para crear un
producto
Creamos la Api leer un producto
Creamos la Api para leer todos
los productos
Creamos la Api para actualizar
un producto
Creamos la Api para eliminar un
producto
Vamos a crear una nueva clase
Ahora vamos a crear el
controlador de Recibo
Importamos las anotaciones de
nuevo
Llamamos a la clase recibo
Creamos las Api para crear un
recibo
Creamos los demás métodos de
esta clase
Vamos a crear una nueva clase
Procedemos a crear el
controlador de Usuario
Creamos la Api para registrar un
usuario
Creamos la demás Api para la
interacción
Configuraremos las propiedades
de nuestro proyecto
Para ello, vamos a crear la base
de datos
Creamos unas configuraciones
básicas para una conexión a
base de datos
Ejecutamos Maven clean
Ejecutamos Maven Install
Esperaremos a que termine
Y si nos remitimos a la base de
datos veremos cómo se crearon
todas las tablas solas
Vamos a ejecutar Spring Boot
App
Vamos a hacer unas pruebas en
Posrtman
Prueba 1
Prueba 2
Prueba 3
Prueba 4
Prueba 5
Prueba 6
¡Muchas
Gracias!
Thank you, Storyset, for providing such
wonderful illustrations. Your work has helped
countless people communicate their ideas
and stories more effectively. We appreciate
your contribution to the creative community!