分页

注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “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 分页插件还提供了如下几个属性:

overflow

溢出总页数后是否进行处理,默认不处理。参见插件 continuePage 方法

maxLimit

单页分页条数限制,默认无限制。参见插件 handlerLimit 方法

dbType

数据库类型(可取值见 DbType 枚举类型),根据类型获取应使用的分页方言。参见插件 findIDialect 方法

dialect

方言实现类,需要实现 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);
        }
    }

}

运行上面代码,自定义的方法也拥有了分页功能。注意:分页插件配置参考本文前面!!!


说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号