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 valorint.
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,agese mapean aidentificador,nombre,edadmediante 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
Usuarioy se agrega a laList.
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 unMap.- 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 campoidentificadorcomo clave delMap.- El resultado es un
Mapdonde cada entrada tiene unIntegercomo clave y unUsuariocomo 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 anidadoDireccion.
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.