Sunteți pe pagina 1din 49

Soporte a DAO

(DAO Support)
¿Por qué DAO?
El soporte de Objeto de Acceso a Datos en Spring (en ingles Data
Access Object o DAO) está dirigido a proveer consistencia y
portabilidad al código, sin importar qué tecnologías de acceso a
datos (persistencia) estemos utilizando, ya sea JDBC, Hibernate,
JPA o JDO

El cambio de una tecnología de persistencia a otra es una cuestión


de cambiar unas pocas líneas de código en las anotaciones
(inyección de dependencia)

También permite a nuestro código no preocuparse por la capturas


de excepciones, que son específicas para cada tecnología de
persistencia
Jerarquía de Excepciones

Spring proporciona muy buena traducción de excepciones de las


tecnologías de persistencia como SQLException

Spring maneja su propia jerarquía de clases de excepciones con el


DataAccessException como la clase padre

Estas excepciones envuelven la excepción original, de forma


simple y en un lenguaje claro, por lo tanto no se corre el riesgo de
que se vaya a perder información sobre lo que pudo haber salido
mal

Maneja tanto excepciones de JDBC y de JPA / Hibernate


Jerarquía de Excepciones
Anotación
@Repository
Anotación @Repository

Garantiza que nuestros DAOs o repositorios tengan una


adecuada traducción de errores/excepciones

Permite el soporte para el escáner de componentes


DAOs/Repositorios y que estos puedan ser encontrados
y configurados sin tener que ser definidos en el XML de
Contexto de Spring

@Repository es un estereotipo de @Component


Anotación @Repository
@Repository
public class AlgunDao implements IDao {

// ...

}
Acceso a recursos de persistencia
Cualquier implementación de DAO o repositorio tiene
que acceder a un recurso de persistencia,
dependiendo de la tecnología de persistencia usada:
•Dao basado en JDBC necesita acceder al recurso DataSource JDBC
•Dao basado en Hibernate necesita acceder al SessionFactory
•Dao JPA necesita acceder al EntityManager
•DAO JPA usando API Spring Data, la interface CrudRepository

La forma más simple de acceder a estos recursos es


usar inyección de dependencia para inyectarlos
•@Autowired para inyectar un DataSource JDBC o Hibernate
SessionFactory
•@PersistenceContext para inyectar un EntityManager de JPA
Soporte ORM
en Spring
Soporte ORM en Spring

Spring soporta •Hibernate


administración de •JPA (Java
recursos, implementación Persistence API)
data access object (DAO) y •JDO
•iBATIS SQL Maps
control de transacción
Beneficios de usar DAOs de Spring

Fácil de testear

Excepciones de acceso a datos más entendibles

Mejor administración de recursos

Fácil configuración del JPA e Hibernate


Beneficios de usar DAOs de Spring

Integrado con transaction management


(manejo de transacciones)

• Podemos envolver nuestro código ORM


(DAOs) con una declarativa
programación orientada a aspectos
(AOP) ya sea anotando un método con
@Transactional el cual será interceptado
por el aspecto para aplicar la
transacción
Porqué el Mapeo de Objeto
Relacional (ORM)?
• La capa de persistencia es una
importante parte de cualquier proyecto
de desarrollo de aplicaciones empresariales
 Accede y opera con los datos
persistentes típicamente de una base
de datos relacional
• Las Bases de datos relacionales manejan
tablas (con filas y columnas)
• Nosotros, los desarrolladores Java,
queremos trabajar con clases/objetos,
no filas y columnas
• ORM se encarga del mapeo entre los
dos
Porqué el Mapeo de Objeto
Relacional (ORM)?

Diseñado con un
excelente rendimiento,
rápidas
ORM maneja relaciones de
consultas/operaciones en
objetos
la BBDD, maneja dos
niveles de cache, donde el
primer nivel es automático
El mapeo objeto-relacional
Esto crea una base de datos
(Object-Relational mapping, o
orientada a objetos en nuestra
sus siglas ORM) es una
aplicación mapeada a una base
arquitectura que permite
de datos relacional, es decir
trabajar con los datos de una
una base de datos virtual de
base de datos relacional
objetos, sobre la base de datos
(RDBMS) en forma de objetos
relacional
(lenguaje POO)
 Esto funciona asociando a cada tabla
de la base de datos un Plain Old
Java Object (POJO o clase Entity)

 Cada atributo de la clase Entity es


mapeado o asignado a las columnas
de la tabla de la base de datos

 Un Entity es similar a una Java


