SpringBoot中整合Mybatis时一般添加的依赖为
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>2.2.1</version>
- </dependency>
如果要实现分页查询的话,可以使用Mybatis的分页插件PageHelper
GitHub - pagehelper/Mybatis-PageHelper: Mybatis通用分页插件
官方使用教程:
https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

这里是SpringBoot项目,可直接使用pagehelper-spring-boot-starter
GitHub - pagehelper/pagehelper-spring-boot: pagehelper-spring-boot
PageHelper-Spring-Boot-Starter 帮助你集成分页插件到 Spring Boot
注:
1、项目中添加依赖
- <dependency>
- <groupId>com.github.pagehelper</groupId>
- <artifactId>pagehelper-spring-boot-starter</artifactId>
- <version>1.3.0</version>
- </dependency>
添加这一个依赖就够了,不用再引入mybatis的依赖,因为会自动引入多个依赖

完整pom依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
-
- <dependency>
- <groupId>com.mysql</groupId>
- <artifactId>mysql-connector-j</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- </dependency>
- <!--MySQL驱动-->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- </dependency>
- <dependency>
- <groupId>com.github.pagehelper</groupId>
- <artifactId>pagehelper-spring-boot-starter</artifactId>
- <version>1.3.0</version>
- </dependency>
这里spring-boot-starter-web引入2.6.13,且存在循环引入,为避免循环依赖引用报错,添加如下配置
- spring:
- main:
- allow-circular-references: true
2、按照官方文档说明配置PageHelper

yml中添加如下配置
- pagehelper:
- helperDialect: mysql # 指定数据库,不指定的话会默认自动检测数据库类型
- # 是否启用分页合理化。
- # 如果启用,当pagenum<1时,会自动查询第一页的数据,当pagenum>pages时,自动查询最后一页数据;
- # 不启用的,以上两种情况都会返回空数据
- reasonable: true
- # 是否开启自动分页? 分页插件会从查询方法的参数值中,自动 params 配置的字段中取值,查找到合适的值时就会自动分页。
- supportMethodsArguments: true # 默认值false,
- # 用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,
- # 不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;
- params: count=countSql
3、yml中同样添加mybatis的配置
- mybatis:
- mapper-locations: classpath:mapper/*.xml # mapper映射文件位置
- type-aliases-package: com.badao.demo.entity # 实体类所在的位置
- configuration:
- log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #用于控制台打印sql语句
4、如何在代码中使用分页
官方文档给出了多种用法
- //第一种,RowBounds方式的调用
- List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
-
- //第二种,Mapper接口方式的调用,推荐这种使用方式。
- PageHelper.startPage(1, 10);
- List<User> list = userMapper.selectIf(1);
-
- //第三种,Mapper接口方式的调用,推荐这种使用方式。
- PageHelper.offsetPage(1, 10);
- List<User> list = userMapper.selectIf(1);
-
- //第四种,参数方法调用
- //存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
- public interface CountryMapper {
- List<User> selectByPageNumSize(
- @Param("user") User user,
- @Param("pageNum") int pageNum,
- @Param("pageSize") int pageSize);
- }
- //配置supportMethodsArguments=true
- //在代码中直接调用:
- List<User> list = userMapper.selectByPageNumSize(user, 1, 10);
-
- //第五种,参数对象
- //如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
- //有如下 User 对象
- public class User {
- //其他fields
- //下面两个参数名和 params 配置的名字一致
- private Integer pageNum;
- private Integer pageSize;
- }
- //存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
- public interface CountryMapper {
- List<User> selectByPageNumSize(User user);
- }
- //当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
- List<User> list = userMapper.selectByPageNumSize(user);
-
- //第六种,ISelect 接口方式
- //jdk6,7用法,创建接口
- Page<User> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
- @Override
- public void doSelect() {
- userMapper.selectGroupBy();
- }
- });
- //jdk8 lambda用法
- Page<User> page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy());
-
- //也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
- pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
- @Override
- public void doSelect() {
- userMapper.selectGroupBy();
- }
- });
- //对应的lambda用法
- pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());
-
- //count查询,返回一个查询语句的count数
- long total = PageHelper.count(new ISelect() {
- @Override
- public void doSelect() {
- userMapper.selectLike(user);
- }
- });
- //lambda
- total=PageHelper.count(()->userMapper.selectLike(user));
下面介绍简单的PageHelper.startPage 静态方法调用
你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,
紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。
- @Override
- public List<User> selectUserPage() {
- PageHelper.startPage(1, 10);
- return userMapper.findAll();
- }
编写单元测试
- import com.badao.demo.entity.User;
- import com.badao.demo.service.UserService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.test.context.junit4.SpringRunner;
- import java.util.List;
-
- @SpringBootTest
- @RunWith(SpringRunner.class)
- public class PageTest {
-
- @Autowired
- private UserService userService;
-
- @Test
- public void testPage() {
- List
users = userService.selectUserPage(); - System.out.println(users.size());
- }
-
- }
单元测试运行结果
