Integración de Spring Boot con MyBatis para Aplicaciones Java

La integración de MyBatis en un proyecto web Java utilizando Spring Boot implica una serie de configuraciones y definiciones clave. A continuación, se detalla el proceso para establecer una base sólida.

Configuración Inicial del Proyecto Spring Boot

El primer paso es la creación de un nuevo proyecto Spring Boot. Asegúrate de incluir las siguientes dependencias:

  • spring-boot-starter-web para funcionalidades web.
  • mybatis-spring-boot-starter para la integración de MyBatis.
  • El driver JDBC específico para tu base de datos (ej. mysql-connector-java para MySQL).

Un ejemplo de configuración en Maven:


<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.3.0</version> <!-- Reemplazar con la versión más reciente -->
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId> <!-- Driver actualizado para MySQL -->
        <version>8.0.33</version> <!-- Reemplazar con la versión más reciente -->
        <scope>runtime</scope>
    </dependency>
</dependencies>

Configuración de la Conexión a la Base de Datos

Define los parámetros de conexión a tu base de datos en el archivo de propiedades de Spring (application.properties o application.yml). Si utilizas Druid como pool de conexiones, la configuración podría verse así:

application.yml


spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mi_base_datos?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
    username: usuario_db
    password: contrasena_db
    type: com.alibaba.druid.pool.DruidDataSource
    initial-size: 5
    min-idle: 5
    max-active: 20
    max-wait: 60000
    time-between-eviction-runs-millis: 60000
    min-evictable-idle-time-millis: 300000
    validation-query: SELECT 1
    test-while-idle: true
    test-on-borrow: false
    test-on-return: false
    pool-prepared-statements: true
    max-pool-prepared-statement-per-connection-size: 20
    filters: stat,wall,log4j
    connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

Ajustes Específicos de MyBatis

El mybatis-spring-boot-starter automatiza muchas configuraciones. Sin embargo, es recomendable especificar las ubicaciones de los paquetes de entidades y los archivos de mapeo XML:

application.yml (continuación)


mybatis:
  # Paquetes que contienen las entidades (POJOs)
  type-aliases-package: com.ejemplo.miapp.modelo
  configuration:
    # Para ver las sentencias SQL ejecutadas en la consola
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

mybatis-plus: # Si usas MyBatis-Plus
  # Ubicación de los archivos de mapeo XML
  mapper-locations: classpath*:com/ejemplo/miapp/mapeo/xml/*.xml
  # Alias de tipo para los DTOs (Data Transfer Objects)
  # type-aliases-package: com.ejemplo.miapp.dto

Definición de Clases de Entidad (Modelos)

Crea tus clases POJO que representen las tablas de la base de datos. Por ejemplo:


package com.ejemplo.miapp.modelo;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
// Si usas MyBatis-Plus, podrías necesitar anotaciones específicas como @TableName
// import com.baomidou.mybatisplus.annotation.TableName;

// @TableName("usuarios") // Anotación si usas MyBatis-Plus
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Usuario {
    private Long id;
    private String nombreUsuario;
    // Getters y setters generados por Lombok
}

Interfaces Mapper y Mapeos XML

Define las interfaces que actuarán como mappers y sus respectivos archivos XML de mapeo.

Interfaz Mapper


package com.ejemplo.miapp.mapeo;

import com.ejemplo.miapp.modelo.Usuario;
// Podría ser un DTO en lugar de Usuario
// import com.ejemplo.miapp.dto.UsuarioDetalle;

public interface UsuarioMapper {
    Usuario obtenerUsuarioPorId(Long identificador);
    // Otros métodos CRUD o personalizados
}

Archivo XML de Mapeo (ej. UsuarioMapper.xml)

Ubicado según la configuración mapper-locations, por ejemplo: src/main/resources/com/ejemplo/miapp/mapeo/xml/UsuarioMapper.xml.


<?xml version="1.0" encoding="UTF-8" ?>

<mapper namespace="com.ejemplo.miapp.mapeo.UsuarioMapper">

    <select id="obtenerUsuarioPorId" resultType="com.ejemplo.miapp.modelo.Usuario">
        SELECT id, nombre_usuario
        FROM tabla_usuarios
        WHERE id = #{identificador}
    </select>

    <!-- Definición de otros statements -->

</mapper>

Capa de Servicio y Controlador

Implementa la lógica de negocio en la capa de servicio, inyectando los mappers necesarios.

Servicio


package com.ejemplo.miapp.servicio;

import com.ejemplo.miapp.mapeo.UsuarioMapper;
import com.ejemplo.miapp.modelo.Usuario;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ServicioUsuario {

    private final UsuarioMapper mapperUsuario;

    @Autowired
    public ServicioUsuario(UsuarioMapper mapperUsuario) {
        this.mapperUsuario = mapperUsuario;
    }

    public Usuario buscarUsuario(Long id) {
        return mapperUsuario.obtenerUsuarioPorId(id);
    }
    // Lógica adicional...
}

Controlador


package com.ejemplo.miapp.controlador;

import com.ejemplo.miapp.modelo.Usuario;
import com.ejemplo.miapp.servicio.ServicioUsuario;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/usuarios")
public class ControladorUsuario {

    private final ServicioUsuario servicioUsuario;

    @Autowired
    public ControladorUsuario(ServicioUsuario servicioUsuario) {
        this.servicioUsuario = servicioUsuario;
    }

    @GetMapping("/{id}")
    public Usuario obtenerDetallesUsuario(@PathVariable("id") Long userId) {
        return servicioUsuario.buscarUsuario(userId);
    }
    // Otros endpoints...
}

Clase Principle de Aplicación y Pruebas

La clase principal de Spring Boot, anotada con @SpringBootApplication, inicia la aplicación.


package com.ejemplo.miapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AplicacionPrincipal {

    public static void main(String[] args) {
        SpringApplication.run(AplicacionPrincipal.class, args);
        System.out.println("Servicio iniciado...");
    }
}

Una vez iniciada la aplicación, puedes usar herramientas como Postman o tu navegador para probar los endpoints definidos y verificar que las operaciones de base de datos funcionan correctamente.

Etiquetas: Spring Boot MyBatis java JDBC SQL

Publicado el 7-25 22:50