
Hoy hablamos del Mapeo Objeto-Relacional o como se conocen comúnmente, ORM (del inglés Object Relational Mapping). Algunos de vosotros ya sabréis que son pero, para aquellos que no los conozcan, un ORM te permite convertir los datos de tus objectos en un formato correcto para poder guardar la información en una base de datos (mapeo) creándose una base de datos virtual donde los datos que se encuentran en nuestra aplicación, quedan vinculados a la base de datos (persistencia).
Si alguna vez has programado alguna aplicación que se conecta a una base de datos, habrás podido comprobar lo laborioso que es transformar toda la información que recibes de la base datos, principalmente en tablas, en los objetos de tu aplicación y viceversa. A ésto se le denomina mapeo. Utilizando un ORM este mapeo será automático, es más, será independiente de la base de datos que estés utilizando en ese momento pudiendo cambiar de motor de base de datos según tus necesidades.Veamos un ejemplo. Supongamos que tenemos una tabla de clientes. En nuestra aplicación queremos hacer las funciones básicas sobre base de datos CRUD (del inglés Create, Read, Update and Delete) Crear, Obtener, Actualizar y Borrar. Cada operación corresponde con una sentencia SQL.
- Creear: INSERT
- Obtener: SELECT
- Actualizar: UPDATE
- Borrar: DELETE
Si queremos insertar un cliente nuevo y no utilizamos un ORM, el código quedaría de la siguiente manera si utilizamos C#:
1 2 3 4 5 6 7 8 |
String query = "INSERT INTO clientes (id,nombre,email,pais) VALUES (@id, @nombre, @email, @pais)"; command.Parameters.AddWithValue("@id","1") command.Parameters.AddWithValue("@nombre","nombre") command.Parameters.AddWithValue("@email","email") command.Parameters.AddWithValue("@pais","pais") command.ExecuteNonQuery(); |
En cambio si utilizamos un ORM, el código se puede reducir de la siguiente manera:
1 2 3 4 5 6 |
var cliente = new Cliente(); cliente.Id = "1"; cliente.Nombre = "nombre"; cliente.Email = "email"; cliente.Pais = "pais"; session.Save(customer); |
Como podéis comprobar se ha reducido considerablemente el código. Pero lo más importante de todo, bajo mi punto de vista, es que, imaginaros que ahora modificamos la tabla de nuestra base de datos y añadimos un campo más como por ejemplo el apellido de nuestro cliente. En los dos casos, tendríamos que añadir a nuestra clase Cliente la propiedad correspondiente al apellido pero, si no utilizas un ORM te tocará revisarte todas las sentencias INSERT, SELECT y UPDATE para introducir dicho campo en cada una de ellas. En cambio si utilizas un ORM , lo único que tendrás que hacer será añadir la propiedad a la clase correspondiente. La sentencia save seguirá siendo la misma, el ORM se encargará de modificar los INSERT, SELECT y UPDATE por ti. Esto se cumple hasta cierto punto. Hay algún ORM como MyBatis, que utiliza un híbrido entre los dos mundos. En MyBatis, las sentencias SQL están escritas en archivos XML. Esto implica que si modificas la base de datos, también tendrás que modificar las sentencias del XML correspondiente.
Además de lo que hemos visto hasta el momento, gracias a los ORM nos abstraemos del motor de base de datos que estamos utilizando es decir, si en algún momento queremos cambiar de base de datos, nos resultará sumamente sencillo. En algunos casos con solo cambiar un par de líneas de código, estaremos cambiando de motor de base de datos.
Existen varios ORM en el mercado. Todo dependerá del lenguaje de programación que estemos utilizando y de nuestras necesidades. A continuación podemos ver los ORM para algunos lenguajes de programación:
- Hibernate (Java)
- MyBatis (Java)
- Ebean (Java)
- Entity Famework (.NET)
- NHibernate (.NET)
- MyBatis.NET (.NET)
- Doctrine (PHP)
- Propel (PHP)
- Rocks (PHP)
- Torpor (PHP)
Si en algún momento desarrolláis alguna aplicación con acceso a base de datos, no dudéis en utilizar un ORM, os simplificará el trabajo enormemente.