Introducción al uso de MyBatis

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

  1. Crear una interfaz mapper con el mismo nombre que el archivo de mapeo SQL
  2. Configurar el atributo namespace del archivo XML con el nombre completo de la interfaz
  3. 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
  4. 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>

Etiquetas: MyBatis java ORM MySQL mapper

Publicado el 6-8 19:05