Integração do Spring Boot com MyBatis e Druid

Este guia detalha a integração do Spring Boot com o Mybatis, utilizando o pool de conexões Druid da Alibaba.

  1. Dependências Necessárias

Adicione as seguintes dependências ao seu arquivo pom.xml:


<!-- Conexão com banco de dados MySQL -->
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>8.0.11</version<!-- Versão atualizada -->
</dependency>

<!-- Starter JDBC do Spring Boot -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
   <optional>true</optional>
</dependency>

<!-- Druid Connection Pool Starter -->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.2.8</version<!-- Versão atualizada -->
</dependency>

<!-- Mybatis Spring Boot Starter -->
<dependency>
   <groupId>org.mybatis.spring.boot</groupId>
   <artifactId>mybatis-spring-boot-starter</artifactId>
   <version>2.2.0</version<!-- Versão atualizada -->
</dependency>
   
  1. Configuração do Banco de Dados (application.yml)

Configure os detalhes da sua conexão com o banco de dados e as propriedades do Mybatis no arquivo application.yml:


spring:
 datasource:
   druid:
     # Filtros de monitoramento e estatística do Druid
     filters: stat,wall # Adicionado filtro 'wall' para segurança
     driver-class-name: com.mysql.cj.jdbc.Driver # Driver atualizado para MySQL 8+
     # Configurações básicas
     url: jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false
     username: dbuser
     password: dbpassword
     # Configurações adicionais do Druid (opcional)
     initial-size: 10
     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 FROM DUAL

mybatis:
 # Caminho para os mappers XML
 mapper-locations: classpath*:mybatis/mappers/*.xml
 # Caminho para o arquivo de configuração do Mybatis (opcional)
 config-location: classpath:mybatis/mybatis-config.xml
 # Pacote onde as entidades (modelos) estão localizadas
 type-aliases-package: com.example.demo.model
   
  1. Entidade (Model)

Crie sua classe de entidade que mapeia para a tabela do banco de dados. Exemplo:


package com.example.demo.model;

import java.io.Serializable;
import java.util.Date;

public class AppUser implements Serializable {

   private static final long serialVersionUID = 1L;

   private String userId;
   private String username;
   private String nickname;
   private String hashedPassword; // Use um nome mais descritivo
   private String phoneNumber;
   private String address;
   private Date registrationDate;
   private Integer userStatus; // Usar Integer para status é mais comum

   // Construtor padrão
   public AppUser() {
   }

   // Getters e Setters (omitted for brevity)
   public String getUserId() { return userId; }
   public void setUserId(String userId) { this.userId = userId; }
   public String getUsername() { return username; }
   public void setUsername(String username) { this.username = username; }
   public String getNickname() { return nickname; }
   public void setNickname(String nickname) { this.nickname = nickname; }
   public String getHashedPassword() { return hashedPassword; }
   public void setHashedPassword(String hashedPassword) { this.hashedPassword = hashedPassword; }
   public String getPhoneNumber() { return phoneNumber; }
   public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; }
   public String getAddress() { return address; }
   public void setAddress(String address) { this.address = address; }
   public Date getRegistrationDate() { return registrationDate; }
   public void setRegistrationDate(Date registrationDate) { this.registrationDate = registrationDate; }
   public Integer getUserStatus() { return userStatus; }
   public void setUserStatus(Integer userStatus) { this.userStatus = userStatus; }

   @Override
   public String toString() {
       return "AppUser{" +
              "userId='" + userId + '\'' +
              ", username='" + username + '\'' +
              ", nickname='" + nickname + '\'' +
              ", phoneNumber='" + phoneNumber + '\'' +
              ", address='" + address + '\'' +
              ", registrationDate=" + registrationDate +
              ", userStatus=" + userStatus +
              '}';
   }
}
   
  1. Intefrace DAO (Mapper)

Defina a interface para interagir com o banco de dados. O Mybatis irá implementar esta interface automaticamente.


package com.example.demo.dao;

import com.example.demo.model.AppUser;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper // Ou utilize @Repository se preferir
@Repository
public interface UserDataAccessor {

   /**
    * Recupera todos os usuários registrados.
    * @return Uma lista de objetos AppUser.
    */
   List<AppUser> fetchAllUsers();
}
   
  1. Arquivo Mapper XML

