Implementación de paginación con Oracle en MyBatis

Al trabajar con sentencias SQL en forrmato XML mediante MyBatis, es frecuente utilizar operadores como <, <=, >, >= que pueden generar conflcitos de sintaxis. Estos caracteres especiales pueden provocar errores durante la transformación del código XML a documento XML, causando fallos en la ejecución de la aplicación.

Este problema es común en aplicaciones que utilizan mapeos XML para consultas SQL. La solución consiste en reemplazar los caracteres especiales por sus entidades XML correspondientes:

Símbolo original < <= > >= & ' "
Símbolo de reemplazo &lt; &lt;= &gt; &gt;= &amp; &apos; &quot;

————————————————————————————————————————————————————————————————————————

Datos de la base de datos

一、Paginación lógica

Interfaz

package com.dao;


import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.RowBounds;

import com.model.Alumno;

public interface AlumnoMapper {
    /**
     * Consulta paginada
     */
    public List&lt;Alumno&gt; buscarTodos(RowBounds rb);
}

Archivo de configuración

&lt;?xml version="1.0" encoding="UTF-8"?&gt;

 &lt;mapper namespace="com.dao.AlumnoMapper"&gt;
 
    &lt;select id="buscarTodos" resultType="alumno" &gt;
        SELECT * FROM alumno
    &lt;/select&gt;
   
 &lt;/mapper&gt;

Prueba unitaria

package com.test;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.dao.AlumnoMapper;
import com.model.Alumno;

public class PruebaPaginacion {
    private SqlSession sesion;
    private AlumnoMapper mapper;
    
    @Before
    public void iniciar() throws Exception {
        sesion = SqlSessionUtil.getSqlSession();
        mapper = sesion.getMapper(AlumnoMapper.class);
    }

    @After
    public void finalizar() throws Exception {
        sesion.commit();
        sesion.close();
    }

    @Test
    public void testBuscarTodos() {
        // Saltar registros
        int desplazamiento = 3;
        // Cantidad de registros a obtener
        int cantidad = 3;
        
        RowBounds limites = new RowBounds(desplazamiento, cantidad);        
        List&lt;Alumno&gt; resultados = mapper.buscarTodos(limites);
        for(Alumno elemento : resultados){
            System.out.println(elemento);
        }
    }
}

Los datos se obtienen correctamente

二、Paginación física

Utilizando la sintaxis de paginación nativa de Oracle

Interfaz

package com.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.RowBounds;

import com.model.Alumno;

public interface AlumnoMapper {
    
    /**
     * Consulta paginada
     */
    public List&lt;Alumno&gt; buscarTodos(Integer desplazamiento, Integer cantidad);
    
}

Archivo de cofniguración

&lt;?xml version="1.0" encoding="UTF-8"?&gt;

 &lt;mapper namespace="com.dao.AlumnoMapper"&gt;
    
    &lt;select id="buscarTodos" resultType="alumno"&gt;
        SELECT * FROM (
            SELECT a.*, ROWNUM numero_fila FROM ALUMNO a 
            WHERE ROWNUM &lt;=#{param1}*#{param2}
        ) resultado
        WHERE resultado.numero_fila &gt; (#{param1}-1)*#{param2}
    &lt;/select&gt;

 &lt;/mapper&gt;

Prueba unitaria

package com.test;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.dao.AlumnoMapper;
import com.model.Alumno;

public class PruebaPaginacion {
    private SqlSession sesion;
    private AlumnoMapper mapper;
    
    @Before
    public void iniciar() throws Exception {
        sesion = SqlSessionUtil.getSqlSession();
        mapper = sesion.getMapper(AlumnoMapper.class);
    }

    @After
    public void finalizar() throws Exception {
        sesion.commit();
        sesion.close();
    }
   
    @Test
    public void testBuscarTodos() {
        // Página actual 
        Integer desplazamiento = 2;
        // Filas por página
        Integer cantidad = 3;        
        List&lt;Alumno&gt; resultados = mapper.buscarTodos(desplazamiento, cantidad);
        for(Alumno elemento : resultados){
            System.out.println(elemento);
        }
    }
}

Resultado de la consulta

Etiquetas: MyBatis Oracle Paginación java SQL

Publicado el 8-8 12:48