注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “MyBatis Plus环境准备” 章节,点击下载示例源码。
本章节将介绍 MyBatis Plus 的分页插件,使用分页插件对数据进行分页。
在传统的 MyBatis 应用中,我们使用 PageHelper(https://github.com/pagehelper/Mybatis-PageHelper)或者自己实现分页。但是,在 MyBatis Plus 中,你可以通过 PaginationInnerInterceptor 插件快速实现分页。
在 Spring Boot 中,使用 @Configuration 和 @Bean 注解配置分页插件,代码如下:
@Bean public MybatisPlusInterceptor paginationInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 分页插件,如果你不配置,分页插件将不生效 // 指定数据库方言为 MYSQL interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; }
PaginationInnerInterceptor 分页插件还提供了如下几个属性:
溢出总页数后是否进行处理,默认不处理。参见插件 continuePage 方法
单页分页条数限制,默认无限制。参见插件 handlerLimit 方法
数据库类型(可取值见 DbType 枚举类型),根据类型获取应使用的分页方言。参见插件 findIDialect 方法
方言实现类,需要实现 IDialect 接口。参见插件 findIDialect 方法
(1)配置分页插件 PaginationInnerInterceptor,代码如下:
package com.hxstrive.mybatis_plus; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisPlusConfig { @Autowired private TenantIdManager tenantIdManager; @Bean public MybatisPlusInterceptor paginationInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 分页插件,如果你不配置,分页插件将不生效 // 指定数据库方言为 MYSQL PaginationInnerInterceptor pageInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); pageInterceptor.setMaxLimit(20L); // 单页分页条数限制 interceptor.addInnerInterceptor(pageInterceptor); return interceptor; } }
(2)客户端代码,查询用户列表的第二页,每页 30 条数据。如下:
package com.hxstrive.mybatis_plus.plugins; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.hxstrive.mybatis_plus.mapper.SimpleMapper; import com.hxstrive.mybatis_plus.model.UserBean; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest class PluginDemo3 { @Autowired private SimpleMapper mapper; @Test void contextLoads() { // 如果 page 指定的 pageSize 大于 MaxLimit,则使用 MaxLimit 作为 pageSize Page<UserBean> page = new Page<>(2 /* pageNum */, 30 /* pageSize */); mapper.selectPage(page, null); for(UserBean userBean : page.getRecords()) { System.out.println(userBean); } } }
执行上面的代码后,你会发现只查询出了20条数据。这是因为配置分页插件时指定了 MaxLimit。如下:
PaginationInnerInterceptor pageInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); pageInterceptor.setMaxLimit(20L);
我们除了使用 MyBatis Plus 自带的分页方法外,还可以在自定义的 Mapper.xml 文件中使用分页。如下:
(1)配置 MyBatis Plus 扫描你自定义的 mapper xml 文件,如下:
# application.yml mybatis-plus: # 自定义 mapper.xml mapper-locations: classpath*:/mapper/**/*.xml
(2)编写你的 Mapper XML 文件,内容如下:
<?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.hxstrive.mybatis_plus.mapper.MyMapper"> <select id="getUser" resultType="com.hxstrive.mybatis_plus.model.UserBean"> SELECT `user_id`, `name`, `sex`, `age`, `face`, `salary`, `borthday` FROM `user` WHERE `age` >= #{age} </select> </mapper>
(3)定义你自己的 Mapper 接口,代码如下:
package com.hxstrive.mybatis_plus.mapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.hxstrive.mybatis_plus.model.UserBean; import org.apache.ibatis.annotations.Param; import java.util.List; public interface MyMapper { // 其中,IPage<UserBean> 还可以是 IPage<?> List<UserBean> getUser(IPage<UserBean> page, @Param("age") Integer age); }
(4)客户端代码:
package com.hxstrive.mybatis_plus.plugins; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.hxstrive.mybatis_plus.mapper.MyMapper; import com.hxstrive.mybatis_plus.model.UserBean; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest class PluginDemo4 { @Autowired private MyMapper mapper; @Test void contextLoads() { // 如果 page 指定的 pageSize 大于 MaxLimit,则使用 MaxLimit 作为 pageSize Page<UserBean> page = new Page<>(2 /* pageNum */, 30 /* pageSize */); mapper.getUser(page, 18); for(UserBean userBean : page.getRecords()) { System.out.println(userBean); } } }
运行上面代码,自定义的方法也拥有了分页功能。注意:分页插件配置参考本文前面!!!