Otimização e Configuração do Mybatis
1. Configuração Geral (mybatis-config.xml)
O arquivo mybatis-config.xml organiza as configurações em várias seções: - properties: Para carregar propriedades externas.
settings: Para configurar o comportamento do Mybatis.typeAliases: Para definir apelidos para classes de domínio.environments: Para configurar os ambientes de execução (desenvolvimento, produção, etc.).mappers: Para registrar os mapeadores de interface ou arquivos XML.
A ordem das tags dentro de <configuration> é específica: (properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)### 1.1. Ambientes (environments)
Permite definir múltiplos ambientes com diferentes configurações de transação e fonte de dados. ```
- `transactionManager`: Pode ser `JDBC` (padrão) ou `MANAGED`. - `dataSource`: Pode ser `UNPOOLED`, `POOLED` (padrão, usa pool de conexões) ou `JNDI`. Propriedades como driver, URL, usuário e senha são configuradas aqui. ### 1.2. Propriedades (`properties`)
Permite externalizar configurações, facilitando a manutenção e o desacoplamento. Crie um arquivo (ex: `jdbc.properties`): ```
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/database_name?useSSL=false
username=user
password=password
No mybatis-config.xml, referencie o arquivo: ```
É possível definir propriedades diretamente no XML, mas as definidas no arquivo externo têm prioridade. ### 1.3. Apelidos de Tipo (`typeAliases`)
Reduz a verbosiddae ao usar nomes de classe completos. Formas de definir apelidos: 1. Definição explícita: ```
<typeAliases>
<typeAlias alias="AdminUser" type="com.example.model.User"/>
</typeAliases>
Use AdminUser em vez de com.example.model.User. 2. Escaneamento de Pacote: ```
Todas as classes no pacote `com.example.model` podem ser referenciadas por seus nomes simples (ex: `User`). 3. Anotação `@Alias`: Adicione `@Alias("customName")` à sua classe de modelo. ### 1.4. Configurações (`settings`)
Configurações diversas para o comportamento do Mybatis. (Ex: `cacheEnabled`, `lazyLoadingEnabled`). ### 1.5. Mapeadores (`mappers`)
Registra as interfaces ou arquivos XML que contêm as instruções SQL. 1. Via recurso XML: ```
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
- Via classe de interface: ```
Requer que o arquivo XML e a interface tenham o mesmo nome e estejam no mesmo pacote. 3. Via pacote: ```
<mappers>
<package name="com.example.mapper"/>
</mappers>
Registra todas as interfaces no pacote especificado como mapeadores. ### 2. Ciclo de Vida e Escopo
SqlSessionFactoryBuilder: Usado para criarSqlSessionFactory. Deve ser descartado após o uso. -SqlSessionFactory: Uma fábrica deSqlSession. Deve ser criada uma única vez e mantida durante a vida útil da aplicação (padrão Singleton). -SqlSession: Representa uma conexão com o banco de dados. Não é thread-safe e deve ser fechado após o uso. 3. Mapeamento de Colunas Inconsistentes
Quando os nomes das colunas no banco de dados não correspondem aos nomes das propriedades nas classes de modelo. ### 3.1. Solução Direta no SQL
Use aliases SQL para renomear colunas: ```
SELECT user_id AS id, user_name AS name FROM users WHERE ...
### 3.2. Mapeamento de Resultado (`resultMap`)
Defina um `resultMap` no arquivo do mapper XML para mapear explicitamente colunas para propriedades. ```
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
<result property="email" column="email_address"/>
</resultMap>
<select id="findUserById" resultMap="userResultMap">
SELECT user_id, user_name, email_address FROM users WHERE user_id = #{userId}
</select>
Use o resultMap na sua consulta (resultMap="userResultMap"). 4. Configuração de Logs
4.1. Integração com Log Implementations
O Mybatis suporta várias implementações de log. Configure via settings: ```
- `STDOUT\_LOGGING`: Imprime logs no console. - `LOG4J`: Requer a biblioteca Log4j e um arquivo de configuração (`log4j.properties`). ### 4.2. Configuração com Log4j
1. Adicione a dependência do Log4j ao seu projeto (Maven): ```
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version> <!-- Ou outra versão compatível -->
</dependency>
- Crie um arquivo
log4j.propertiesna pastasrc/main/resourcescom a configuração desejada: ```
Nível raiz e destinos
log4j.rootLogger=DEBUG, CONSOLE, FILE
Configuração do Appender para Console
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.Threshold=DEBUG log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %-5p %c:%L - %m%n
Configuração do Appender para Arquivo
log4j.appender.FILE=org.apache.log4j.RollingFileAppender log4j.appender.FILE.File=./logs/mybatis.log log4j.appender.FILE.MaxFileSize=10MB log4j.appender.FILE.Threshold=DEBUG log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %-5p %c:%L - %m%n
Configurações específicas do Mybatis (opcional)
log4j.logger.com.ibatis=DEBUG log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG log4j.logger.com.ibatis.sqlmap.engine.impl=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG
3. No `mybatis-config.xml`, defina `logImpl` como `LOG4J`: ```
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
4.3. Uso Básico de Logger
Obtenha uma instância do logger na sua classe: ```
import org.apache.log4j.Logger;
public class UserService { private static final Logger logger = Logger.getLogger(UserService.class);
public void processUser(User user) {
logger.info("Processando usuário: " + user.getName());
// Lógica de negócio...
if (user.getId() == null) {
logger.warn("Usuário sem ID detectado.");
}
logger.debug("Detalhes do usuário: " + user.toString());
}
}
5. Implementação de Paginação
-----------------------------
### 5.1. Usando `LIMIT` no SQL
Para bancos de dados como MySQL. No Mapper XML: ```
<select id="getUsersPaginated" resultType="User">
SELECT id, name, email FROM users LIMIT #{offset}, #{limit}
</select>
No Java (interface do Mapper): ```
List<User> getUsersPaginated(@Param("offset") int offset, @Param("limit") int limit);
Chamada: ```
Map<String, Integer> params = new HashMap<>();
params.put("offset", 0);
params.put("limit", 10);
List<User> users = userMapper.getUsersPaginated(params.get("offset"), params.get("limit"));
5.2. Usando RowBounds (Conceitual)
O Mybatis oferece RowBounds para paginação, mas geralmente é menos flexível que LIMIT ou plugins. ### 5.3. Plugin PageHelper
Uma biblioteca externa popular para simplificar a paginação. Requer configuração no mybatis-config.xml e adição da dependência Maven. Permite paginação de forma transparente, sem modificar o SQL original.