Este guia detalha a integração do Spring Boot com o Mybatis, utilizando o pool de conexões Druid da Alibaba.
- 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>
- 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
- 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 +
'}';
}
}
- 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();
}
- 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>
- 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();
}
}
- 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
}
}
- 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>
- 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.