Está en la página 1de 41

OBJECT-RELATIONAL MAPPING

ORM

Msc. Ing. Remberto Gonzales Cruz


rembertus@gmail.com
INDICE DE CONTENIDO
 Bases de Datos
 Tablas Relacionales
 Structured Query Language – SQL
 Programación Orientada a Objetos
 Arquitectura de Aplicaciones
 Object-Relational Mapping
 Operaciones CRUD
 Transacciones
 Concurrencia
 Caching
 Desventajas
 Ventajas
BASE DE DATOS
Base de Datos

 Es un conjunto de DATOS pertenecientes a un mismo contexto y almacenados


sistemáticamente para su posterior uso.

Ejemplo general: Una biblioteca puede considerarse una base de datos


compuesta en su mayoría por documentos y textos impresos en papel e indexados
para su consulta.

 Actualmente, y debido al desarrollo tecnológico, casi la totalidad de las bases de


datos están en formato digital (electrónico), que ofrece un amplio rango de
soluciones al problema de almacenar datos.

MODELOS DE BASES DE DATOS:

 Bases de datos jerárquicas, Base de datos de red, Base de datos Relacionales,


Bases de datos multidimensionales, Bases de datos orientadas a objetos, Bases de
datos documentales, Base de datos deductivas, Bases de datos distribuida
Base de Datos
BASE DE DATOS RELACIONALES
Tabla 1 Tabla 2 Tabla N

...

Atributos Tuplas

Base de Datos
Base de Datos
Aplicación 1 Servicio 1
 Aplicaciones para  Servicios para
Usuarios Finales Aplicaciones

 SQL Server
 MySQL
 PosgreeSQL
 Oracle
 DB2
…

Aplicación N Servicio N

 Aplicaciones para  Servicios para


Usuarios Finales Aplicaciones
SQL
STRUCTURED QUERY LANGUAGE

SQL
Structured Query Language

Las Bases de Datos relacionales utilizan una interfaz para acceder a ellos llamada
SQL o Structured Query Language (Lenguaje Estructurado de Consultas) que
permiten hacer solicitudes/peticiones a una base de datos usando una notación
muy similar a lenguaje natural.

SELECT identificador, password FROM usuarios WHERE identificador = 3;


Structured Query Language
SELECT identificador, password FROM usuarios;

identificador password
jperez 123456
plopez abc123
marce rt6%78d
palvarez 4uhdf76/4
mcortez asdasds
Structured Query Language
CREATE DATABASE `ejemplo` /*!40100 DEFAULT CHARACTER SET utf8 */;