Bean, con propiedades accesibles
mediante métodos setter y getter
Clases de
Dominio o Entidades
Clases de Dominio o Entity
• Las clases de dominio son aquellas en
una aplicación que implementan las
entidades del dominio de negocio (por
ejemplo, Cliente y OrdenCompra en
una aplicación de E-commerce)

• Un ORM como Hibernate o JPA


funciona mejor si estas clases siguen
algunas reglas simples, también
conocido como el modelo de
programación Plain Old Java Object
(POJO).
Clases de Dominio o Entity

Objetos
Objetos Manejados
Mapeados
Los objetos son instancias
que solo viven en
memoria
Objetos
Anotados Objetos
Persistentes

Los entity son objetos que


Objetos viven en modo persistente
en la Base de Datos
De Consultas

Objetos
Cacheados
Una entidad es un objeto
de persistencia que
representa una tabla en El estado de persistencia
el modelo de datos de una entidad se
relacional y cada representa a través de
instancia de esta entidad atributos persistentes
corresponde a un
registro en esa tabla

Estos atributos usan


Usamos Anotaciones de
Anotaciones para el
JPA para mapear las
mapeo de estos objetos
clases de dominio de
en el modelo de base de
persistencia
datos
Pasos para escribir una clase Entity
Paso 1: Implementar
Paso 2: Proveer un
constructor sin
atributo Id (identificador)
argumentos

•Toda clase persistente •Este atributo se asigna


deben tener un (mapeada) al campo de
constructor por defecto llave primaria de una
de manera que JPA pueda tabla de base de datos.
crear instancias de ellas •Este atributo puede ser
nombrado como se
quiera, y el tipo de dato
puede ser cualquier
primitivo java.lang.String
o java.lang.Integer o
java.lang.Long
Pasos para escribir una clase Entity

Paso 3: Declarar los métodos getter/setter para los


atributos persistentes

Paso 4: Implementar la interfaz java.io.Serializable


¿Qué es Hibernate?
Hibernate es una herramienta de Mapeo objeto-relacional (ORM) para la
plataforma Java, es el Framework más popular de Persistencia que habilita la
persistencia en clases POJO de forma transparente.

Hibernate es el proveedor por defecto de JPA en Spring Boot, es decir, JPA provee
una especificación abstracta de ORM en Java EE, como un estándar e Hibernate es
un proveedor que implementa dicha especificación.

Facilita el mapeo de atributos entre una base de datos relacional tradicional y el


modelo de objetos de una aplicación, mediante objetos persistentes que siguen
fielmente los conceptos y paradigmas comunes de la programación orientada a
objetos

Utiliza anotaciones en las clases de las entidades que permiten establecer estas
relaciones.
Mapeo
Anotaciones
¿Cómo hace JPA/Hibernate para mapear
Usando anotaciones?

JPA asigna objetos a Las Entidades tienen


una base de datos asociados metadatos
mediante el uso de que describen el
metadatos mapeado

JPA cuenta con reglas


