我是靠谱客的博主 坚强黑猫,最近开发中收集的这篇文章主要介绍MyBatis进阶五:PageHelper分页插件;0.为什么需要PageHelper分页插件1.PageHelper分页插件简介2.PageHelper使用案例(基于MySQL数据库),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

PageHelper分页插件:帮助我们自动完成分页查询的工作。很给力的一个mybatis分页插件;

目录

0.为什么需要PageHelper分页插件

1.PageHelper分页插件简介

2.PageHelper使用案例(基于MySQL数据库)

(1)首先,在maven中引入PageHelper和jsqlparser

(2)然后,在mybatis-config.xml中增加plugin配置

(3)然后,为了测试,就在Mapper XML中添加一个SQL标签

(4)然后,在代码中实际调用

(5)一个容易出错的点(十分重要!!!  理解不一定正确,但目前看就是这样。)


0.为什么需要PageHelper分页插件

分页查询,开发起来其实挺复杂的;

(1)使用MySQL中的limit实现查询第几页的时候,需要计算查询第几个到第几个,,,这其实有点小麻烦,容易算错;

(2)需要计算总记录数,,,,这需要额外的创建一个SQL语句来获取记录总数;

(3)得到总数后,需要根据每页显示几条数据,来计算总页数,当前页是哪一页,上一页是哪一页,下一页是哪一页……这些信息都获取后,才能在前台展现;挺麻烦的。

总之,如果不使用PageHelper分页插件,而是自己实现这个功能的话,写起来会很麻烦,计算起来非常容易出错,总之就是很恶心人~~~


 

1.PageHelper分页插件简介

为此,Mybatis提供了PageHelper分页插件。(国人编写的一个插件)

PageHelper分页插件可以自动帮助我们完成上面介绍的【分页查询的麻烦事】;同时PageHelper分页插件使用简单;

PageHelper官网:https://pagehelper.github.io/

总结下来,PageHelper的使用流程:

(1)通过maven引入PageHelper的依赖,和jsqlparser这个额外的第三方组件,是一个SQL解析器;jsqlparser是PageHelper的底层依赖;

(2)在mybatis-config.xml中引用PageHelper;

(3)在代码中调用方法就完事了。


 

2.PageHelper使用案例(基于MySQL数据库)

(1)首先,在maven中引入PageHelper和jsqlparser

说明:

(1)jsqlparser的版本需要是2.0及以上的版本;因为5.1.10之前的PageHelper并没有对jsqlparser版本作要求;但是5.1.10及以后的PageHelper采用了新的API,所以jsqlparser的版本需要是2.0及以上的版本才可以;

(2)PageHelper执行原理:PageHelper在原有的要执行的SQL基础上,进行分析,自动生成分页以及【select count(*) from…】这样的语句;;;因为,涉及到原始SQL的分析与解析,所以需要引入jsqlparser这个SQL解析器组件啦;

 

(2)然后,在mybatis-config.xml中增加plugin配置

说明:

(1)plugins插件是mybatis的一个特色,通过插件可以扩展mybatis的能力;

(2)interceptor属性:代表拦截器,需要配置PageHelper的核心类;

(3)helperDialect配置项和reasonable配置项(在PageHelper的官网文档中有详细说明)

PageHelper其他配置项还有很多,但大部分情况下都不需要手动配置;如果在开发中遇到特殊的场景,需要配置某些配置项,打开PageHelper的文档,去查就OK了;

 

(3)然后,为了测试,就在Mapper XML中添加一个SQL标签

(注意,这条SQL语句最后没有加分号!!!!!)

 

(4)然后,在代码中实际调用

package com.imooc.mybatis;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.imooc.mybatis.dto.GoodsDTO;
import com.imooc.mybatis.entity.Goods;
import com.imooc.mybatis.entity.GoodsDetail;
import com.imooc.mybatis.entity.Student;
import com.imooc.mybatis.utils.MyBatisUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * JUnit单元测试类
 */
public class MyBatisTestor {

    @Test
    public void testSelectPage() throws Exception {
        SqlSession session = null;
        try {
            session = MyBatisUtils.openSession();
            // PageHelper.startPage()对即将到来的下一次查询进行分页处理;
            // 比如下面就是第三页,每页10条数据;
            PageHelper.startPage(3, 10);
            Page<Goods> page = (Page)session.selectList("goods.selectPage");
            System.out.println("总页数:"+page.getPages());
            System.out.println("总记录数:"+page.getTotal());
            System.out.println("开始行号:"+page.getStartRow());
            System.out.println("结束行号:"+page.getEndRow());
            System.out.println("当前页码:"+page.getPageNum());
            List<Goods> data = page.getResult();  // 获取当前页数据
            for (Goods goods:data){
                System.out.println(goods.getTitle());
            }
        } catch (Exception e) {
            throw e;
        }finally {
            MyBatisUtils.closeSession(session);
        }
    }
}

说明:

(1)startPage()方法

(2)在使用PageHelper后,selectList()方法的返回值类型是Page;然后需要说明泛型为Goods,即每一条记录都是一个Goods对象;

(3)Page类中定义了大量的方法,可以获取想要的东西;

当然,Page类常用的方法就那几个啦。

……………………………………………………

自然,没事可以看些Page类的代码啦:其中定义了大量的属性;;;(PS:如果不使用PageHelper插件,我们就需要自己写一个类似Page的类~~~)

(4)最关键是:当前页的数据,通过getResult()方法获取:

运行结果:

上面SQL执行的背后,底层是引入的jsqlparser在支撑。

 

(5)一个容易出错的点(十分重要!!!  理解不一定正确,但目前看就是这样。)

这样执行,会报错:MySQL语法错误:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 20, 10' at line 1
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

自我感觉,是PageHelper的jsqlparser在组织SQL语句,添加limit后,这个分号造成了如下的SQL语法错误。 

 


 

 

 

 

最后

以上就是坚强黑猫为你收集整理的MyBatis进阶五:PageHelper分页插件;0.为什么需要PageHelper分页插件1.PageHelper分页插件简介2.PageHelper使用案例(基于MySQL数据库)的全部内容,希望文章能够帮你解决MyBatis进阶五:PageHelper分页插件;0.为什么需要PageHelper分页插件1.PageHelper分页插件简介2.PageHelper使用案例(基于MySQL数据库)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部