SpringBoot 集成 MybatisPlus 四——分页查询

2023-11-01 22:30:18 浏览数 (2)

0 插入数据

因之前删除了部分数据,要体现分页查询的效果,最好添加一些数据。

1 增加插件

在项目中创建一个配置类,在其中增加 MybatisPlus 中用于分页查询的插件,并引入相关类。

因为不同的数据库,用于分页的关键字也有差异,所以需要指定数据库类型:DbType.MYSQL

需要在类及方法上添加注解,否则不会被 SpringBoot 扫描到。

类名上添加注解 @Configuration,方法上添加注解 @Bean

代码语言:java复制
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConfigureUtil {

    //配置分页插件
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

2 执行查询

2.1 selectPage() 方法查询

在执行查询时,可以调用 selectPage() 方法,该方法中需要使用 Page 对象及 QueryWrapper 对象。

在 Page 对象中,可以指定分页查询时的当前页号、每页条数等信息。如果当前页号是0或者1时,查询的结果都是第1页的内容。

在 QueryWrapper 对象中,可以指定查询条件,这个和普通查询是一样的用法。

例如:查询所有用户中 remark 内容包含 “老师” 的记录:

代码语言:java复制
//分页查询
@Test
public void selectUserByPage(){
    Page<User> page = new Page<>(2, 2);
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.like("remark", "老师");
    IPage<User> iPage = userMapper.selectPage(page, wrapper);
    //总页数
    System.out.println(iPage.getPages());
    //总条数
    System.out.println(iPage.getTotal());
    //每页条数
    System.out.println(iPage.getSize());
    //当前页的结果集
    System.out.println(iPage.getRecords());
    //当前页号
    System.out.println(iPage.getCurrent());
}

在控制台中可以看到,实际执行了两次查询:

第一次是查询的总条数;

第二次是使用了 limit 关键字进行分页查询。

==> Preparing: SELECT COUNT(*) AS total FROM user WHERE (remark LIKE ?)

==> Parameters: %老师%(String)

<== Columns: total

<== Row: 5

<== Total: 1

==> Preparing: SELECT id,username,gendar,remark FROM user WHERE (remark LIKE ?) LIMIT ?,?

==> Parameters: %老师%(String), 2(Long), 2(Long)

<== Columns: id, username, gendar, remark

<== Row: 10, 张三, 女, 体育老师

<== Row: 11, 刘能, 男, 演讲老师

<== Total: 2

结果输出:

3

5

2

User{id=10, username='张三', gendar='女', remark='体育老师'}, User{id=11, username='刘能', gendar='男', remark='演讲老师'}

2

2.2 selectMapsPage() 方法查询

查询时,调用了 selectMapsPage() 方法,该方法中仍然需要使用 Page 对象及 QueryWrapper 对象。

selectPage() 方法不同的是,这里的 Page 对象必须是 Page<Map<String , Object>>,泛型必须是 Map<String , Object>。QueryWrapper 对象的使用没有差别。

查询的结果也同样是一个 IPage<Map<String, Object>> 泛型类型的对象。

代码语言:java复制
//分页查询
@Test
public void selectUserByPage2(){
    Page<Map<String , Object>> mapPage = new Page<>(2 , 2 );
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.like("remark", "老师");
    IPage<Map<String, Object>> iPage = userMapper.selectMapsPage(mapPage, wrapper);
    //总页数
    System.out.println("总页数: "   iPage.getPages());
    //总条数
    System.out.println("总条数: "   iPage.getTotal());
    //每页条数
    System.out.println("每页条数: "   iPage.getSize());
    //当前页的结果集
    System.out.println("当前页的结果集: "   iPage.getRecords());
    //当前页号
    System.out.println("当前页号: "   iPage.getCurrent());
}

控制台输出可以看到,该方法同样进行了两次查询:

==> Preparing: SELECT COUNT(*) AS total FROM user WHERE (remark LIKE ?)

==> Parameters: %老师%(String)

<== Columns: total

<== Row: 5

<== Total: 1

==> Preparing: SELECT id,username,gendar,remark FROM user WHERE (remark LIKE ?) LIMIT ?,?

==> Parameters: %老师%(String), 2(Long), 2(Long)

<== Columns: id, username, gendar, remark

<== Row: 10, 张三, 女, 体育老师

<== Row: 11, 刘能, 男, 演讲老师

<== Total: 2

结果输出:

总页数: 3

总条数: 5

每页条数: 2

当前页的结果集: {gendar=女, remark=体育老师, id=10, username=张三}, {gendar=男, remark=演讲老师, id=11, username=刘能}

当前页号: 2

与第一种查询结果集不同,因为得到的是Map,因此结果集中字段的位置并不固定。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