注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “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);
}
}
}运行上面代码,自定义的方法也拥有了分页功能。注意:分页插件配置参考本文前面!!!