de mapeados por
defecto, solo
Estos metadatos son
necesitamos
anotaciones descritas
anotaciones para
en javax.persistence
excepciones,
configuración por
excepciones
Mapeo de una clase Entidad
Para ser reconocida como una
@Entity
@Table(name = "estudiantes") Entidad la clase debe aparecer
public class Estudiante { con la anotación @Entity

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id; La anotación @Id denota la lcave
primaria, su valor es generado
@Column(length = 50, nullable = false) por @GeneratedValue
private String nombre;

@Column(name = "fecha_nacimiento")
private Date fechaNacimiento;
@Column usado en atributos
private int nota; para sobrescribir el mapeado de
columnas por defecto
public Estudiante() {
}

public Estudiante(String nombre, Date fechaNacimiento, int nota){


this.nombre = nombre;
this.fechaNacimiento = fechaNacimiento; Asigna Entity Estudiante a la tabla
this.nota = nota; estudiantes
}
Genera una clave primaria
...etc... Getters y setters
incremental
Sincroniza valores de atributos en
columnas de la BD
Mapeo de una clase Entidad
• @Entity: Indica que es una clase
POJO de Entidad (representa una
tabla en la base de datos)

• @Table: Específica la tabla principal


relacionada con la entidad.
• name – nombre de la tabla, por
defecto el de la entidad si no se
especifica
• catalog – nombre del catálogo
• schema – nombre del esquema
Mapeo de una clase Entidad
• @Id: Indica la clave primaria de la tabla
• @GeneratedValue: Asociado con la clave
primaria, indica que ésta se debe generar
por ejemplo con una secuencia de la base de
datos
• strategy – estrategia a seguir para la
generación de la clave: AUTO (valor por
defecto, el contenedor decide la
estrategia en función de la base de
datos), IDENTITY (utiliza un contador,
ej: MySQL), SEQUENCE (utiliza una
secuencia, ej: Oracle, PostgreSQL) y
TABLE (utiliza una tabla de
identificadores).
• generator – forma en la que genera la
clave.
Mapeo de una clase Entidad
• @Column: Especifica una columna de
la tabla a mapear con un campo de
la entidad
• name - nombre de la columna.
• unique - si el campo es único
• nullable - si permite nulos.
• insertable - si la columna se
incluirá en la sentencia INSERT
updatable - si la columna se
incluirá en la sentencia UPDATE
• length - longitud de la columna.
• precision - número de decimales
• scale - escala decimal
¿Qué es un DAO?
Data Access Object
¿Qué es un DAO?
En Ingeniería de software, un Data Access
Object (DAO) es una clase que implementa y
provee una interfaz común para acceder y
trabajar con los datos, independiente de las
tecnologías a utilizar JDBC, JPA, Hibernate,
TopLink, OpenJpa, Codo, EclipseLink, iBATIS o
JDO

Esta interface tiene que tener los métodos


necesarios para recuperar y almacenar los
datos (contrato de implementación) con las
operaciones básicas: listar, obtener por id,
guardar, eliminar etc
¿Qué es un DAO?

Separación de la capa de acceso a datos/lógica de negocio


(persistencia). Permite una fácil sustitución de la base de
datos sin afectar a la lógica de negocio

Entonces resumiendo un DAO es simplemente una clase


del modelo que se encarga de implementar las
operaciones básicas de acceso a datos que debe
implementar un contrato, la interfaz.

Para implementar nuestros DAO usaremos el componente


Entity Manager que forma parte de la especificación JPA e
Hibernate su implementación (proveedor).
Data Access Object (DAO)

Se encargan de las tareas


cotidianas detrás de escena
por nosotros,

por ejemplo
consultas y
aplicaciones
y CRUD (Crear,
automatizado Obtener,
por debajo Actualizar y
Borrar) de
manera muy
simple,

con muy poco código, todo


está mecanizado
Data Access Object (DAO)

También se encarga de realizar


y ejecuta las consultas del tipo
SELECT (ORM HQL- Hibernate
Query Language): crear el
objeto, prepara las consultas y
ejecutar
Especificación
JSR-338
JPA
Java Persistence API,
más conocida por su
Busca unificar las
sigla JPA, es la API de
diferentes tecnologías
persistencia
que proveen un mapeo
desarrollada para la
objeto-relacional bajo
plataforma Java EE e
un único estándar
incluida en el estándar
EJB3

El objetivo del diseño


de esta API es no
perder de vista las y usar objetos simples
ventajas de la (conocidos como
orientación a objetos Entity o POJOs).
al interactuar con una
base de datos
Java Persistence API

Para trabajar con la especificación JPA en spring, primero


tenemos que seleccionar un proveedor o implementación de JPA

Hibernate es la implementación preferida

Entre las posibles opciones tenemos

JPA

Hibernate OpenJPA EclipseLink


Spring MVC

Capa de Negocio

ORM Vendor
ej. Hibernate
Capa Persistenca - JPA
Seleccionar un proveedor JPA

En JPA, debemos Por ejemplo,


seleccionar un podemos escoger
proveedor o entre los
implementación siguientes
en la proveedores JPA
configuración de • Hibernate
contexto de • OpenJPA
spring • EclipseLink
JPA
Entity Manager
Clase Entity y el EntityManager

Aplicación

<<interface>>
EntityManager
+persist(entity: Object): Object
+remove(entity: Object): void
+find(entity: Class<T>, primaryKey: Object): Class<T>
+createQuery(query: String): Query

SQL/JDBC
<<entity>>
Libro
-id: Integer
Base de -nombre: String
Datos -fechaNacimiento: Date
-nota: int
Es la interfaz en la que se Proporciona métodos
apoya la API de para manejar la
persistencia y la que se persistencia de un objeto
encarga del mapeo entre de Entidad, permite
una tabla relacional y su agregar, eliminar, editar,
objeto de entidad Java consultar (JPQL) y
(Entity) manejar su ciclo de vida

En general se encarga
de manejar o
Es el director de
administrar el
orquestas de las
contexto de
persistencia y sus entidades JPA
entidades
JPA - Entity Manager
• Sus métodos más importantes son
• persist(Object entity): Almacena
un objeto entity en el contexto
de persistencia y en la base de
datos
• merge(Object entity): Actualiza
las modificaciones en una entidad
devolviendo un objeto entity
manejado por el contexto JPA
• remove(Object entity): Elimina la
entidad
• find(Class<T> entity, Object
primaryKey): Busca la entidad a
través de su clave primaria
JPA - Entity Manager
• flush(): Sincroniza las entidades
con la base de datos, hace el
comit

• createQuery(String query): Crea


una query utilizando el lenguaje
JPQL o HQL

• createNativeQuery(): Crea una


query utilizando el lenguaje SQL
Acceso al contexto de Persistencia
• Cualquier implementación DAO o
Repositorio en Spring tendrán que
acceder a un contexto de persistencia
JPA
• Necesita acceder al EntityManager,
por lo tanto es necesario Inyectar la
referencia
• Podemos obtener una referencia al
EntityManager a través de la
anotación @PersistenceContext.

@PersistenceContext
private EntityManager entityManager;
Implementar DAO
con JPA
EntityManager
Implementación DAO usando JPA
@Repository("estudianteDao")
public class JpaEstudianteDao implements EstudianteDao {

@PersistenceContext
private EntityManager entityManager;

@Transactional
public void save(Estudiante estudiante) {
entityManager.merge(estudiante);
}

@Transactional
public void delete(Integer estudianteId) {
Estudiante estudiante = entityManager.find(Estudiante.class, estudianteId);
entityManager.remove(estudiante);
}

@Transactional(readOnly = true)
public Estudiante findById(Integer estudianteId) {
return entityManager.find(Estudiante.class, estudianteId);
}

@Transactional(readOnly = true)
public List<Estudiante> findAll() {
Query query = entityManager.createQuery("from Estudiante");
return query.getResultList();
}
}
Implementación DAO usando JPA

El DAO no tiene ninguna dependencia directa


de Spring (salvo las transacciones), sin
embargo se integra muy con Spring

Además, el DAO utiliza la anotaciones


@PersistenceContext (propia de Java EE) para
requerir la inyección del EntityManager

S-ar putea să vă placă și

