概述
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数据库)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复