Mybatis (3) ----- el uso de paginación

Tabla de contenido

1. Consulta de paginación

Segundo, procesamiento de caracteres especiales.

3. Resumen


Prólogo: Sobre la base del SQL dinámico que aprendimos en el artículo anterior, hoy continuaremos explicando la paginación y el procesamiento de caracteres especiales de maybatis. ¡Espero que este blog pueda ayudarte!

1. Consulta de paginación

¿Por qué reescribir la paginación de mybatis?

Hay varias razones para anular la funcionalidad de paginación de MyBatis.

En primer lugar, la función de paginación predeterminada de MyBatis solo puede realizar una paginación simple, pero no puede cumplir con requisitos de paginación complejos . Al reescribir la paginación de MyBatis, se pueden realizar funciones de paginación más flexibles y avanzadas. En segundo lugar, reescribir la paginación puede mejorar el rendimiento del sistema.

En segundo lugar, la implementación de paginación predeterminada de MyBatis es consultar primero todos los resultados al consultar la base de datos y luego filtrar los resultados de acuerdo con los parámetros de paginación. Cuando la cantidad de datos es grande, este método provocará una disminución en el rendimiento de la consulta e incluso un problema de desbordamiento de memoria. Al reescribir la paginación, puede generar SQL directamente con declaraciones de paginación al consultar la base de datos, evitando la carga de datos y el consumo de memoria innecesarios, mejorando así el rendimiento del sistema . Además, la reescritura de paginación también puede ser compatible con diferentes dialectos de bases de datos. Las diferentes bases de datos tienen algunas diferencias en la sintaxis de paginación. La implementación de paginación predeterminada de MyBatis solo es aplicable a algunas bases de datos y no puede ser compatible con todas las bases de datos. Al reescribir la paginación, se pueden generar declaraciones de paginación correspondientes de acuerdo con diferentes dialectos de la base de datos, para realizar la función de paginación en todas las bases de datos. Por lo tanto, reescribir la función de paginación de MyBatis puede cumplir con requisitos de paginación más complejos, mejorar el rendimiento del sistema y ser compatible con diferentes dialectos de bases de datos.

Pasos para personalizar el uso de complementos de paginación:
1. Importar dependencias de pom

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
</dependency>

Busque el directorio de carpetas correcto; de lo contrario, el problema será grande.
2. Interceptor de configuración Mybatis.cfg.xml

<plugins>
    <!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
    </plugin>
</plugins>

3. Utilice PageHelper para paginar

package com.lya.util;
 
 
 
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Map;
/**
 * @authorlya
 * @site www.lya.com
 * @create  2023-08-24 11:44
 */
public class PageBean implements Serializable {
 
    private static final long serialVersionUID = 2422581023658455731L;
 
    //页码
    private int page=1;
    //每页显示记录数
    private int rows=10;
    //总记录数
    private int total=0;
    //是否分页
    private boolean isPagination=true;
    //上一次的请求路径
    private String url;
    //获取所有的请求参数
    private Map<String,String[]> map;
 
    public PageBean() {
        super();
    }
 
    //设置请求参数
    public void setRequest(HttpServletRequest req) {
        String page=req.getParameter("page");
        String rows=req.getParameter("rows");
        String pagination=req.getParameter("pagination");
        this.setPage(page);
        this.setRows(rows);
        this.setPagination(pagination);
        this.url=req.getContextPath()+req.getServletPath();
        this.map=req.getParameterMap();
    }
    public String getUrl() {
        return url;
    }
 
    public void setUrl(String url) {
        this.url = url;
    }
 
    public Map<String, String[]> getMap() {
        return map;
    }
 
    public void setMap(Map<String, String[]> map) {
        this.map = map;
    }
 
    public int getPage() {
        return page;
    }
 
    public void setPage(int page) {
        this.page = page;
    }
 
    public void setPage(String page) {
        if(null!=page&&!"".equals(page.trim()))
            this.page = Integer.parseInt(page);
    }
 
    public int getRows() {
        return rows;
    }
 
    public void setRows(int rows) {
        this.rows = rows;
    }
 
    public void setRows(String rows) {
        if(null!=rows&&!"".equals(rows.trim()))
            this.rows = Integer.parseInt(rows);
    }
 
    public int getTotal() {
        return total;
    }
 
    public void setTotal(int total) {
        this.total = total;
    }
 
    public void setTotal(String total) {
        this.total = Integer.parseInt(total);
    }
 
    public boolean isPagination() {
        return isPagination;
    }
 
    public void setPagination(boolean isPagination) {
        this.isPagination = isPagination;
    }
 
    public void setPagination(String isPagination) {
        if(null!=isPagination&&!"".equals(isPagination.trim()))
            this.isPagination = Boolean.parseBoolean(isPagination);
    }
 
    /**
     * 获取分页起始标记位置
     * @return
     */
    public int getStartIndex() {
        //(当前页码-1)*显示记录数
        return (this.getPage()-1)*this.rows;
    }
 
    /**
     * 末页
     * @return
     */
    public int getMaxPage() {
        int totalpage=this.total/this.rows;
        if(this.total%this.rows!=0)
            totalpage++;
        return totalpage;
    }
 
    /**
     * 下一页
     * @return
     */
    public int getNextPage() {
        int nextPage=this.page+1;
        if(this.page>=this.getMaxPage())
            nextPage=this.getMaxPage();
        return nextPage;
    }
 
    /**
     * 上一页
     * @return
     */
    public int getPreivousPage() {
        int previousPage=this.page-1;
        if(previousPage<1)
            previousPage=1;
        return previousPage;
    }
 
