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
}