Técnicas básicas con Mybatis
0. Índice de
contenidos.
1. Entorno
Este tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil Mac Book Pro 17″ (2,6 Ghz Intel Core
i7, 8 GB
DDR3) - Sistema Operativo: Mac OS X Snow Leopard 10.6.4
- Spring 3.0.4
- Maven 2.2.1
- Eclipse 3.6 (Helios) con M2Eclipse y Spring IDE
- Mybatis 3.0.4
2. Introducción
En un tutorial anterior ya vimos todo lo necesario para configurar un proyecto en Maven para acceder a una base de datos con Spring y Mybatis. Recomiendo seguirlo antes de continuar con este donde vamos a ver una serie de técnicas básicas que podemos realizar con esta librería.
3. Técnicas básicas
En esta ocasión vamos a presentar una serie de técnicas básicas con Mybatis que resuelven problemas comunes en el acceso a datos de una forma limpia y cómoda.
Devolver el id autonumérico de una inserción
Este es el típico problema que habría que resolver realizando una consulta inmediatamente después de realizar la inserción que es cuando el id se calcula. En Mybatis esto se resuelve con las propiedades ‘useGeneratedKeys’ y ‘keyProperty’. La primera indica que se utilizan ids generados y la segunda el id de la entidad que va almacenar el id generado. Ejemplo:
<insert id="insert" parameterType="com.autentia.tutoriales.model.Persona" useGenerateKeys="true" keyProperty="id_persona"> insert into persona (apellidos,direccion,nombre) values (#{apellidos},#{direccion},#{nombre}) </insert>
IMPORTANTE: tenemos que eliminar de la sentencia insert las referencias a la propiedad que es clave, ya que se va a autocalcular.
Creación de sentencias SQL con plantillas para su reutilización
A fin de reducir el código escrito en los XML’s, Mybatis proporciona la etiqueta ‘sql’ que nos permite definir cualquier sentencia SQL para que sea embebida dentro de cualquier otra. Lo veremos mejor en el siguiente ejemplo:
Definimos una sentencia SQL que recupera todas las personas
<sql id="selectAllPersonas"> select * from Personas p </sql>
Ahora si queremos definir una sentencia que recupere todos los registros sería:
<select id="getAllPersonas" resultType="com.autentia.tutoriales.model.Persona"> <include refid="selectAllPersonas"/> </select>
Y ahora para implementar el resto de consultas sería tan sencillo como añadir la cláusula WHERE a la plantilla definida. De este modo si queremos recuperar a las personas que tengan un nombre determinado sería:
<select id="getPersonasByNombre" parameterType="String" resultType="com.autentia.tutoriales.model.Persona"> <include refid="selectAllPersonas"/> WHERE p.Nombre = #{nombre} </select>
De este modo reducimos considerablemente la cantidad de código SQL y , por consiguiente, el esfuerzo de mantenimiento.
Realizar Dynamic SQL
Otro de los problemas más típicos que nos encontramos es la necesidad de crear consultas dinámicas en base a una serie de parámetros que pueden existir o no, como ocurre cuando implementamos un buscador, por ejemplo. En este caso Mybatis nos proporciona una serie de etiquetas para facilitarnos la tarea. Entre las más importantes están: if, choose y where. Su funcionamiento lo entenderemos mejor con el siguiente ejemplo:
<select id="searchPersonas" parameterType="com.autentia.tutoriales.model.PersonaOrder" resultType="com.autentia.tutoriales.model.Persona"> <include refid="selectAllPersonas"/> <where> <choose> <when test="persona.nombre != '%%'"> AND p.Nombre like #{persona.nombre} </when> <otherwise> AND p.Nombre = #{persona.nombre} </otherwise> </choose> <if test="persona.Apellidos != ''"> AND p.Apellidos >= #{persona.apellidos} </if> <if test="persona.direccion != ''"> AND p.Direccion like #{persona.direccion} </if> </where> ORDER BY ${nombreColumna} ${direccionOrdenacion} </select>
Nota: El objeto PersonaOrder tiene que contener los campos ‘nombreColumna’, que almacena un string con el nombre de la columna por el que ordenar y ‘direccionOrdenacion’ que almacena un string con la dirección de la ordenación que puede ser ‘ASC’ o ‘DESC’. Es muy importante que la sustitución de string se haga con el $ y no con la #. Esto es porque con # Mybatis entiende que es un parámetro de una consulta parametrizada, mientras que, con $ solo realiza la sustitución del string. Además contendra una instancia de la clase Persona llamada ‘persona’, donde se pasan los parámetros de búsqueda. De ahí, que hagamos referencia a ellos con la notación punto.
4. Conclusiones
Hemos visto una serie de técnicas que nos proporciona Mybatis para resolver problemas cotidianos cuando trabajamos en una librería de acceso a datos. Para otros detalles recomiendo seguir su guía oficial que la podéis encontrar en http://mybatis.googlecode.com/svn/trunk/doc/en/MyBatis-3-User-Guide.pdf
En sucesivos tutoriales seguiremos explicando otras características de esta estupenda librería como la forma de mapear las distintas relaciones entre entidades.
Cualquier duda o sugerencia en la zona de comentarios.
Saludos.
Muy simple y bueno.
Muchas gracias por publicarlo.
Recomienda usar SQL dinámico o armar un Select específico. Ya que afectaría el rendimiento de la aplicación?
Hola JosueHuancapaza,
Yo recomiendo siempre utilizar la funcionalidad de SQL Dinámico de Mybatis ya que es más difícil que nos equivoquemos. Haciéndolo a mano es fácil que introduzcamos riesgos de escalabilidad, rendimiento y seguridad como el temido SQL Injection.
Piensa que una de las principales ventajas de trabajar con Mybatis es que todo el código SQL esté centralizado en los Mappers; por eso tampoco aconsejo la utilización de anotaciones con la excepción de la anotación @Param
Saludos
Estoy empezando a utilizar mybatis,he conseguido pasar un id para hacer una busqueda, pero no he conseguido encontrar la forma correcta para pasarle a un select varios parámetros para hacer el where, por ejemplo 2 fechas y buscar en la BBDD entre esas fechas.
¿Conocéis algún tutorial donde vengan este tipo de ejemplos básicos?