Otimização de Configurações do Mybatis: Mapeamento de Colunas, Logs e Paginação

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>
    
  1. 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 criar SqlSessionFactory. Deve ser descartado após o uso. - SqlSessionFactory: Uma fábrica de SqlSession. 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>
    
  1. Crie um arquivo log4j.properties na pasta src/main/resources com 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.

Tags: MyBatis configuracao jdbc resultmap Log4j

Publicado em 7-29 19:06