Implementação de Paginação e Cache em MyBatis

Paginação em MyBatis: Lógica vs Física

Paginação Lógica

O MyBatis utiliza paginação lógica por padrão, onde todos os registros são carregadso na memória antes da seleção do subconjunto desejado. Por exemplo, com 100 registros no banco e página de 10 elementos, todos os 100 são transferidos para memória antes da extração. Essa abordagem possui limitações de desempenho com grandes volumes de dados, sendo recomendada apenas para conjuntos pequenos ou projetos de pequeno porte.

Paginação Física

Utiliza recursos nativos do banco de dados através de modificações na query SQL, como cláusulas LIMIT no MySQL, proporcionando melhor desempenho com grandes datasets.

Exemplo de Implementação

Interface do Mapeador:

public interface EstudanteMapper {
    // Paginação lógica
    List<Estudante> selecionarPorLimite(RowBounds limites);
    
    // Paginação física
    List<Estudante> selecionarPorIntervalo(Map<String, Integer> parametros);
}

Consulta SQL no Mapeador XML:

<select id="selecionarPorLimite" resultMap="ResultadoEstudante">
    SELECT * FROM estudantes
</select>

<select id="selecionarPorIntervalo" parameterType="Map" resultMap="ResultadoEstudante">
    SELECT * FROM estudantes
    <if test="inicio != null and tamanho != null">
        LIMIT #{inicio}, #{tamanho}
    </if>
</select>

Teste Unitário:

@Test
public void testarPaginaFisica() {
    Map<String, Integer> params = new HashMap<>();
    params.put("inicio", 0);
    params.put("tamanho", 5);
    List<Estudante> resultados = mapper.selecionarPorIntervalo(params);
    resultados.forEach(System.out::println);
}

Configuração de Cache no MyBatis

Recomendado para cenários com alta concorrência de leitura, reduzindo carga no banco de dados. Configuração do cache de segundo nível:

<cache 
    size="1024" 
    flushInterval="60000" 
    eviction="LRU" 
    readOnly="false"/>
  • size: Capacidade máxima de elementos (padrão: 1024)
  • flushInterval: Intervalo de limpeza em milissegundos
  • eviction: Política de remoção (LRU ou FIFO)
  • readOnly: Se definido como true, bloqueia escrita no cache

Comportamento em operações:

<select useCache="true" flushCache="false"/>
<insert flushCache="true"/>
<update flushCache="true"/>
<delete flushCache="true"/>

Modelos devem implementar Serializable para suporte ao cache:

public class Estudante implements Serializable {
    // Atributos e métodos
}

Tags: MyBatis paginação cache SQL java

Publicado em 6-17 22:48