    @Override
    public String toString() {
        return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
                + "]";
    }
}

4. Manejar los resultados de paginación

①LibroBiz

List<Map> listPager(Map map, PageBean pageBean);


②BookMapper.java

//    利用第三方插件进行分页
    List<Map> listPager(Map map);


③BookMapper.xml

<select id="listPager" resultType="java.util.Map" parameterType="java.util.Map">
  select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
</select>


④BookBizImpl

@Override
    public List<Map> listPager(Map map, PageBean pageBean) {
//        pageHelper分页插件相关的代码
        if(pageBean!=null&&pageBean.isPagination()){
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        }
        List<Map> maps = bookMapper.listPager(map);
        if(pageBean!=null&&pageBean.isPagination()){
//            处理查询结果的前提是需要分页,是需要分页的
            PageInfo info = new PageInfo(maps);
            pageBean.setTotal(info.getTotal()+"");
        }
        return maps;
    }


⑤BookBizImplTest 

@Test
    public void listPager() {
        Map map=new HashMap();
        map.put("bname","圣墟");
//        bookBiz.listPager(map).forEach(System.out::println);
 
//        查询出第二页的20条数据
        PageBean pageBean = new PageBean();
        pageBean.setPage(2);
        pageBean.setRows(20);
 
        bookBiz.listPager(map,pageBean).forEach(System.out::println);

   

}

Segundo, procesamiento de caracteres especiales.

2. Consulta difusa
 Cuando escribimos una consulta difusa, generalmente escribimos así:

select * from t_mvc_book where bname like '%?%'

Luego usamos el marcador de posición para pasar el valor en segundo plano para la consulta.

Entonces será diferente después de usar Mybatis. Tiene tres formas de cambiar la forma de esta consulta difusa:

  <select id="selectBooksLike1" resultType="com.zq.model.Book" parameterType="java.lang.String">
  select * from t_mvc_book where bname like #{bname}
</select>
  <select id="selectBooksLike2" resultType="com.zq.model.Book" parameterType="java.lang.String">
  select * from t_mvc_book where bname like '${bname}'
</select>
  <select id="selectBooksLike3" resultType="com.zq.model.Book" parameterType="java.lang.String">
  select * from t_mvc_book where bname like concat('%',#{bname},'%')
</select>


 Después de escribir la configuración de estos archivos xml, también agregaremos otras capas comerciales.

LibroMapper.xml:
 


<select id="listPagerS" resultType="com.csdn.xw.model.Book" parameterType="java.util.Map">
  select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%') and price < #{max}
</select>

BookBizImplTest 

 @Test
    public void listPagerS() {
        System.out.println("没有处理特殊字符之前");
        Map map=new HashMap();
        map.put("dname","圣墟");
        map.put("max",20);
        bookBiz.listPagerS(map).forEach(System.out::println);

 @Test
    public void listPagerS() {
        System.out.println("没有处理特殊字符之前");
        Map map=new HashMap();
        map.put("dname","圣墟");
        map.put("max",20);
        bookBiz.listPagerS(map).forEach(System.out::println);


 

3. Resumen

   Cuando usamos myBatis, encontraremos un problema al crear archivos de configuración sql, es decir, habrá conflictos entre caracteres especiales y corchetes de etiquetas.

Por ejemplo: < y <

¿Cuál es el significado? Es decir, el primero es juzgar que el símbolo es menor que y el segundo es el paréntesis izquierdo de la etiqueta, entonces, ¿cómo distinguirlo? Hay dos maneras:

①: <![CDATA[ <= ]]> 

②:    <(<)  、     >(>)       &(&) 

Por ejemplo:

  ①LibroBiz

 
  
  1. List<Book> list6(BookVo bookVo);

  2. List<Book> list7(BookVo bookVo);

②BookMapper.java

/**
     * 处理特殊字符
     * @param bookVo
     * @return
     */
    List<Book> list6(BookVo bookVo);
 
 
    /**
     * 处理特殊字符
     * @param bookVo
     * @return
     */
    List<Book> list7(BookVo bookVo);


③BookMapper.xml

<select id="list6" resultType="com.zq.model.Book" parameterType="com.zq.model.BookVo">
  select * from t_mvc_book
  <where>
    <if test="null != min and min != ''">
      <![CDATA[  and #{min} < price ]]>
    </if>
    <if test="null != max and max != ''">
      <![CDATA[ and #{max} >
  </where>
</select>
 
<select id="list7" resultType="com.javaxl.model.Book" parameterType="com.zq.model.BookVo"> price ]]>
    </if>
    select * from t_mvc_book
    <where>
      <if test="null != min and min != ''">
         and #{min} &lt; price
      </if>
      <if test="null != max and max != ''">
         and #{max} &gt; price
      </if>
    </where>
  </select>

④BookBizImpl

@Override
    public List<Book> list6(BookVo bookVo) {
        return bookMapper.list6(bookVo);
    }
 
    @Override
    public List<Book> list7(BookVo bookVo) {
        return bookMapper.list7(bookVo);
    }

⑤BookBizImplTest

 @Test
    public void list6() {
        BookVo vo=new BookVo();
        vo.setMax(45);
        vo.setMin(35);
        bookBiz.list6(vo).forEach(System.out::println);
    }
 
    @Test
    public void list7() {
        BookVo vo=new BookVo();
        vo.setMax(45);
        vo.setMin(35);
        bookBiz.list7(vo).forEach(System.out::println);
    }

Resultados de la prueba:

Supongo que te gusta

Origin blog.csdn.net/m0_73647713/article/details/132473635
Recomendado
Clasificación