首页
专栏
java
文章详情
0
MyBatis-Plus 分页查询以及自定义sql分页
老炮说Java发布于 今天 14:13
欢迎微信搜索公众号【java版web项目】获取资源:java学习视频/设计模式笔记/算法手册/java项目
一、引言
分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页。
物理分页:相当于执行了limit分页语句,返回部分数据。物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性比较强,一般适用于数据量比较大,数据更新比较频繁的场景。
逻辑分页:一次性把全部的数据取出来,通过程序进行筛选数据。如果数据量大的情况下会消耗大量的内存,由于逻辑分页只需要读取数据库一次,不能获取数据库最新状态,实施性比较差,适用于数据量小,数据稳定的场合。
那么MP中的物理分页怎么实现呢? 往下看往下看
二、配置
创建MybatisPlusConfig配置类,需要配置分页插件,小编使用的Spring boot配置方式。
/**
* @Auther: IT贱男
* @Date: 2019/6/12 15:06
* @Description: MybatisPlus配置类
*/
@Configuration
public class MyBatisPlusConfig {
/**
* 分页插件
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
三、具体分页实现
MP的Wrapper提供了两种分页查询的方式,源码如下:
/**
* 根据 entity 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件(可以为 RowBounds.DEFAULT)
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件
* @param queryWrapper 实体对象封装操作类
*/
IPage> selectMapsPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
可见两个分页方法参数都是一致的,只是返回参数略有不同,具体选择根据实际业务为准。
/**
* 分页查询
*/
@Test
public void selectByPage() {
QueryWrapper wrapper = new QueryWrapper();
wrapper.like("name", "雨").lt("age", 40);
Page page = new Page<>(1,2);
//IPage userIPage = userMapper.selectPage(page, wrapper);
IPage> mapIPage = userMapper.selectMapsPage(page, wrapper);
System.out.println("总页数"+mapIPage.getPages());
System.out.println("总记录数"+mapIPage.getTotal());
List> records = mapIPage.getRecords();
records.forEach(System.out::println);
}
以上分页查询执行sql如下,先是查询了一次总记录数,然后在查询的数据。
DEBUG==> Preparing: SELECT COUNT(1) FROM user WHERE name LIKE ? AND age < ?
DEBUG==> Parameters: %雨%(String), 40(Integer)
TRACE<== Columns: COUNT(1)
TRACE<== Row: 2
DEBUG==> Preparing: SELECT id,name,age,email,manager_id,create_time