Procesamiento de Valores de Retorno en MyBatis

Introducción al Mapeo de Resultados

En el farmework MyBatis, el manejo de valores de retorno es crucial para convertir los resultados de las consultas SQL en objetos Java. Los métodos en la interfaz del Mapper pueden devolver tipos primitivos, objetos, colecciones como List o Set, o incluso estructuras Map. MyBatis utiliza la configuración en archivos XML para mapear automáticamente las columnas del resultado a los campos correspondientes del tipo de retorno.

Tipos de Retorno y Ejemplos de Mapeo

A continuación, se detallan las distintas formas de procesar los valores de retorno en MyBatis.

1. Valores Primitivos

Cuando el método devuelve un tipo primitivo, como int o String, MyBatis asigna el valor de la primera columna de la primera fila del resultado de la consulta.

Interfaz del Mapper

public interface OperacionesUsuario {
    int contarRegistros();
}

Archivo XML del Mapper

<select id="contarRegistros" resultType="int">
    SELECT COUNT(*) AS total FROM usuarios
</select>

  • resultType="int": Indica que el valor de retorno es un entero.
  • El resultado de COUNT(*) se mapea directamente al valor int.

2. Objetos

Para devolver un objeto, las columnas de la consulta se asignan a las propiedades del objeto basándose en nombres coincidentes o configuración explícita.

Clase de Entidad

public class Usuario {
    private int identificador;
    private String nombre;
    private int edad;
    // Getters y setters
}

Interfaz del Mapper

public interface OperacionesUsuario {
    Usuario buscarPorId(int id);
}

Archivo XML del Mapper

<select id="buscarPorId" resultType="Usuario">
    SELECT id AS identificador, name AS nombre, age AS edad FROM usuarios WHERE id = #{id}
</select>

  • resultType="Usuario": Especifica el tipo de objeto de retorno.
  • Las columnas id, name, age se mapean a identificador, nombre, edad mediante alias en SQL.

3. Colecciones

Al retornar una colección, cada fila del resultado se convierte en un elemento de la colección, como un List de objetos.

Interfaz del Mapper

public interface OperacionesUsuario {
    List<Usuario> obtenerTodos();
}

Archivo XML del Mapper

<select id="obtenerTodos" resultType="Usuario">
    SELECT id AS identificador, name AS nombre, age AS edad FROM usuarios
</select>

  • resultType="Usuario": Define el tipo de los elementos en la lista.
  • Cada fila se mapea a un objeto Usuario y se agrega a la List.

4. Mapas

Los resultados pueden mapearse a estructuras Map, donde las claves y valores se derivan de las columnas.

4.1 Una Fila como Mapa

Convierte una única fila en un Map, usando los nombres de las columnas como claves.

Interfaz del Mapper
public interface OperacionesUsuario {
    Map<String, Object> buscarUsuarioComoMapa(int id);
}

Archivo XML del Mapper
<select id="buscarUsuarioComoMapa" resultType="map">
    SELECT id, nombre, edad FROM usuarios WHERE id = #{id}
</select>

  • resultType="map": Indica que el retorno es un Map.
  • Ejemplo de salida: { "id": 10, "nombre": "Carlos", "edad": 32 }.

4.2 Múltiples Filas como Mapa

Mapea varias filas a un Map, donde una columna sirve como clave y otra columna o el objeto completo como valor.

Interfaz del Mapper
public interface OperacionesUsuario {
    @MapKey("identificador")
    Map<Integer, Usuario> obtenerTodosComoMapa();
}

Archivo XML del Mapper
<select id="obtenerTodosComoMapa" resultType="Usuario">
    SELECT id AS identificador, nombre, edad FROM usuarios
</select>

  • @MapKey("identificador"): Usa el campo identificador como clave del Map.
  • El resultado es un Map donde cada entrada tiene un Integer como clave y un Usuario como valor.

5. Estructuras Complejas

Para objetos anidados o cuando los nombres de columnas no coinciden con los atributos, se emplea resultMap para definir el mapeo detallado.

Clases de Entidad

public class Usuario {
    private int identificador;
    private String nombre;
    private int edad;
    private Direccion direccion; // Objeto anidado
    // Getters y setters
}

public class Direccion {
    private String ciudad;
    private String calle;
    // Getters y setters
}

Interfaz del Mapper

public interface OperacionesUsuario {
    Usuario buscarConDireccion(int id);
}

Archivo XML del Mapper

<resultMap id="MapaResultadoUsuario" type="Usuario">
    <id property="identificador" column="id" />
    <result property="nombre" column="nombre" />
    <result property="edad" column="edad" />
    <association property="direccion" javaType="Direccion">
        <result property="ciudad" column="ciudad" />
        <result property="calle" column="calle" />
    </association>
</resultMap>

<select id="buscarConDireccion" resultMap="MapaResultadoUsuario">
    SELECT u.id, u.nombre, u.edad, d.ciudad, d.calle
    FROM usuarios u
    LEFT JOIN direcciones d ON u.id = d.usuario_id
    WHERE u.id = #{id}
</select>

  • resultMap: Proporciona una definición personalizada para mapear columnas a propiedades.
  • association: Gestiona el mapeo del objeto anidado Direccion.

6. Retorno Sin Valor

Los métodos que no requieren un valor de retorno, como operaciones de actualización, pueden declararse con tipo void.

Interfaz del Mapper

public interface OperacionesUsuario {
    void actualizarNombre(@Param("id") int id, @Param("nuevoNombre") String nombre);
}

Archivo XML del Mapper

<update id="actualizarNombre">
    UPDATE usuarios SET nombre = #{nuevoNombre} WHERE id = #{id}
</update>

  • El método ejecuta la sentencia SQL pero no devuelve ningún dato al código Java.

Etiquetas: MyBatis java SQL ORM MapeoResultados

Publicado el 6-5 01:26