首页 > 技术文章 > 【Mybatis-Plus学习笔记(三)】分页查询

zllk 2020-11-21 19:01 原文

本系列博客其他文章请点击下方链接查看
【Mybatis-Plus学习笔记】目录

Mybatis分页

Mybatis的RowBounds就可以实现分页,但是这是一种内存分页,他的原理是把符合逻辑的内存全部查出,然后展示需要的数据。如果数据量小的时候,完全可以使用,但是当数据量大的时候,就是对内存的一种浪费。

MP分页插件

MP分页插件可以实现物理分页,不仅更方便,而且消耗的内存资源更少。

如果需要新建一个配置类,如下:

@Configuration
public class MybatisConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

之后就可以使用selectPage方法,传入Page和QueryWrapper进行查询。例子如下:

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //实例化的两个参数分别是当前页和每页数量
        Page<User> page = new Page<>(1, 2);
        IPage<User> ipage = userMapper.selectPage(page, queryWrapper);
        //页数
        System.out.println(ipage.getPages());
        //总数
        System.out.println(ipage.getTotal());
        //获得查询的记录
        List<User> records = ipage.getRecords();
        records.forEach(m-> System.out.println(m));

相当于

''DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user LIMIT ?,? 
''DEBUG==> Parameters: 0(Long), 2(Long)

还有一种分页查询,selectMapsPage(),与上述方法不同的是返回值是一个Map的集合,通过key-value的形式存储值。如何抉择取决于你的需求。

实际上,如果你使用Page,MybatisPlus会默认使用SELECT COUNT(1) FROM user 语句来查找总数量,当你不需要总数量的时候,可以在构造page的时候多加一个Boolean参数,true为查找总数,false相反。如下

        Page<User> page = new Page<>(1, 2,false);

多表分页查询

如果是多表连接查询,上述两种方法,均不可行。但是如果你仍然不想在Sql语句中添加Limit,可以使用Xml文件结合MP分页插件来完成。

首先,声明一个方法,这个方法需要两个参数Page和Wrapper。

 IPage<User> selectUserPage(Page<User> page, @Param(Constants.WRAPPER) Wrapper<User> wrapper);

编写XML

    <select id="selectUserPage" resultType="com.fang.entity.User">
        select *
        from user ${ew.customSqlSegment};
        # 可以添加你想要的连表查询
    </select>

最后,把selectPage换成你自定义的selectUserPage即可。

但是多表查询还是建议自己写SQL,因为大家要知道无论是Mybatis还是MP,他们都只是一个工具,让我们的代码书写起来更加方便,更加优雅。而真正的SQL语句才是本质,如果盲目的追求工具的使用,就有些本末倒置了。所以在这些工具还是不够智能的情况下,建议多表查询的时候还是使用原生SQL比较好。

推荐阅读