3.8.13

Mybatis + C# ( .NET ) == Success! (1/?)

Hope to get this post translated soon enough for anybody reading this and wondering why there isn't an English version! :D



Saludos gente bonita de CUCEI (que espero sean mayoría) y demás procedencias, el día de hoy me nació aprender a utilizar el Framework Mybatis de Persistencia para C# (ya que lo utilizo profesionalmente en mi trabajo como programador en Java) just because, y les vengo a relatar mi experiencia, con la esperanza de que les sea de utilidad, ya sea como referencia, cultura general o una tarea...





Y pues vamos a desmenuzar el pollo:

Persistencia:
CoffEscuandotucrushnotepelaperotuigualsiguesahírogándolecoff!

Ahhh, es simplemente la translación de objetos o información temporal generada en un programa a un medio "persistente", que soporte la carga y descarga del programa y no destruya los datos en el acto... Escribir archivos CSV, de longitud fija y demás (como bases de datos) es la persistencia.

Entonces Mybatis viene como un amigo que nos ayudará a realizar las operaciones INSERT, UPDATE, SELECT y DELETE, además de procedimientos mas gandalla de una manera bien nice, ordenada y modular, para no tener líneas y líneas de código que se la pasan definiendo queries...

Y de donde sacamos a este amiguito???

https://code.google.com/p/mybatisnet/downloads/detail?name=IBatis.DataMapper.1.6.2.bin.zip&can=3&q= (al 3 de Agosto de 2013)

Unzip y téngan a su amiguito cocked, locked and ready to rock...

Lo siguiente a conseguirnos será el Driver de Npgsql:

http://pgfoundry.org/frs/download.php/3493/Npgsql2.0.13.91-bin-ms.net4.0.zip

Dado que lo hice en Windows... Ustedes decidan si bajar ese u otro más mejor (como ustedes dicen) para sus necesidades...

Mismo que con Mybatis, unizip, cock y todo eso... ¬w¬

A lo mero bueno...


Especificaciones: Who fckin' cares???

I DO care:
Visual C# Express

Postgresql instalado y corriendo, con una base de Datos llamada TestingSpring (la uso para otras cosas) con la tabla shiro_users (ahí ustedes le cambian según sea necesario).

Mucha paciencia y los scripts de creación y población de la tabla: bájatelos !


Abrimos Visual C# o Visual Studio o lo que caramba esten usando:

Creamos una nueva solución de Windows Forms y le ponen el nombre que quieran, dado que quiero asociar las queries a botones y eventos con interfaz, por motivos que solo a mi me interesan.

Una vez creado, y no se si deban hacerlo ustedes tambien, pero a mi me la hizo de tos, así que click derecho al proyecto, Propiedades y el Target Framework a .Net v4 que no diga Client, por alguna maldita cláusula imperialista de Microsoft razón... En fin... Guardar, debe reabrir el proyecto, ready to go!!!




Agregamos las referencias:
IbatisNet.Common.dll
IbatisNet.Common.Logging.Log4Net.dll
IbatisNet.DataMapper.dll
log4net.dll
Npgsql.dll
Npgsql.resources.dll
policy.2.0.Npgsql.dll

Ahora vamos a crear nuestro Mapper... Que vertebras es un Mapper???

Es una clase que nos ayudará a Mapear las propiedades de nuestras clases de modelo de Datos y usarlas dentro de sentencias SQL o mapearlas de resultados de queries para construir objetos... Bien nice... *u*

Y la llamaré MyBatisTestDAO.cs


MyBatisTestDAO

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IBatisNet.Common.Utilities;
using IBatisNet.DataMapper;
using IBatisNet.DataMapper.Configuration;