CREATE TABLE `usuario` (


`identificador` varchar(12) NOT NULL default '' COMMENT 'IDENTIFICADOR DE USUARIO',
`password` varchar(50) NOT NULL default '' COMMENT 'DESCRIPCION DEL USUARIO',
PRIMARY KEY (`identificador`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT;

CREATE TABLE `rol` (


`codigo` varchar(12) NOT NULL default '' COMMENT 'CODIGO DEL ROL',
`descripcion` varchar(100) NOT NULL default '' COMMENT 'DESCRIPCION DEL ROL',
`tipo` smallint(1) NOT NULL default '0' COMMENT '0 = Normal, 9 =Sistema',
PRIMARY KEY (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

CREATE TABLE `usuariorol` (


`idusuario` varchar(12) NOT NULL default '' COMMENT 'CODIGO USUARIO',
`codigorol` varchar(12) NOT NULL default '' COMMENT 'CODIGO DE ROL',
PRIMARY KEY (`idusuario`,`codigorol`),
KEY `usrrol-usuario` (`idusuario`),
KEY `usrrol-rol` (`codigorol`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

CREATE TABLE `log` (


`id` int(11) NOT NULL auto_increment COMMENT 'CODIGO SECUENCIAL DEL LOG',
`idusuario` varchar(12) NOT NULL default '' COMMENT 'IDENTIFICADOR DE USUARIO',
`fecha` datetime NOT NULL default '0000-00-00 00:00:00' COMMENT 'FECHA DEL LOG',
`operacion` varchar(1) NOT NULL default '' COMMENT '(A)ADICION, (D) ELETE, (U) ACTUALIZACION',
`valor` varchar(2000) default NULL COMMENT 'VALOR ACTUAL DE LA TUPLA',
`equipo` varchar(100) NOT NULL default '' COMMENT 'NOMBRE DEL EQUIPO CLIENTE',
`numeroip` varchar(50) default NULL COMMENT 'NUMERO DE IP DEL EQUIPO',
PRIMARY KEY (`id`),
KEY `log-usuario` (`idusuario`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

ALTER TABLE `usuariorol`


ADD CONSTRAINT `usrrol-usuario` FOREIGN KEY (`idusuario`) REFERENCES `usuario` (`identificador`),
ADD CONSTRAINT `usrrol-rol` FOREIGN KEY (`codigorol`) REFERENCES `rol` (`codigo`);

ALTER TABLE `log`


ADD CONSTRAINT `log-usuario` FOREIGN KEY (`idusuario`) REFERENCES `usuario` (`identificador`);
Structured Query Language

INSERT INTO usuario (identificador, password) VALUES(“jperez”, “123456”);

INSERT INTO rol (codigo, descripcion, tipo) VALUES(“rol01”, “arqueo de datos”, 0);

INSERT INTO usuariorol (idusuario, codigorol) VALUES(“jperez”, “rol01”);

UPDATE usuario SET password = “Hfg/75*34” WHERE identificador = “jperez”;

DELETE FROM usuario WHERE identificador = “jperez”;

SELECT TOP 10 * FROM usuario // SqlServer


SELECT * FROM usuario LIMIT 10 // MySQL
SELECT * FROM usuario WHERE rownum<=11; // Oracle

POO
PROGRAMACIÓN ORIENTADA A OBJETOS

POO
Programación Orientada a Objetos

 Lenguajes basados en objetos


 Principios simples llevan a mejor diseño

 La lógica de negocio se plantea de forma más fácil

 Permite concentrarnos en lógica y resultados, no en la DATA

 Características propias de la O.O. (Herencia, Polimorfismo,


Encapsulamiento, Abstracción, …)

 Un modelo de clases es mucho más rico en posibilidad de


asociaciones y navegabilidad que un esquema de tablas
relacionadas.
Programación Orientada a Objetos
CLASES POCO - POJO

public class Usuario public class Log


{
{
long Id;
public string IdentificadorUsuario;
string IdentificadorUsuario;
public string PasswordUsuario;
DateTime FechaRegistro;
public List[] listaRoles;
string Operacionrealizada;
}
string ValorActual;
class Rol
string NombreEquipo;
{
string CodigoRol;
string NumeroIp;
}
string DescripcionRol;

public virtual int TipoRol;


}
Programación Orientada a Objetos
Usuario EntidadUsuario = new Usuario();

EntidadUsuario.CodigoUsuario = txtIdentificador.Text;
EntidadUsuario.Descripcion = txtDescripcion.Text

conexion = OpenDataBaseConecction(parametros);
sqlCommand = new sqlCommand(“INSERT INTO usuario (identificador, password)
VALUES(EntidadUsuario.CodigoUsuario,
EntidadUsuario.Descripcion);
”);

conexion.ExecuteSqlCommand(sqlCommand);
conexion.ExecuteSqlCommit();

“Las operaciones a la Base de Datos se realizan a “MANO”, lo que hace que la ventaja de los lenguajes
Orientados a Objetos se pierda, ya que había que crear una petición a la base de datos de manera
manual (y específica para cada sistema, ya que no todos los gestores de bases de datos tienen la
misma implementación del lenguaje SQL).”

“Es necesaria una adaptación de los datos a la aplicación además del aprendizaje del lenguaje de
gestión de la Bases de Datos” AAPP
ARQUITECTURA DE APLICACIONES
Arquitectura de aplicaciones
3 - LAYER
 Permitir el ingreso de datos del Usuario
 Mostrar información en la IU
 Capturar eventos de la IU
PRESENTACION  Enviar información del usuario a la Capa de Negocio
 Recibir y presentar los resultados del procesamiento
Devolver Invocar en la Capa de Negocio

 Da forma al modelo de negocio


NEGOCIO  Posee los objetos o entidades de negocio
 Posee las reglas de negocio
Invocar  Procesa los datos de “Presentación”
Devolver  Interactúa con la Capa de Datos para ejecutar las
operaciones de negocio.
 Envía el resultado procesado a la Capa de
DATOS Presentación

Interactuar  Accede a las fuentes de datos (BD, archivos)


 Es responsable de: (1) Almacenar datos, (2) Recuperar
datos, (3) Mantener datos, y de la (3) Integridad de los
datos.
 Mapea datos a objetos de negocio.
 Además, invoca e interactúa con otros servicios.
 Envía la información procesada a la Capa de Negocio
Arquitectura de aplicaciones
Proporciona significado a las ordenes del
MVC 
usuario, actuando sobre los datos
representados por el Modelo.
 Cuando se realiza algún cambio, entra en
CONTROLADOR acción, bien sea por cambios en la
información del Modelo o por alteraciones
de la Vista.
 Interactúa con el Modelo a través de una
referencia al propio Modelo.

 Representa los datos del


VISTA MODELO programa.
 Maneja los datos y controla
todas sus transformaciones.
Interactuar  No tiene conocimiento
específico de los Controladores
o de las Vistas, ni siquiera
 Maneja la presentación visual de los contiene referencias a ellos.
datos representados por el Modelo.  El sistema es el que tiene
 Genera una representación visual del encomendada la
Modelo y muestra los datos al responsabilidad de mantener
usuario. enlaces entre el Modelo y sus
 Interactúa con el Modelo a través de Vistas, y notificar a las Vistas
una referencia al propio Modelo. cuando cambia el Modelo.
Arquitectura de aplicaciones
DIAGRAMA DE CASOS DE USO
Arquitectura de aplicaciones

ORM
OBJECT-RELATIONAL MAPPING
Object-Relational Mapping
¿Qué es ORM?

Es una técnica/modelo de programación que nos permite


vincular/convertir/transformar/mapear los OBJETOS usados en nuestra aplicación con una
Base de Datos RELACIONAL.

OBJETOS ORM RELACIONAL

Aplicación Orientada a Middleware Base de Datos


Objetos MAPEO
Object-Relational Mapping
BENEFICIOS
 Productividad: Ahorra mucho trabajo engorroso y repetitivo.

 Mantenibilidad: Al haber menos código la aplicación es más mantenible.


Además, evita el acoplamiento en el diseño del modelo de negocio y el de
persistencia, cuando este último se hace a mano.

 Rendimiento: ORM realiza muchas optimizaciones, algunas dependientes de


la BD en particular.

 Abstracción del motor de Base de Datos: Generación de forma automática de


las consultas a la base de datos para convertir los registros en objetos (y
viceversa) y éstas deben poder adaptarse a los distintos proveedores (MySql,
Oracle, DB2,…).

 Reutilización: Permitiendo llamar a los métodos de un objeto de datos desde


distintas partes de la aplicación e incluso desde diferentes aplicaciones.
Object-Relational Mapping
BENEFICIOS

 Encapsulación: La capa ORM encapsula la lógica de los datos pudiendo


hacer cambios que afectan a toda la aplicación únicamente modificando
una función.

 Portabilidad: Utilizar una capa de abstracción nos permite cambiar en


mitad de un proyecto de una base de datos MySQL a una Oracle sin
ningún tipo de complicación. Esto es debido a que no utilizamos una
sintaxis MySQL, Oracle o SQLite para acceder a nuestro modelo, sino
una sintaxis propia del ORM utilizado que es capaz de traducir a
diferentes tipos de bases de datos.

 Seguridad: Los ORM suelen implementar mecanísmos de seguridad que


protegen nuestra aplicación de los ataques más comúnes como SQL
Injections.
Object-Relational Mapping
LENGUAJES Y ORMs
 JAVA: ActiveJDBC, ActiveJPA, Athena Framework, Cayenne, Hibernate, Java Data
Objects (JDO), Java Object Oriented Querying (jOOQ), Java Persistence API (JPA), Kodo,
Torque
 ANDROID: greenDAO (SQLite), ORMLite

 JAVASCRIPT: Knex / Bookshelf, Sequelize


 iOS: DatabaseObjects, Core Data
 .NET: Business Logic Toolkit, Castle ActiveRecord, DatabaseObjects .NET,
DataObjects.NET, Dapper, Entity Framework, EntitySpaces, iBATIS, LINQ to SQL,
Nhibernate, nHydrate, Persistor.NET, Quick Objects, Signum Framework, SubSonic,
Telerik Data Access
 OBJECT PASCAL (DELPHI): Bold for Delphi, ECO, EntityDAC
 OBJECTIVE-C, COCOA: Enterprise Objects, Core Data
 PHP: CakePHP, CodeIgniter, Doctrine, FuelPHP, PHPixie, Propel, Qcodo, Qcubed, Rocks,
Redbean, Torpor
 PYTHON: Peewee ORM, SQLAlchemy, SQLObject, Storm, Tryton
 RUBY: ActiveRecord, Sequel
 … CRUD
Object-Relational Mapping
OPERACIONES CRUD

 Acronimo de: Create(Crear), Read(Leer), Update(Actualizar),


Delete(Eliminar)

 Utilizado para referirse a las funciones básicas de persistencia en la


Bases de Datos.

 Persistencia de Objetos Simples.

 Persistencia de Objetos Compuestos.

 Persistencia de Colecciones de Objetos.


Object-Relational Mapping
TRANSACCIONES

 Un SGBD se dice transaccional, si es capaz de mantener la integridad de los datos.

 Una cancelación de una transacción, deshace las instrucciones ejecutadas hasta dejar la
base de datos en su estado inicial, como si la orden de la transacción nunca se hubiese
realizado.

 Una transacción debe contar con ACID (un acrónimo inglés) que quiere decir: Atomicidad,
Consistencia, Aislamiento y Durabilidad. Entonces para que un Sistema de Gestión de Bases
de Datos sea considerado Transaccional, debe cumplir con estos criterios (ACID).

BEGIN TRAN: Especifica que va a empezar una transacción.


COMMIT TRAN: Le indica al motor que puede considerar la transacción completada con
éxito.
ROLLBACK TRAN: Indica que se ha alcanzado un fallo y que debe restablecer la base al
punto de integridad.
Object-Relational Mapping
CONCURRENCIA

 Propiedad de los sistemas que permiten que múltiples procesos sean ejecutados al mismo
tiempo, y que potencialmente puedan interactuar entre sí.

 Los procesos concurrentes pueden ser ejecutados realmente de forma simultánea, sólo
cuando cada uno es ejecutado en diferentes procesadores.

 En cambio, la concurrencia es simulada si sólo existe un procesador encargado de ejecutar


los procesos concurrentes, simulando la concurrencia, ocupándose de forma alternada en
uno y otro proceso a pequeñísimos intervalos de tiempo.

 Debido a que los procesos concurrentes en un sistema pueden interactuar entre otros
también en ejecución, el número de caminos de ejecución puede ser extremadamente
grande, resultando en un comportamiento sumamente complejo.

 En un ORM, la capacidad de soporte de usuarios accediendo a una Dase de Datos


simultaneamente.
Object-Relational Mapping
CACHING

 La cache es la memoria de acceso rápido de un ordenador, que guarda temporalmente las


últimas informaciones procesadas.

 La memoria cache es un búfer especial de memoria que poseen las computadoras, que
funciona de manera similar a la memoria principal, pero es de menor tamaño y de acceso
más rápido.

 Cuando se accede por primera vez a un dato, se hace una copia en la cache; los accesos
siguientes se realizan a dicha copia, haciendo que sea menor el tiempo de acceso medio al
dato.

 Cuando la aplicación necesita leer desde la Base de Datos, primero verifica si una copia de
los datos está en la caché; si es así, se lee desde ahí, sino se hace el acceso hasta la Base de
Datos.
Object-Relational Mapping
Usuario EntidadUsuario = new Usuario();
EntidadUsuario.CodigoUsuario = txtIdentificador.Text;
EntidadUsuario.Descripcion = txtDescripcion.Text
conexion = OpenDataBaseConecction(parametros);
sqlCommand = new sqlCommand(“INSERT INTO usuario (identificador, password)
VALUES(EntidadUsuario.CodigoUsuario,
EntidadUsuario.Descripcion);
”);
conexion.ExecuteSqlCommand(sqlCommand);
conexion.ExecuteSqlCommit();

//********************************************************************************//
Usuario EntidadUsuario = new Usuario();
EntidadUsuario.CodigoUsuario = txtIdentificador.Text;
EntidadUsuario.Descripcion = txtDescripcion.Text
Session_Conexion.Save(EntidadUsuario);

DOC
Object-Relational Mapping
DOCTRINE - PHP
 Doctrine es una librería muy completa y muy
configurable.
 Generación automática del modelo. (cuando
se diseña un modelo relacional y un modelo
de clases, suelen ser parecidos. Doctrine se
aprovecha de esta similitud y nos permite
generar de forma automática el modelo de
clases basándose en el modelo relacional de
tablas.)
 Posibilidad de trabajar con YAML. (Formato
de serialización de datos legible
 Buscadores mágicos (Magic finders) . (find(),
findByNombreAtributo(), findAll())
 Relaciones entre entidades.
 Doctrine Query Language - DQL.
 Extrae objetos de la base de datos, no tuplas.
 No es necesario escribir los joins a mano.
Object-Relational Mapping
HIBERNATE - JAVA
• Es una capa de persistencia objeto/relacional y un
generador de sentencias SQL.
• Emplea atributos declarativos mediante XML
(mapeo de objetos relacionales en ficheros) o
Anotaciones (directo en el código fuente).
• Compilador de Archivos de Mapeo (BuildSessionfactory),
incorporado, para la validación de archivos HBM.
• Soporte de: Generics, Nullable Types, Stored Procedures, Named Queries, Sql, Hql,
ICriteria, Ienumerable.
• Soporte de Transacciones de forma natural.
• Soporte de caching (nivel 1 por defecto, y nivel 2 a través de configuración en la
SessionFactory)
• Soporte de Concurrencia, a través del elemento TimeStamp o el tag Version, en el archivo
de mapeo.
• Control de datos de Auditoria, a través de la interfaz Iinterceptor o IListener.
• Mapeo con herencia: table-per-class-hierarchy, table-per-subclass, table-per-concrete-
class
• Licencia GNU/LGPL y posee una versión para .NET llamada nHibernate.
Object-Relational Mapping
ENTITY FRAMEWORK - VISUAL STUDIO
 Conjunto de APIs que proporcionan acceso a datos en .NET.
Se distribuye junto con el .NET Framework 3.5 SP1.
 Modos de trabajo
 Database First: Comenzando con la Base de Datos, crea las
entidades y los mapeos a partir de ellas.
 Model First: Cuando solo se tiene las entidades, y a partir de ellas
crear la estructura de la Base de Datos.
 Code First: Cuando se está en total control de todos los aspectos del
ciclo de vida del desarrollo. Definición de manera manual, las clases,
relaciones y mapeos, generación del código para crear la Base de
Datos.
 Soporte de Async tanto para hacer consultar como para guardar datos.
 Connection Resiliency - Conexión Flexible, para toma de acciones cuando no se tiene
conexión a la Base de Datos.
 Configuración por código.
 Registro de interceptación SQL, proporciona bloques de bajo nivel para la interceptación
de las operaciones para los Logs.
 Soporte de consultas Enumerable.Contains con LINQ.
 Implementaciones personalizadas de Equals o GetHashCode en las entidades.
EJE
Object-Relational Mapping
EJEMPLO EN PHP-DOCTRINE
YAML Anotaciones
namespace Ejemplo\Datos\Entity;
use Doctrine\ORM\Mapping as ORM;

# /**
src/Ejemplo/Datos/Resources/config/doctrine/Usuario.o * @ORM\Entity
rm.yml * @ORM\Table(name="tusuario")
Ejemplo\Datos\Entity\Usuario: */
type: entity class Usuario
table: usuario {
id: /**
identificador: * @ORM\Id
type: string * @ORM\Column(type="string", length=16)
length: 16 */
generator: { strategy: AUTO } protected $identificador;
fields:
password: /**
type: string * @ORM\Column(type="string", length=50)
length: 50 */
protected $password;
}

identificador password
<php jperez 123456

plopez abc123
$usuario = new Usuario();
$ usuario ->identificador = “jperez”; marce rt6%78d
$ usuario ->password = “123456”; palvarez 4uhdf76/4
$ usuario ->save();
mcortez asdasds
Object-Relational Mapping
VISUAL STUDIO C# - NHIBERNATE
Entidad Usuario Archivo de Mapeo
namespace Entidades
{ <?xml version="1.0" encoding="utf-8" ?>
/// <summary> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
/// Define la Clase. namespace=“Entidades"
/// </summary> assembly=" Entidades "
[Auditable] default-lazy="true">
public class Usuario
{ <class name="Usuario" table=“tusuario">
/// <summary>
/// Gets or sets Identificador. <id name=“Identificador" column=“identificador">
/// </summary> <generator class="assigned"/>
public virtual string Identificador { get; set; } </id>

/// <summary> <property name=“Password" column=“password"/>


/// Gets or sets Password.
/// </summary> </class>
public virtual string Password { get; set; } </hibernate-mapping>
}
}

private BtnGuardarClick() { identificador password

jperez 123456
Usuario usuario = new Usuario(
Identificador = “jperez”, plopez abc123

Password = “123456”, marce rt6%78d


);
palvarez 4uhdf76/4
NhSesion.Save(usuario);
mcortez asdasds
}
EVA
CUADRO DE EVALUACION/COMPARACION - ORM-
Framework ORM
eXpress
Entity Signum CASTLE
FUNCIONALIDAD QuickObjects NHibernate EntitySpaces
Framework Framework
Habanero Invist SubSonic
ActiveRecord
Persistent
Objects
CARACTERISTICA

CRUD

Consultas (SQL)

Paquetes (SP, Funciones) SP, Vistas SP, Funciones SP, Vistas SP

Auditoria

Concurrencia

Rendimiento

Caching

Herencia
Cambios a partir del Modelo o
BD
Existen Herram.
BD desde 0
Generación de Código (Clases) adicionales

Transacciones
299 Developer Licencia 200
Costo ($us) 999 por Licencia Gratuito Gratuito Gratuito $us Gratuito Gratuito Gratuito 149,99 (sin SC)

Código Fuente Open Source 499 Source Open Source Open Source Open Source Open Source Open Source 199,99 (con SC)
.CS .CS .CS .CS .CS
Mapeo (.XML ó .CS) .XML ó .CS XML
Dirección de Mapeo Ambos
BD a Entidad BD a Entidad BD a Entidad BD a Entidad BD a Entidad BD a Entidad
(generación) Ambos sentidos Entidad a BD sentidos Ambos sentidos

Documentación/Soporte

Generación de IU

SOPORTA A MEDIAS NO SOPORTA NO SE PROBO NO HAY INFORMACION DESV


DESVENTAJAS
Desventajas

 Tiempo en el aprendizaje
 Este tipo de herramientas suelen ser complejas por lo que su correcta
utilización lleva un tiempo que hay que emplear en ver el funcionamiento
correcto y ver todo el partido que se le puede sacar.

 Aprender el nuevo lenguaje del ORM


 El conocer nuevas “instrucciones”, hacen que nuevamente estemos
aprendiendo un nuevo lenguaje.

 Aplicaciones algo mas lentas


 Esto es debido a que todas las consultas que se hagan sobre la base de datos,
el sistema primero deberá de transformarlas al lenguaje propio de la
herramienta, luego leer los registros y por último crear los objetos.

 Bulk Data
 No es recomendable para persistir grandes volúmenes de Datos (Bulk data
manipulations).
VENTAJAS
Ventajas
 Reduce la escritura de código por el desarrollador en cuanto a la persistencia de
datos.
 Si el nombre de algún atributo (columna) cambia, no es necesario reescribir el
código.
 Abstracción de la base de datos
 Al utilizar un ORM, lo que conseguidos es separarnos totalmente del Gestor de
Base de datos que se utiliza.
 Reutilización.
 Nos permite utilizar los métodos (persistencia) de un objeto de datos desde
distintas zonas de la aplicación, incluso desde aplicaciones distintas.
 Seguridad. Los ORM suelen implementar controles para evitar tipos de ataques tal
como SQL injection.
 Mantenimiento del código
 Nos facilita el mantenimiento del código debido a la correcta ordenación de la
capa de datos, haciendo que el mantenimiento del código sea mucho mas
sencillo.
 Lenguaje propio para realizar las consultas
 Muchos ORM’s traen su propio lenguaje para hacer las consultas, lo que hace
que los usuarios dejen de utilizar SQL para que pasen a utilizar el lenguaje
propio de cada herramienta.
OBJECT-RELATIONAL MAPPING

Msc. Ing. Remberto Gonzales Cruz


www.tr7soft.com
www.dehobbychef.com rembertus@gmail.com

También podría gustarte