我是靠谱客的博主 从容高山,最近开发中收集的这篇文章主要介绍mybatis第六话 - mybatis插件篇之pagehelper的使用1.故事前因2.分页插件pagehelper,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文主要讲述了mybatis插件篇之pagehelper的使用

1.故事前因

新入职一家公司接手过来的代码,用的还是ibatis,看了一下sql mapper文件,里面看到了很多count查询,基本上一条list,一条count。特别是涉及到统计,在改动过程中经常会出现很多问题,于是决定更换技术栈,改用mybatis,所有的count查询都用分页框架。

2.分页插件pagehelper

用过就知道,最便捷最简单的物理分页插件了。

2.1 Java中使用pagehelper

基于springboot 2.5.6,mybatis 2.2.0版本,贴一下pom依赖

<!--Mysql连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!--分页-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>

sql语句

select * from user_info

Java查询代码

@GetMapping("/data/select")
public Object select() {
PageHelper.startPage(1,1);
Map<String, Object> map = new HashMap<>();
//查询
List<Map<String, Object>> mapList = testMapper.select(map);
PageHelper.clearPage();
return mapList;
}

查看日志打印

==>
Preparing: SELECT count(0) FROM user_info
<==
Columns: count(0)
<==
Row: 4
<==
Total: 4
==>
Preparing: select * from user_info LIMIT ?
==> Parameters: 1(Integer)

上述日志可以看到,先会执行一条count的sql,然后才会执行真正手写的sql,并且还带了limit查询。

2.2 取值

从上面看到手写的一条sql,但是在加了PageHelper.startPage(1,1);就能够多执行一条count查询,并且真正的查询能达到物理分页的效果。
既然执行了一条count查询,那么怎么取出总数量呢。直接看代码

@GetMapping("/data/select")
public Object select() {
PageHelper.startPage(1, 1);
Map<String, Object> map = new HashMap<>();
//需要用PageInfo封装一层
PageInfo<Map<String, Object>> pageInfo = new PageInfo<>(testMapper.select(map));
PageHelper.clearPage();
System.out.println("总条数:" + pageInfo.getTotal());
//data list
return pageInfo.getList();
}

输出结果 总条数:4

2.3 PageHelper.startPage(1, 1);

由于之前踩过很多次这个页码的坑,在这里记录一下。
总所周知,很多管理后台的页面其实是从0开始的,但是一旦直接传入PageHelper.startPage(0, 1);不会报错,从意思上来看是第0页的第一条,但是压根查询不到数据。这是为什么呢?

可以跟着startPage这行代码查看源码一直往下到Page的构造方法

private Page(int pageNum, int pageSize, boolean count, Boolean reasonable) {
super(0);
//如果开头是1 并且pageSize是最大值,则设置为查询0条,避免把数据库查死
if (pageNum == 1 && pageSize == Integer.MAX_VALUE) {
pageSizeZero = true;
pageSize = 0;
}
this.pageNum = pageNum;
this.pageSize = pageSize;
this.count = count;
//计算分页 ###
calculateStartAndEndRow();
setReasonable(reasonable);
}
/**
* 计算起止行号
*/
private void calculateStartAndEndRow() {
//例如 1,10 -> (1-1)*10 =0
this.startRow = this.pageNum > 0 ? (this.pageNum - 1) * this.pageSize : 0;
//例如 1,10 -> 0+ 10 * 1=10 
//但是如果是0 0+10*0= 0
最终执行的sql就是limit 0,0
this.endRow = this.startRow + this.pageSize * (this.pageNum > 0 ? 1 : 0);
}

这块谨记,PageHelper分页插件的页码是从1开始的!!!

以上就是本章的全部内容了。

上一篇:mybatis第五话 - mybatis情同手足的插件之TypeHandler和Interceptor
下一篇:mybatis第七话 - mybatis插件篇之pagehelper的源码分析

老冉冉其将至兮,恐修名之不立

最后

以上就是从容高山为你收集整理的mybatis第六话 - mybatis插件篇之pagehelper的使用1.故事前因2.分页插件pagehelper的全部内容,希望文章能够帮你解决mybatis第六话 - mybatis插件篇之pagehelper的使用1.故事前因2.分页插件pagehelper所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部