Introducción a MyBatisPlus
MyBatisPlus (comúnmante abreviado como MP) es una extensión poderosa construida sobre el framework MyBatis. Su objetivo principal es eliminar código repetitivo y acelerar el desarrollo de aplicaciones que interactúan con bases de datos relacionales.
Características principales
- Integración transparente: Amplía las funcionalidades de MyBatis sin modificar el comportamiento existente del proyecto.
- Operaciones CRUD automáticas: Proporciona un Mapper genérico que permite realizar operaciones básicas sin escribir sentencias SQL.
- Consultas con Lambda: Facilita la construcción de condiciones evitando errores por nombres de columnas incorrectos.
- Generación automática de claves primarias.
- Plugin de paginación integrado.
Configuración inicial del proyecto
Para incorporar MyBatisPlus en una aplicación Spring Boot, se siguen estos pasos esenciales:
- Agregar la dependencia correspondiente en el archivo de configuración del proyecto.
- Definir la configuración de fuente de datos y opciones de registro en el archivo
application.yml. - Crear interfaces Mapper que hereden de
BaseMapper. - Configurar el escaneo de paquetes de mappers en la clase principal.
Dependencia de MyBatisPlus
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
Archivo de configuración application.yml
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
Definición del Mapper
public interface ClienteMapper extends BaseMapper<Cliente> {
}
Operaciones CRUD con MyBatisPlus
La siguiente tabla compara las operaciones estándar proporcionadas por MP con enfoques manuales:
| Operación | Método de MyBatisPlus |
|---|---|
| Crear registro | int insert(T entidad) |
| Eliminar por ID | int deleteById(Serializable id) |
| Actualizar registro | int updateById(T entidad) |
| Buscar por ID | T selectById(Serializable id) |
| Listar todos | List<T> selectList(Wrapper wrapper) |
| Consulta paginada | IPage<T> selectPage(IPage page, Wrapper wrapper) |
Ejemplo: Insertar un nuevo cliente
@Test
public void crearCliente() {
Cliente nuevoCliente = new Cliente();
nuevoCliente.setNombre("María García");
nuevoCliente.setEmail("maria@ejemplo.com");
nuevoCliente.setTelefono("555-1234");
nuevoCliente.setEdad(28);
clienteMapper.insert(nuevoCliente);
}
Ejemplo: Eliminar un registro
@Test
public void eliminarCliente() {
clienteMapper.deleteById(1025L);
}
Ejemplo: Actualizar datos
@Test
public void modificarCliente() {
Cliente clienteModificado = new Cliente();
clienteModificado.setId(42L);
clienteModificado.setNombre("Carlos Ruiz");
clienteMapper.updateById(clienteModificado);
}
Ejemplo: Obtener todos los registros
@Test
public void listarClientes() {
List<Cliente> lista = clienteMapper.selectList(null);
lista.forEach(System.out::println);
}
Ejemplo: Consulta con condiciones
@Test
public void buscarPorCriterios() {
QueryWrapper<Cliente> criterio = new QueryWrapper<>();
criterio.ge("edad", 25);
criterio.eq("activo", true);
List<Cliente> resultados = clienteMapper.selectList(criterio);
System.out.println("Clientes encontrados: " + resultados.size());
}
Implementación de paginación
Para habilitar la funcionalidad de paginación en MyBatisPlus, es necesario registrar un interceptor que modifique dinámicamente las consultas SQL.
Configuración del interceptor de paginación
@Configuration
public class ConfiguracionPaginacion {
@Bean
public MybatisPlusInterceptor interceptorPaginacion() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginador = new PaginationInnerInterceptor();
paginador.setMaxLimit(500L);
interceptor.addInnerInterceptor(paginador);
return interceptor;
}
}
Realizando una consulta paginada
@Test
public void paginarClientes() {
// Página 2 con 10 elementos por página
Page<Cliente> pagina = new Page<>(2, 10);
Page<Cliente> resultado = clienteMapper.selectPage(pagina, null);
System.out.println("Total de registros: " + resultado.getTotal());
System.out.println("Páginas totales: " + resultado.getPages());
System.out.println("Página actual: " + resultado.getCurrent());
List<Cliente> elementos = resultado.getRecords();
elementos.forEach(cliente ->
System.out.println(cliente.getNombre() + " - " + cliente.getEmail())
);
}
El interceptor de paginación intercepta la ejecución de selectPage y automáticamente agrega la cláusula LIMIT a la consulta SQL, además de realizar un conteo del total de registros cuando es necesario.