namespace DemoDataBaseMyBatis
{
class MyBatisTestDAO
{
private static ISqlMapper mapper = null;

protected static void Configure(object obj)
{
mapper = null;
}

public static void init()
{
ConfigureHandler handler = new ConfigureHandler(Configure);
DomSqlMapBuilder builder = new DomSqlMapBuilder();
mapper = builder.ConfigureAndWatch(handler);

}

public static ISqlMapper Instance()
{
if (mapper == null)
{
lock (typeof(SqlMapper))
{
if (mapper == null) // double-check
{
init();
}
}
}
return mapper;
}
public static ISqlMapper Get()
{
return Instance();
}
}
}


El código anterior es mero código de placa de boiler, por lo que no tiene mucha importancia, salvo el hecho de que hemos generado un Singleton de nuestro Mapper, y así no tendremos que estar gestionando las conexiones, Mybatis ya se encargará de ello.

Vamos a crear una clase de modelo de datos llamada Usuario.cs

Usuario.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DemoDataBaseMyBatis
{
public class Usuario
{
private string _nombre;
private string _password;

public string Nombre { set{ _nombre = value;} get{ return _nombre;} }
public string Password { set { _password = value; } get { return _password; } }
}
}


Finalmente vamos a modificar la Form1 que viene por defecto, yo le cambiaré el nombre a MainWindow y le agregaré un lindo botón que nos permitirá activar las operaciones que queramos en la BD, es escueto porque tengo mucha flojera y debería estar en una fiesta es un demo! Renombraré el botón como btnTriggerBD y le asociaré un evento y pondré como un campo una interfaz del mapper para poder utilizarlo:


MainWindow.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using IBatisNet.DataMapper;

namespace DemoDataBaseMyBatis
{
public partial class MainWindow : Form
{
ISqlMapper mapper = null;

public MainWindow()
{
InitializeComponent();

mapper = MyBatisTestDAO.Instance();
}

private void btnTriggerBD_Click(object sender, EventArgs e)
{
Usuario param = new Usuario();
param.Nombre = "MxVulture";

Usuario user = mapper.QueryForObject("selectByUserNameObject", param);

Console.WriteLine(user.Nombre);
Console.WriteLine(user.Password);

user = mapper.QueryForObject("selectByUserName", "MxVulture");

Console.WriteLine(user.Nombre);
Console.WriteLine(user.Password);

user.Nombre = "Nuevo Nombre";
user.Password = "Nuevo_password";
Console.WriteLine(mapper.Insert("insertUsuario", user));

IList lista = mapper.QueryForList("selectList", null);

foreach (Usuario us in lista)
{
Console.WriteLine(us.Nombre);
Console.WriteLine(us.Password);
}


}


}
}



Como pueden observar, ISqlMapper es la interfaz que les mencionaba que nos permitirá hacer nuestras sentencias SELECT, UPDATE, etc...

Y agregué un poco de código al evento, en el que solicitaré dos veces el mismo usuario usando dos maneras distintas, luego insertaré uno nuevo y finalmente pediré la lista completa de los usuarios usando la interfaz IList, todo esto para mostrarles como nos evitamos ya la pena de tener que mapear nosotros mismos los campos y estarlos parseando, esta cosa es oro puro! :D

Voy a dejarlo hasta aquí debido a que el proyecto ya es bastantito código (sin embargo este es todo el código que necesitamos!), solo resta el mapeado de objetos, que es lo mero bueno y no quiero meter tanto info el fregado post, al final hay un link para llegar a la siguiente parte de este manual!

Agradezco enormemente a http://coderstalk.blogspot.mx en su artículo:
http://coderstalk.blogspot.mx/2007/07/how-to-show-and-hide-text-in-blog-post.html

Por la mágica manera de poder ocultar los <span> con un link! Gracias!!! x3

this->parte2;

2 comments :

  1. Buena introducción, quien diría que escribes de forma simpática.

    Mas les vale saber bien esta clase de frameworks que evitan esas feas sentencias [hasta suenan a castigo D:] SQL

    ReplyDelete
  2. Gracias por este trabajo, me sirvio a montones! Muy agradecido, saludos desde Peru :)

    ReplyDelete

Hazmela de tos aqui abajito!!! :D