分页无论是那个开发都是常见的使用场景,当然对于分页需要如果自己写的,不过自己写的话可能会需要想到很多:
比如:通过查询sql判断有多少数据,在页面显示共有多少页面。然后每页返回的数据是多少,上一页以及下一页如果到第一页和最后一页后是否起效等等。
这个就有一个mybatis的分页插件pageHelper,其本质就是mybatis拦截器的一个应用,实现分页查询。
如果需要深入了解可以看一下:官网
还是老规矩进行演示吧,文字解说不如直接用例子演示:
第一步
这个需要两步,分布需要配置依赖和插件。
这个配置在pox.xml配置文件中
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<!-- 配置依赖环境 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
这个需要配置在mybatis-config.xml.
毕竟这个是mybatis的适配插件,所以需要配置在mybatis的核心配置文件中。
<!-- 设置分页的插件 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
第二步
体验插件工具其它的配置就不再多说直接使用逆向工程的配置环境,不重写搭建了 不然篇幅又变得很长而琐碎了。传送阵
首先使用一个非分页的查询吗,可以查询出所有的数据:
@Test
public void test(){
try {
// 通过IO操作配置文件 所以说这个配置文件可以改名字,一般默认是mybatis-config.xml
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// SqlSession类似与jdb中connection,但是其通过SqlSession工厂而创建的,而这个工厂却是通过工厂的构造类SqlSessionFactoryBuilder得到工厂
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 返回SqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 这个通过代理模式,传入什么类返回什么类
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
StudentExample studentExample=new StudentExample();
List<Student> studentList= studentMapper.selectByExample(studentExample);
studentList.forEach(System.err::println);
sqlSession.commit();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
这个时候没有启动分页插件,其实插件的使用有点像是javaweb中的过滤器一样,在请求数据的时候会先通过插件所带的方法。如下写:
@Test
public void test(){
try {
// 通过IO操作配置文件 所以说这个配置文件可以改名字,一般默认是mybatis-config.xml
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// SqlSession类似与jdb中connection,但是其通过SqlSession工厂而创建的,而这个工厂却是通过工厂的构造类SqlSessionFactoryBuilder得到工厂
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 返回SqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 这个通过代理模式,传入什么类返回什么类
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
StudentExample studentExample=new StudentExample();
// 这里开启分页
PageHelper.startPage(1,2);
List<Student> studentList= studentMapper.selectByExample(studentExample);
studentList.forEach(System.err::println);
sqlSession.commit();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
可见直接这样写,返回的数据数据第一页,分页数据为2条。
然后打印出数据:
Page<Object> page = PageHelper.startPage(1,2);
List<Student> studentList= studentMapper.selectByExample(studentExample);
studentList.forEach(System.err::println);
// 得到所有的班级数据
System.err.println(page);
看一下page内容是:
Page{count=true, pageNum=1, pageSize=2, startRow=0, endRow=2, total=6, pages=3, reasonable=false, pageSizeZero=false}[Student [Hash = 540325452, studentId=1, studentName=张三, studentAge=18, studentSex=男, gradeId=2, serialVersionUID=1], Student [Hash = 1976804832, studentId=2, studentName=赛貂蝉, studentAge=14, studentSex=女, gradeId=1, serialVersionUID=1]]
可见有具体的页数,以及总共有多少条数据,以及返回的当前页面的数据。
当然还有更加具体数据的对象PageInfo:
@Test
public void test(){
try {
// 通过IO操作配置文件 所以说这个配置文件可以改名字,一般默认是mybatis-config.xml
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// SqlSession类似与jdb中connection,但是其通过SqlSession工厂而创建的,而这个工厂却是通过工厂的构造类SqlSessionFactoryBuilder得到工厂
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 返回SqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 这个通过代理模式,传入什么类返回什么类
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
StudentExample studentExample=new StudentExample();
// 这里开启分页
Page<Object> page = PageHelper.startPage(1,2);
List<Student> studentList= studentMapper.selectByExample(studentExample);
studentList.forEach(System.err::println);
// 在页面显示有多少也的参数 navigateLastPage
PageInfo<Student> pageInfo= new PageInfo<>(studentList,4);
// 得到所有的班级数据
System.err.println(pageInfo);
// 还可以添加条件
sqlSession.commit();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
其PageInfo输出的如下
因为PageInfo有点不详细,调整其格式如下看:
现在说一下具体的意义:
- pageNum:当前页的页码
- pageSize:每页显示的条数
- startRow / endRow : 这个是数据库返回的数据在本页是第几条到第几条,比如例子是第一页所以开始1,结束2.
- size:当前页面显示的真实条数
- total:总记录数
- pages: 总页数
- prePage / nextPage:上一页页码 / 下一页页码
- isFirstPage / isLastPage : 是否是第一页 / 是否是最后一页
- navigatePages : 设置的导航页数字 比如例子中是4 是通过 new PageInfo<>(studentList,4); 得到的
- navigateFirstPage / navigateLastPage : 导航页第一页 / 最后一页 这里可以看出设置页数和真实数据还是有差异的
- navigatepageNums :导航分页的页码
这些可以传递到页面,然后页面根据这些数据进行取出判断即可。