Mybatis分页插件PageHelper的使用

开头语

上回书说到:将SpringBoot和持久层框架Mybtais进行简单整合,整合时,使用了Mybatis的分页插件PageHelper,但并未介绍如何使用该分页插件,本次讲解PageHelper的常见的使用方法,请大家提意见

什么是PageHelper

在使用Java语言开发项目的过程中,采用原生的JDBC或者说采用原生的Mybatis进行数据查询时,数据量达到一定程度时,页面则会展示出过多的数据,需要用到分页技术,让用户一页一页的查看数据,Oracle采用的是rownum来进行分页,相当于自己生成了一个虚拟列。

1
select user_id,user_name from t_user where rownum > 5 and rownum < 10;

MySQL使用limit 开始条,结束条 的方式(limit 5,10) 进行分页

1
select user_id,user_name from t_user  limit 5,10;

PageHelper将分页过程进行封装,采用PageInfo对象来进行数据查询,完成分页查询,还携带了总条数,当前页,是否含有上一页和下一页标识,接下来介绍PageHelper的用法。

开始介绍

1.首先,PageHelper需要引入的依赖包文件如下

1
2
3
4
5
6
<!-- 好用的分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.0</version>
</dependency>

2.Mybatis配置文件中的PageHelper配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 4.0.0以后版本可以不设置该参数 -->
<property name="dialect" value="mysql"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
<!-- 和startPage中的pageNum效果一样-->
<property name="offsetAsPageNum" value="true"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="true"/>
<!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
<!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
<property name="pageSizeZero" value="true"/>
<!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
<!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
<!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
<property name="reasonable" value="false"/>
<!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
<!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->
<!-- 不理解该含义的前提下,不要随便复制该配置 -->
<property name="params" value="pageNum=pageHelperStart;pageSize=pageHelperRows;"/>
<!-- 支持通过Mapper接口参数来传递分页参数 -->
<property name="supportMethodsArguments" value="false"/>
<!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->
<property name="returnPageInfo" value="none"/>
</plugin>

3.接下来,往上次建立的t_user表插入19条数据(表中本来有一条)

1
2
INSERT INTO `t_user` (`user_id`, `user_name`, `pass_word`) VALUES ('2', 'lisi2', '123456'),('3', 'lisi3', '123456'),('4', 'lisi4', '123456'),('5', 'lisi5', '123456'),('6', 'lisi6', '123456'),('7', 'lisi7', '123456'),('8', 'lisi8', '123456'),('9', 'lisi9', '123456'),('10', 'lisi10', '123456'),('11', 'lisi11', '123456'),('12', 'lisi12', '123456'),('13', 'lisi13', '123456'),('14', 'lisi14', '123456'),('15', 'lisi15', '123456'),('16', 'lisi16', '123456'),
('17', 'lisi17', '123456'),('18', 'lisi18', '123456'),('19', 'lisi19', '123456'),('20', 'lisi20', '123456');

4.开始分页查询开始,mybatis映射文件如下

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yang.dao.UserDao">
<!-- 获得用户列表 -->
<select id="getUser" resultType="com.yang.bean.User">
select user_id userId,user_name userName,pass_word password from t_user
</select>
</mapper>

5.数据层接口如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.yang.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import com.yang.bean.User;

/**
* 用户登录数据层
* @author Yang
*
*/
@Mapper //标识为mybatis数据层接口
public interface UserDao {
/**
*全量查询用户
* @param user
* @return
*/
List<User> getUser();
}

6.编写分页查询的服务层接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.yang.service;

import java.util.List;

import com.github.pagehelper.PageInfo;
import com.yang.bean.User;

/**
* 用户服务接口
* @author Yang
*
*/
public interface IUserService {
/**
*全量查询用户
* @return
*/
List<User> getUser();

/**
* 分页查询用户
* @param page 页码
* @param size 数量
* @return
*/
PageInfo<User> getUsersLimit(int page,int size);
}

7.开始编写业务层的分页代码,PageHelper提供了许多的方法,来供开发者使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.yang.service.impl;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.yang.bean.User;
import com.yang.dao.UserDao;
import com.yang.service.IUserService;

/**
* 服务实现
* @author Yang
*
*/
@Service //标识为服务类
public class UserServiceImpl implements IUserService {
//注入数据层接口
@Autowired
private UserDao userDao;

@Override
public List<User> getUser() {
return userDao.getUser();
}

/**
* 分页查询用户
* @param page 页码
* @param size 数量
* @return
*/
public PageInfo<User> getUsersLimit(int page,int size){
//首先开启PageHelper的分页
PageHelper.startPage(page, size);
//查询分页信息 调用方式与普通方式一致
List<User> list=userDao.getUser();
//生成PageInfo对象
PageInfo<User> pageInfo=new PageInfo<User>(list);
//总数据条数
System.out.println(pageInfo.getTotal());
//第一页的页码
System.out.println(pageInfo.getFirstPage());
//最终页的页码
System.out.println(pageInfo.getLastPage());
//下一页的页码
System.out.println(pageInfo.getNextPage());
//当前页码
System.out.println(pageInfo.getPageNum());
//开始的数据下标
System.out.println(pageInfo.getStartRow());
//结束的数据下标
System.out.println(pageInfo.getEndRow());
//数据条数
System.out.println(pageInfo.getSize());
return pageInfo;
}
}

8.控制层代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.yang.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.github.pagehelper.PageInfo;
import com.yang.bean.ResultObject;
import com.yang.bean.User;
import com.yang.service.IUserService;

/**
* @author Java小白
*
*/
@RestController //标识为返回类型为Json的控制器
public class UserController {
//自动注入服务类
@Autowired
private IUserService userService;
//标识请求地址
@RequestMapping("/helloworld")
public String helloWorld() {
return "helloworld";
}
//标识请求地址
@RequestMapping("/getuser")
public ResultObject<List<User>> getUsers() {
//查询用户列表
List<User> list= userService.getUser();
ResultObject<List<User>> rs=new ResultObject<List<User>>();
//状态码
rs.setCode(0);
//提示
rs.setMsg("查询成功");
//数据
rs.setData(list);

return rs;
}

/**
* 分页查询用户信息
* @param page 页码
* @param size 数量
* @return
*/
@RequestMapping("/getuserLimit")
public ResultObject<List<User>> getUsersLimit(@RequestParam("page") int page,@RequestParam("size") int size){
//查询用户列表
PageInfo<User> pageInfo=userService.getUsersLimit(page,size);
List<User> list= pageInfo.getList();
ResultObject<List<User>> rs=new ResultObject<List<User>>();
//状态码
rs.setCode(0);
//提示
rs.setMsg("查询成功");
//数据
rs.setData(list);
//条数
rs.setCount(pageInfo.getTotal());
return rs;
}
}

8.启动项目,地址栏输入访问接口以及分页参数:localhost:8088/getUserLimit?page=2&size=5,查询成功

总结

以上就是PageHelper的集成和使用方式,请各位参考 项目源码下载地址(点击我下载,小心你的鼠标)