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)然后,在代码中实际调用
说明:
(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语法错误。