  • Práctica 1 - Control de Semáforos
    Práctica 1 - Control de Semáforos
    Document5 pagini
    Práctica 1 - Control de Semáforos
    DavidGallegos
    Încă nu există evaluări
  • CAP2
    CAP2
    Document6 pagini
    CAP2
    DavidGallegos
    Încă nu există evaluări
  • Mock Exam DEPC Spanish v062017
    Mock Exam DEPC Spanish v062017
    Document6 pagini
    Mock Exam DEPC Spanish v062017
    DavidGallegos
    100% (1)
  • 04 03 2019 - 05 25 48 - 0
    04 03 2019 - 05 25 48 - 0
    Document10 pagini
    04 03 2019 - 05 25 48 - 0
    DavidGallegos
    Încă nu există evaluări
  • 53754tema 1 Introducción
    53754tema 1 Introducción
    Document37 pagini
    53754tema 1 Introducción
    Victor Urrutia Pezina
    Încă nu există evaluări
  • Pro Git 2da Ed (2014)
    Pro Git 2da Ed (2014)
    Document512 pagini
    Pro Git 2da Ed (2014)
    Anonymous aMgEYoxyB
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • 4.2.4.4 Resuelto
    4.2.4.4 Resuelto
    Document5 pagini
    4.2.4.4 Resuelto
    Carlos A.
    100% (1)
  • Procesos
    Procesos
    Document20 pagini
    Procesos
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document2 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Asdsad
    Asdsad
    Document2 pagini
    Asdsad
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Capítulo 8
    Capítulo 8
    Document3 pagini
    Capítulo 8
    DavidGallegos
    Încă nu există evaluări
  • Tipos de Bases de Datos
    Tipos de Bases de Datos
    Document12 pagini
    Tipos de Bases de Datos
    Jaime A Feria Perez
    Încă nu există evaluări
  • HIBERNATE - Persist en CIA Re..1
    HIBERNATE - Persist en CIA Re..1
    Document203 pagini
    HIBERNATE - Persist en CIA Re..1
    Synthia Luz Condori
    Încă nu există evaluări
  • Manual de Adodb
    Manual de Adodb
    Document60 pagini
    Manual de Adodb
    jorgeluisnt
    Încă nu există evaluări
  • U4 - Administración, Rendimiento y Otros
    U4 - Administración, Rendimiento y Otros
    Document107 pagini
    U4 - Administración, Rendimiento y Otros
    Cristhian Gutarra
    Încă nu există evaluări
  • Practica 2 y 3
    Practica 2 y 3
    Document11 pagini
    Practica 2 y 3
    Lupita Velázquez
    Încă nu există evaluări
  • SQL Create Database
    SQL Create Database
    Document8 pagini
    SQL Create Database
    LuisLlocllaYesquén
    Încă nu există evaluări
  • 10 - Guía MySQL
    10 - Guía MySQL
    Document32 pagini
    10 - Guía MySQL
    Valentina Ferrini
    Încă nu există evaluări
  • Taller
    Taller
    Document10 pagini
    Taller
    Tecnologia ADSI2018
    Încă nu există evaluări
  • Informe Algebra Relacional
    Informe Algebra Relacional
    Document15 pagini
    Informe Algebra Relacional
    Estefany Natalia Parra Mendoza
    Încă nu există evaluări
  • Gui A SQL
    Gui A SQL
    Document8 pagini
    Gui A SQL
    eszszsw
    0% (1)
  • Práctica Final
    Práctica Final
    Document3 pagini
    Práctica Final
    rodrigo-morales-7161
    Încă nu există evaluări
  • 13 Cursores PDF
    13 Cursores PDF
    Document23 pagini
    13 Cursores PDF
    EstebanBareiro
    Încă nu există evaluări
  • Transformacion de Un Esquema E - R A Esquema Relacional
    Transformacion de Un Esquema E - R A Esquema Relacional
    Document6 pagini
    Transformacion de Un Esquema E - R A Esquema Relacional
    OMAR LOPEZ FELIX
    Încă nu există evaluări
  • GuiaLab MantoEquipos
    GuiaLab MantoEquipos
    Document15 pagini
    GuiaLab MantoEquipos
    Daniel Valdera
    Încă nu există evaluări
  • Laboratorio 1 MySQL
    Laboratorio 1 MySQL
    Document7 pagini
    Laboratorio 1 MySQL
    Sebastian Vallejo Aguirre
    Încă nu există evaluări
  • A2 - Manual Sentencias en SQL
    A2 - Manual Sentencias en SQL
    Document16 pagini
    A2 - Manual Sentencias en SQL
    josemedinaf
    Încă nu există evaluări
  • Glab S08 Faranzamendi 2023 02
    Glab S08 Faranzamendi 2023 02
    Document22 pagini
    Glab S08 Faranzamendi 2023 02
    ookami.6910
    Încă nu există evaluări
  • Ejemplos SQL
    Ejemplos SQL
    Document4 pagini
    Ejemplos SQL
    yenny
    Încă nu există evaluări
  • Prueba de Hipotesis
    Prueba de Hipotesis
    Document19 pagini
    Prueba de Hipotesis
    Roberto Carlos
    Încă nu există evaluări
  • Triggers
    Triggers
    Document247 pagini
    Triggers
    Juan Pedro Santos Fernández
    100% (2)
  • Excepciones en Oracle
    Excepciones en Oracle
    Document23 pagini
    Excepciones en Oracle
    Robert Salinas Flores
    Încă nu există evaluări
  • PLSQL Alumnos
    PLSQL Alumnos
    Document39 pagini
    PLSQL Alumnos
    Worh Falex
    Încă nu există evaluări
  • Guía de Práctica #03
    Guía de Práctica #03
    Document4 pagini
    Guía de Práctica #03
    rolochat
    Încă nu există evaluări
  • Inteligencia de Negocios 01
    Inteligencia de Negocios 01
    Document35 pagini
    Inteligencia de Negocios 01
    WILDER GILMER ESPINOZA LUNA
    Încă nu există evaluări
  • Test 1111
    Test 1111
    Document9 pagini
    Test 1111
    AlexMartinezSanchez
    Încă nu există evaluări
  • ACA No. 3-ADMINISTRACION DE BASES DE DATOS
    ACA No. 3-ADMINISTRACION DE BASES DE DATOS
    Document16 pagini
    ACA No. 3-ADMINISTRACION DE BASES DE DATOS
    Jeison Capera
    100% (1)
  • TEMA SQLite
    TEMA SQLite
    Document8 pagini
    TEMA SQLite
    Cristhian Deza Castillo
    Încă nu există evaluări
  • Clase 02 - SQL - Introducción A Las Bases de Datos Relacionales
    Clase 02 - SQL - Introducción A Las Bases de Datos Relacionales
    Document20 pagini
    Clase 02 - SQL - Introducción A Las Bases de Datos Relacionales
    Joaquin Critter
    Încă nu există evaluări
  • Practica SQL PDF
    Practica SQL PDF
    Document7 pagini
    Practica SQL PDF
    Nilton Laura Miranda
    Încă nu există evaluări
  • Practica1 Mysql Basico
    Practica1 Mysql Basico
    Document3 pagini
    Practica1 Mysql Basico
    CarlozMCortes
    Încă nu există evaluări