MybatisPlus:分页查询

  1. 分页插件
    1. 引入依赖
    2. 配置分页插件
    3. 使用
  2. xml自定义分页
    1. Mapper中定义接口方法
    2. xml中编写SQL
    3. 测试

分页插件

引入依赖

v3.5.9 起,PaginationInnerInterceptor 已分离出来。如需使用,则需单独引入 mybatis-plus-jsqlparser 依赖

参考文档

<!--     引入分页插件   -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-jsqlparser-4.9</artifactId>
</dependency>

<dependencyManagement>
    <dependencies>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-bom</artifactId>
        <version>3.5.9</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    </dependencies>
</dependencyManagement>

这里需要使用 maven bom 管理依赖,减少版本冲突。 因为 jsqlparser 5.0+ 版本不再支持 jdk8 针对这个问题解耦 jsqlparser 依赖。 正确打开姿势,引入 mybatis-plus-bom 模块,然后引入 ..starter..jsqlparser.. 依赖

配置分页插件

在 Spring Boot 项目中,可以通过 Java 配置来添加分页插件:

@Configuration
@MapperScan("com.lin.mymybatisplusdemo.mapper") //可以将主类中的注解移到此处
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        // MybatisPlusInterceptor : mybatis-plus 的拦截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加内部拦截器 : // 如果配置多个插件, 切记分页最后添加
        // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

使用

@Test
public void testPage(){
    //设置分页参数
    Page<User> page = new Page<>(2, 5);
    //执行两条:
    // 1- Preparing: SELECT COUNT(*) AS total FROM t_user
    // 2- Preparing: SELECT uid AS id,name AS username,age,email,is_deleted FROM t_user LIMIT ?,?
    userMapper.selectPage(page, null);
    //获取分页数据
    List<User> list = page.getRecords();
    list.forEach(System.out::println);
    System.out.println("当前页:"+page.getCurrent());
    System.out.println("每页显示的条数:"+page.getSize());
    System.out.println("总记录数:"+page.getTotal());
    System.out.println("总页数:"+page.getPages());
    System.out.println("是否有上一页:"+page.hasPrevious());
    System.out.println("是否有下一页:"+page.hasNext());
}

xml自定义分页

Mapper中定义接口方法

public interface UserMapper extends BaseMapper<User> {

    /**
     * 根据年龄查询用户列表,分页显示
     * @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位
     * @param age 年龄
     * @return
     */
    IPage<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);

}

Page 类实现了 IPage 类,实现了简单分页模型。如果需要实现自己的分页模型,可以继承 Page 类或实现 IPage 类。

public class Page<T> implements IPage<T> 

xml中编写SQL

<?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.lin.mymybatisplusdemo.mapper.UserMapper">
    <!--SQL片段,记录基础字段-->
    <sql id="BaseColumns">uid,name,age,email</sql>
    <!--IPage<User> selectPageVo(Page<User> page, Integer age);-->
    <select id="selectPageVo" resultType="com.lin.mymybatisplusdemo.pojo.User">
        SELECT <include refid="BaseColumns"></include> FROM t_user WHERE age > #{age}
    </select>
</mapper>

测试

@Test
public void testSelectPageVo(){
    //设置分页参数
    Page<User> page = new Page<>(2, 5);
    // ==>  Preparing: SELECT COUNT(*) AS total FROM t_user WHERE age > ?
    //==> Parameters: 20(Integer)
    // ==>  Preparing: SELECT uid,name,age,email FROM t_user WHERE age > ? LIMIT ?,?
    //==> Parameters: 20(Integer), 5(Long), 5(Long)
    userMapper.selectPageVo(page, 20);
    //获取分页数据
    List<User> list = page.getRecords();
    list.forEach(System.out::println);
    System.out.println("当前页:"+page.getCurrent());
    System.out.println("每页显示的条数:"+page.getSize());
    System.out.println("总记录数:"+page.getTotal());
    System.out.println("总页数:"+page.getPages());
    System.out.println("是否有上一页:"+page.hasPrevious());
    System.out.println("是否有下一页:"+page.hasNext());
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com

×

喜欢就点赞,疼爱就打赏