赵走x博客
网站访问量:151542
首页
书籍
软件
工具
古诗词
搜索
登录
2-搭建MyBatis
1-MyBatis简介
0、SSM整合PDF下载
PageHelper分页插件
PageHelper分页插件
资源编号:551316
热度:154
PageHelper分页插件
# 1、为什么需要PageHelper分页插件  分页查询,开发起来其实挺复杂的;  (1)使用MySQL中的limit实现查询第几页的时候,需要计算查询第几个到第几个,,,这其实有点小麻烦,容易算错; (2)需要计算总记录数,,,,这需要额外的创建一个SQL语句来获取记录总数; (3)得到总数后,需要根据每页显示几条数据,来计算总页数,当前页是哪一页,上一页是哪一页,下一页是哪一页……这些信息都获取后,才能在前台展现;挺麻烦的。 总之,如果不使用PageHelper分页插件,而是自己实现这个功能的话,写起来会很麻烦,计算起来非常容易出错,总之就是很恶心人~~~ # 2、PageHelper分页插件简介 为此,Mybatis提供了PageHelper分页插件。(国人编写的一个插件) PageHelper分页插件可以自动帮助我们完成上面介绍的【分页查询的麻烦事】;同时PageHelper分页插件使用简单; PageHelper官网:https://pagehelper.github.io/ 总结下来,PageHelper的使用流程:  (1)通过maven引入PageHelper的依赖,和jsqlparser这个额外的第三方组件,是一个SQL解析器;jsqlparser是PageHelper的底层依赖; (2)在mybatis-config.xml中引用PageHelper; (3)在代码中调用方法就完事了。 # 3、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
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
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语法错误。