3.8.13

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

Que tranza, pues ya volvimos con la segunda parte (como si nos hubieramos ido! xD)

Como recordaremos del post anterior, quedamos con clases ya operativas y solo nos faltaban los elementos que harán funcionar al mapeador, que son 3 archivos:

providers.config
SqlMap.config
SqlMap.xml




Y vámonos por partes:

providers.config


Pos realmente nada, esta cosa la vamos a copiar del zip que extrajimos de Mybatis, solamente hay que hacerle unos lindos tweaks en la parte de Postgres:



provider.config (extracto)


name="PostgreSql0.99.1.0"
description="PostgreSql, Npgsql provider V0.99.1.0"
enabled="true"
assemblyName="Npgsql"


Es necesario quitar toda la mugrera de la versión y sabe que de la parte del Npgsql en assembly name!!! Waters!!! (Aguas!!!)

Y le damos clicks, nos vamos a Properties en el Visual C# y le ponemos en Copy to Output Directory en "Copy Always", y así para los otros dos archivos que les mencioné también! :D


En fin... Prosigamos:

SqlMap.config


Este archivo es el que dará la configuración general a nuestro mapper para realizar las conexiones y definir los alias de las clases que se han de manipular mediante éste. y es bastante dependiente del motor de base de datos que estemos utiliando.

En éste podemos definir propiedades mediante el elemento <properties> y <property>, para reutilizarlas y juntar los parámetros en un solo punto.

Después definimos en <settings> la configuración, la verdad no se de esto así que usaré el código que encontré en el manual de usuario.

<database> es el chido, donde definiremos la conexión a la base de datos, con una cadena específica para cada Gestor de Base de Datos, este es de Postgres y hay ejemplos por todos lados de otros gestores, así que omitiré esta info...

Finalmente <alias> permite definir alias a las clases que usaremos para no tener que usar siempre su "nombre completo" o sea el que tiene toda la ruta de la clase. <sqlMaps> nos permite agregar mappers, que es lo mero chido y es lo que de verdad hace el trabajo.


SqlMap.config


<?xml version="1.0" encoding="utf-8"?>
<sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >

<properties>
<property key="userid" value="mxvulture"/>
<property key="password" value="AeroForceOne"/>
<property key="server" value="127.0.0.1"/>
<property key="database" value="TestingSpring"/>
</properties>

<settings>
<setting useStatementNamespaces="false"/>
<setting cacheModelsEnabled="true"/>
<setting validateSqlMap="true"/>
</settings>

<database>
<provider name="PostgreSql0.99.1.0"/>
<dataSource name="TestingSpring"
connectionString="Server=${server};Port=5432;User Id=${userid};Password=${password};
Database=${database};"></dataSource>
</database>

<alias>
<typeAlias alias="Usuario" type="DemoDataBaseMyBatis.Usuario"/>
</alias>

<sqlMaps>
<sqlMap resource="SqlMap.xml"/>
</sqlMaps>

</sqlMapConfig>


Todo lo que hemos hecho hasta ahora se reduce a nuestro último archivo:

SqlMap.xml


Es la configuración del mappeador, aqui vamos a especificar como se debe mapear cada columna a cada propiedad de los objetos que vamos a utilizar, así como las sentencias SQL que usaremos en la aplicación, su tipo de retorno (que ya pueden ser objetos siempre que las columnas respeten lo definido en el mapper) e incluso el como usar parámetros ya sean tipos nativos de C# o campos dentro de nuestro objeto!

Dos tags principales:

<resultMaps> que puede tener varios child <resultMap> cada uno definiendo mediante <result> una propiedad y columna a ser mapeadas en el objeto.

<statements> contiene varios tags diferentes <select>, <insert>, <update>, <delete> que son (ya adivinaron!) cada una de las diferentes sentencias a ejecutar (por fin!)

Y aquí el místico SqlMap.xml


SqlMap.xml


<?xml version="1.0" encoding="UTF-8" ?>
<sqlMap namespace="Product"
xmlns="http://ibatis.apache.org/mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >

<resultMaps>
<resultMap id="mapaUsuario" class="Usuario">
<result property="Nombre" column="username"/>
<result property="Password" column="password"/>
</resultMap>
</resultMaps>

<statements>
<select id="selectByUserName" parameterClass="string" resultMap="mapaUsuario">
select * from shiro_users where username = #value#
</select>

<select id="selectByUserNameObject" parameterClass="Usuario" resultMap="mapaUsuario">
select * from shiro_users where username = #Nombre#
</select>

<select id="selectList" resultMap="mapaUsuario">
select * from shiro_users
</select>

<insert id ="insertUsuario" parameterClass="Usuario">
insert into shiro_users values(default, #Nombre#, #Password#)
</insert>
</statements>

</sqlMap>


Explicando brevemente, el id de cada select o insert o lo que quieran es lo que le vamos a pasar al mapper cada que queramos ejecutar una query (ahora saben de donde saco las cadenas mágicas con las que llamo al mapper desde la MainWindow).

Si es un select, seleccionamos un resultMap que esté definido arriba para que el select ya nos devuelva el objeto contruido con los valores obtenidos!

Podemos pasar parámetros como parameterClass y, si es un tipo nativo, para sustituirlo en la query usamos #value#, si es un objeto utilizamos #campo# donde campo es el nombre de una variable de clase del objeto que le pasamos como parámetro.

Teniendo estos archivos, y recordando lo del copy to output folder, simplemente hace falta Ejecutar el Proyecto/Solución/Coloide/Solenoide y presionar el lindo botonsito que tenemos en la interfaz. Esto activará las querys del evento y podremos ver en la consola:



Los pass fueron generados por SHA-1 con sal, 1000 iteraciones y una ayuda de Apache Shiro! Salvo el último, obviamente... xD

Cuidado cuando pedimos un solo objeto y la query devuelva varios porque va a haber pex, si la query regresa uno y pedimos una lista se nos entrega una lista de un elemento, pero truchas con el caso contrario!!!

Como referencia, les dejo los manuales de Usuario de Mybatis, está bien en chino, pero vienen las referencias completas de lo que pueden hacer en cada archivo, todas las posibilidades que ofrece Mybatis. Esto que presento es info un poco digerida, como cuando mamá pájaro vomita la comida a medio digerir para los pollitos que aún no pueden digerir bien las cosas @.@


Mejor digamos que les paso la info ya desmenuzada... :D

https://code.google.com/p/mybatisnet/downloads/detail?name=Doc-DataMapper-1.6.2.zip&can=3&q=

Se podrán preguntar que para que tanto show para un objeto, que hubiera sido más rápido mapearlo a mano como suelen hacerlo... Solo les quiero plantear el caso en que el modelo del objeto cambie, o el nombre de la columna, van a tener que refactorizar toneladas de codigo, mientras que esto les permitirá solo mover el mapper y una que otra query, sin tener que andar urgando entre más toneladas de código, van al mapper, cambian lo que deben cambiar, y listo!!! Si hay un nuevo objeto, se agrega el alias, el mapper, las querys y ya! No hay que hacer todo el código de conversión campo por campo!!!

Verdad que está suave???

Gracias a todos por seguirme hasta aquí! Ojalá les haya gustado y les haya servido!!!

Espero su feedback! :D

Log finished!

No comments :

Post a Comment

Hazmela de tos aqui abajito!!! :D