Crie o arquivo XML correspondente à sua interface DAO. Certifique-se de que o namespace corresponda ao nome completo da interface DAO.


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


<mapper namespace="com.example.demo.dao.UserDataAccessor">

   <resultMap id="userResultMap" type="com.example.demo.model.AppUser">
       <id property="userId" column="user_id"/>
       <result property="username" column="user_name"/>
       <result property="nickname" column="nick_name"/>
       <result property="hashedPassword" column="hashed_password"/>
       <result property="phoneNumber" column="phone_number"/>
       <result property="address" column="address"/>
       <result property="registrationDate" column="registration_date"/>
       <result property="userStatus" column="user_status"/>
   </resultMap>

   <select id="fetchAllUsers" resultMap="userResultMap">
       SELECT
           user_id, user_name, nick_name, hashed_password,
           phone_number, address, registration_date, user_status
       FROM
           application_users
   </select>

</mapper>
   
  1. Camada de Serviço

Implemente a lógica de negócio e injete a interface DAO.

Interface de Serviço


package com.example.demo.service;

import com.example.demo.model.AppUser;
import java.util.List;

public interface UserManagementService {

   /**
    * Obtém a lista de todos os usuários.
    * @return Lista de usuários.
    */
   List<AppUser> retrieveAllUsers();
}
   

Implmeentação do Serviço


package com.example.demo.service.impl;

import com.example.demo.dao.UserDataAccessor;
import com.example.demo.model.AppUser;
import com.example.demo.service.UserManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserManagementServiceImpl implements UserManagementService {

   private final UserDataAccessor userDataAccessor;

   @Autowired
   public UserManagementServiceImpl(UserDataAccessor userDataAccessor) {
       this.userDataAccessor = userDataAccessor;
   }

   @Override
   public List<AppUser> retrieveAllUsers() {
       return userDataAccessor.fetchAllUsers();
   }
}
   
  1. Teste de Integração

Crie um teste para verificar a integração completa.


package com.example.demo;

import com.example.demo.model.AppUser;
import com.example.demo.service.UserManagementService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import static org.assertj.core.api.Assertions.assertThat;

import java.util.List;

@SpringBootTest
class ApplicationIntegrationTests {

   @Autowired
   private ApplicationContext context;

   @Autowired
   private UserManagementService userManagementService;

   @Test
   void contextLoads() {
       assertThat(context).isNotNull();
       assertThat(userManagementService).isNotNull();
   }

   @Test
   void testFetchAllUsers() {
       List<AppUser> users = userManagementService.retrieveAllUsers();
       assertThat(users).isNotEmpty(); // Verifica se a lista não está vazia
       users.forEach(System.out::println); // Imprime os usuários encontrados
   }
}
   
  1. Configuração Mybatis (Opcional)

O arquivo mybatis-config.xml pode ser usado para configurações globais do Mybatis.


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

<configuration>
   <settings>
       <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- Mapeia automaticamente colunas snake_case para camelCase -->
   </settings>
   <!-- Outras configurações podem ser adicionadas aqui -->
</configuration>
   
  1. Configuração da Aplicação Principal

A anotação @MapperScan no seu ponto de entrada principal garante que os mappers sejam registrados no Spring Context.


package com.example.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
// Escaneia o pacote onde suas interfaces de Mapper estão localizadas
@MapperScan("com.example.demo.dao")
public class DemoApplication {

   public static void main(String[] args) {
       SpringApplication.run(DemoApplication.class, args);
   }
}
   

Os pontos chave para a integração bem-sucedida incluem a adição das dependências corretas, a configuração detalhada do datasource e do Mybatis, e a especificação correta dos pacotes para os mappers e entidades.

Tags: Spring Boot MyBatis Druid jdbc java

Publicado em 7-23 01:55