Descripción general
MyBatis es un framework de mapeo objeto-relacional (ORM) que resuelve el problema de la correspondencia entre entidades y bases de datos. Éste encapsula JDBC y oculta los deatlles de bajo nivel del acceso a la base de datos.
Dependencias necesarias:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
Pasos de implementación
- Crear una interfaz mapper con el mismo nombre que el archivo de mapeo SQL
- Configurar el atributo namespace del archivo XML con el nombre completo de la interfaz
- Definir métodos en la interfaz cuyo nombre coincida con los identificadores SQL del archivo de mapeo, manteniendo consistencia en los tipos de parámetros y valores de retorno
- Desarrollar el código para obtaner el代理对象 (proxy) de la interfaz mapper y ejecutar los métodos correspondientes
En resumen: definir método en interfaz → escribir SQL → ejecutar método
Consideraciones importantes
- Si los nombres de propiedades de la clase entidad no coinciden con las columnas de la tabla, el mapeo automático fallará. Existen dos soluciones frecuentes:
- Utilizar alias en los campos del SQL
- Implementar resultMap
<resultMap id="DetalleArticulo" type="com.ejemplo.dto.ArticuloRespuestaVO">
<!-- Correspondencia de clave primaria -->
<id property="idArticulo" column="id"/>
<!-- Correspondencia de campos no primarios -->
<result property="titulo" column="titulo_art"/>
<!-- javaType especifica el tipo de propiedad en el POJO -->
<association property="creador" javaType="com.ejemplo.entidad.Autor">
<result property="nombreUsuario" column="usuario"/>
<result property="contrasena" column="clave"/>
<result property="correo" column="email"/>
</association>
<!-- ofType indica el tipo de objeto para propiedades de tipo lista -->
<collection property="etiquetas" ofType="com.ejemplo.dto.EtiquetaDetalleVO">
<result property="nombreEtiqueta" column="nombre_etq"/>
<collection property="comentarios" ofType="com.ejemplo.entidad.Comentario">
<result property="texto" column="texto_com" />
</collection>
</collection>
</resultMap>
- El atributo parameterType en las sentencias SQL puede omitirse
<select id="obtenerDetallePorId" resultType="com.ejemplo.dto.DetalleVO">
SELECT p.titulo tituloArt, p.descripcion descrip FROM articulo p WHERE id = #{identificador};
</select>
- Manejo de caracteres especiales en SQL:
- Caracteres de escape como <
- Sección CDATA
- Configuración de mapeos en el archivo principal de MyBatis:
<!-- Especificar ubicación de archivos de mapeo -->
<mappers>
<!-- Con resource, cada archivo mapper.xml debe especificarse individualmente -->
<!-- <mapper resource="com/ejemplo/mapeador/ArticuloMapeador.xml"/> -->
<!-- Uso de <package>: requiere que los archivos estén en el mismo paquete que la interfaz -->
<package name="com.ejemplo.mapeador"/>
</mappers>
- Métodos de paso de parámetros:
1. Parámetros individuales
Usuario obtenerInfo(@Param("id") Integer identificador, @Param("genero") String genero);
2. Objeto entity como parámetro
Usuario obtenerInfo(Usuario usuario);
3. Colección Map
mapa.put("id", 1);
Usuario obtenerInfo(Map mapa);
4. Colección Collection
Collection lista = new ArrayList();
lista.add(1);
List<Usuario> obtenerInfo(@Param("elementos") Collection lista);
Utilizar etiqueta <foreach>
- Concatenación dinámica de SQL:
<select id="buscarPorCondicion" resultMap="mapaUsuario">
SELECT * FROM usuario
<where>
<if test="nombre != null">
AND nombre LIKE #{nombre}
</if>
<if test="genero != null">
AND genero LIKE #{genero}
</if>
<if test="direccion != null">
AND direccion LIKE #{direccion}
</if>
</where>
</select>
<select id="buscarPorIdentificadores" resultMap="mapaUsuario" parameterType="ConsultaVO">
SELECT * FROM usuario
<where>
id IN
<if test="identificadores != null AND identificadores.size > 0">
<foreach collection="identificadores" item="uid" separator="," open="(" close=")">
#{uid}
</foreach>
</if>
</where>
</select>