MybatisPlus分页方式

33 阅读2分钟

执行查询

通过page方法分页

 baseService.page(new Page<>(current, size), queryWrapper);
public IPage<Entity> pageSelectByCondition(int current, int size, Entity entity) {
    return baseService.page(new Page<>(current, size),
            Wrappers.<Entity>lambdaQuery()
                    .setEntity(entity)
    );

2.1 selectPage() 方法查询

IPage iPage = userMapper.selectPage(page, wrapper);

在执行查询时,可以调用 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,因此结果集中字段的位置并不固定。