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 | < | <= | > | >= | & | ' | " |
————————————————————————————————————————————————————————————————————————
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<Alumno> buscarTodos(RowBounds rb);
}
Archivo de configuración
<?xml version="1.0" encoding="UTF-8"?>
<mapper namespace="com.dao.AlumnoMapper">
<select id="buscarTodos" resultType="alumno" >
SELECT * FROM alumno
</select>
</mapper>
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<Alumno> 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<Alumno> buscarTodos(Integer desplazamiento, Integer cantidad);
}
Archivo de cofniguración
<?xml version="1.0" encoding="UTF-8"?>
<mapper namespace="com.dao.AlumnoMapper">
<select id="buscarTodos" resultType="alumno">
SELECT * FROM (
SELECT a.*, ROWNUM numero_fila FROM ALUMNO a
WHERE ROWNUM <=#{param1}*#{param2}
) resultado
WHERE resultado.numero_fila > (#{param1}-1)*#{param2}
</select>
</mapper>
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<Alumno> resultados = mapper.buscarTodos(desplazamiento, cantidad);
for(Alumno elemento : resultados){
System.out.println(elemento);
}
}
}
Resultado de la consulta