【Mybatis-Plus学习笔记(三)】分页查询
本系列博客其他文章请点击下方链接查看
【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比较好。