Mybatis-plus分页插件PageHelper的两种不同使用方式

最近在写需求的过程中接触到许多的分页,但是对于不同情况下会有不同的分页方法选择,由于目前使用得比较多的是mybatis-plus里面的分页插件,因此通过本文详细了解一下pageHelper的使用。

分页最终都是在sql中通过limit完成,limit offset,pageSize

PageHelper.startPage

功能特点:

PageHelper.startPage 是 PageHelper 提供的最常用的分页方法。它通过拦截器的方式,在 SQL 查询前自动执行分页操作,生成分页的 SQL 语句,包括查询总数和查询指定页码的数据。并将分页查询的信息存储在 PageInfo 对象中,包括总记录数、总页数、当前页码等信息。

使用方法:

PageHelper.startPage(pageNum, pageSize); // 执行查询操作
List<User> userList= userMapper.selectUsers(); 
PageInfo<User> pageInfo = new PageInfo<>(userList);
优点:
  • 简单易用,使用起来方便快捷。
  • PageInfo 对象提供了丰富的分页信息,方便对分页结果进行操作和展示。
缺点:
  • 需要查询总数,可能在处理大数据量时影响查询性能。
  • 对于大数据量,如果只需要当前页数据而不关心总数,会浪费查询时间。

PageMethod.offsetPage

功能特点:

PageMethod.offsetPage 是 PageHelper 提供的另一种分页方式。它通过在查询方法中手动指定偏移量和每页条数来实现分页,不进行总数查询,因此适合处理大数据量的分页查询。

使用方法:

 PageMethod.offsetPage(offset, pageSize, false);
// 执行查询操作
List<User> userList = userMapper.selectUsers();
优点:

避免了查询总数,性能较好,适合于大数据量的分页查询。
灵活性较高,可以手动控制偏移量和每页条数。

缺点:

可能出现数据重复或丢失的情况,因为为了判断是否有下一页,会查询额外的一条记录。
使用上需要手动处理分页逻辑,不像 PageHelper.startPage 那样直观和方便。

PageMethod.offsetPage是否有下一页的优化:

当使用 PageMethod.offsetPage 方法进行分页查询时,通常会额外获取比当前页码所需的数据多一条(pageSize + 1)。这是为了判断是否存在下一页数据,因为如果获取的结果等于 pageSize + 1,则说明还有下一页数据存在。在此过程中,需要进行判断并处理是否有下一页数据以及获取当前页的数据。

下面是一个示例,演示了使用 PageMethod.offsetPage 方法进行分页查询后,判断是否存在下一页数据并获取当前页数据的处理方式:

PageMethod.offsetPage((pageNum - 1) * pageSize, pageSize + 1, false);
// 执行查询操作
List<User> userList = userMapper.selectUsers();

boolean hasNextPage = userList.size() > pageSize; // 判断是否有下一页数据

List<User> currentPageData;
if (hasNextPage) {
    // 如果存在下一页数据,需要去掉多余的那条数据
    currentPageData = userList.subList(0, pageSize);
} else {
    currentPageData = userList;
}

// 处理当前页数据
// ...

// 返回结果或其他操作
// ...

在这个例子中,首先使用 PageMethod.offsetPage 方法进行分页查询,查询结果存储在 userList 中。接着,根据 userList 的大小与预期的 pageSize 进行比较,判断是否有下一页数据,并根据情况截取获取当前页的数据。

如果 userList 的大小大于 pageSize,说明存在下一页数据,因此需要将多出来的那条数据去掉(subList(0, pageSize)),得到当前页的数据。否则,userList 的大小等于或小于 pageSize,表示没有下一页数据,直接将 userList 作为当前页数据即可。

最后,对当前页数据进行处理,比如展示、返回给前端或进行其他操作。这种方式可以处理 PageMethod.offsetPage 方法获取的分页数据,确保获取当前页数据的正确性,并判断是否有下一页数据。

选择使用哪种方式,需要根据具体场景需求和性能要求来决定。PageHelper.startPage
对于普通分页查询和对总数有要求的场景比较适用,而 PageMethod.offsetPage 则适合于大数据量分页且不要求总数查询的情况。

  • 20
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Mybatis-Plus分页插件是一个基于Mybatis分页插件,可以方便地实现分页查询功能。使用该插件,只需要在Mapper接口中定义一个继承BaseMapper的接口,并在方法中使用Page对象进行分页查询即可。 具体使用步骤如下: 1. 引入Mybatis-Plus分页插件依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> ``` 2. 定义Mapper接口 在Mapper接口中继承BaseMapper,并定义一个方法,使用Page对象进行分页查询。例如: ``` public interface UserMapper extends BaseMapper<User> { List<User> selectUserPage(Page<User> page, @Param("name") String name); } ``` 3. 在Service中调用Mapper方法 在Service中调用Mapper方法,传入Page对象和查询条件,例如: ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public IPage<User> getUserPage(Page<User> page, String name) { return userMapper.selectUserPage(page, name); } } ``` 4. 在Controller中调用Service方法 在Controller中调用Service方法,传入Page对象和查询条件,例如: ``` @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/page") public IPage<User> getUserPage(Page<User> page, String name) { return userService.getUserPage(page, name); } } ``` 以上就是Mybatis-Plus分页插件使用步骤。通过使用该插件,可以方便地实现分页查询功能,提高开发效率。 ### 回答2: Mybatis-Plus是一个基于Mybatis的增强工具,为了提高开发效率和减少重复的CRUD操作而生。其中,Mybatis-Plus分页插件是其重要的功能之一,可以帮助开发人员快速的实现数据的分页查询。 Mybatis-Plus分页插件使用非常简单,开发人员只需要在Mybatis-Plus的配置文件中进行一些简单的配置即可。以下是为您提供的Mybatis-Plus分页插件使用方法: 1.引入依赖:首先我们需要在项目中引入自己构建的mybatis-plus-boot-starter,或者直接在pom.xml中引入Mybatis-Plus对应版本的依赖。 2.配置分页插件:在mybatis-plus.yml中配置分页插件,如下所示: mybatis-plus: # 配置分页插件 configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 配置 Mybatis-Plus 分页插件 plugins: - interceptor: class: com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor 3.配置分页查询:在Mapper接口方法中添加分页参数,在Mapper.xml文件中添加分页查询的具体SQL语句,如下所示: //mapper 接口 public interface YourMapper extends BaseMapper<YourEntity> { IPage<YourEntity> selectPageVo(Page page, @Param("yourEntity") YourEntity yourEntity); } <!-- Mapper.xml --> <select id="selectPageVo" resultType="YourEntityVo"> select {yourEntity.*} from your_entity {yourEntity} where 1=1 <if test="yourEntity.name != null and yourEntity.name!=''"> and yourEntity.name like '%${yourEntity.name}%' </if> </select> 4.使用分页查询:在Service层中使用分页查询,如下所示: @Override public IPage<YourEntity> selectPageVo(Page<YourEntity> page, YourEntity yourEntity) { return this.getBaseMapper().selectPageVo(page, yourEntity); } 使用Mybatis-Plus分页插件,不仅可以实现简单的分页查询,而且还可以自定义查询条件、排序方式等。总之,这是一个非常方便和实用的插件,可以让开发人员更快地进行数据操作和维护。 ### 回答3: Mybatis-plus 是一款基于 Mybatis 的增强工具包,它提供了很多的快捷操作,其中就包括分页插件使用 Mybatis-plus 分页插件可以简化分页操作,提高代码的可读性和可维护性。 使用分页插件,需要先引入 Mybatis-plus 的依赖包。在 Spring Boot 中,可以通过 Gradle 或 Maven 的方式引入 Mybatis-plus 相关依赖,例如: ``` groovy dependencies { implementation 'com.baomidou:mybatis-plus-boot-starter:3.4.2' } ``` 在配置文件中加入分页插件配置: ``` yml mybatis-plus: page-params: limit: 10 # 每页显示条数 max-limit: 100 # 最大显示条数 overflow: false # 是否溢出 ``` 其中,`limit` 表示每页显示的条数,`max-limit` 表示最大显示的条数,`overflow` 表示是否允许溢出。 在 Mybatis-plus 的 Mapper 接口中定义查询方法时,需要加入 `IPage` 类型的参数,例如: ``` java import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; public interface UserMapper extends BaseMapper<User> { IPage<User> selectPageVo(Page<?> page, UserVo userVo); } ``` 其中,`Page` 类是 Mybatis-plus 中提供的分页对象,`User` 是实体类,`UserVo` 是查询参数,`selectPageVo` 方法就是查询分页方法。 在 Service 层中调用 Mapper 中定义的分页方法: ``` java @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public IPage<User> selectPageVo(UserVo userVo) { Page<User> page = new Page<>(); page.setCurrent(userVo.getCurrentPage()); page.setSize(userVo.getPageSize()); return baseMapper.selectPageVo(page, userVo); } } ``` 在上面的示例中,`Page` 对象中设置了分页参数,`baseMapper` 是继承自 `BaseServiceImpl` 的默认的 Mapper 对象,`selectPageVo` 方法返回分页查询结果。 最后,在 Controller 中调用 Service 方法: ``` java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/page") public IPage<User> selectPageVo(UserVo userVo) { return userService.selectPageVo(userVo); } } ``` 在上面的示例中,`selectPageVo` 方法返回的就是分页查询结果。在前端展示时,可以通过获取到的 `IPage` 对象获取分页信息和查询结果,例如: ```javascript axios.get('/users/page', { params: { currentPage: 1, pageSize: 10, username: 'Tom' } }).then(res => { // 获取分页信息和查询结果 const { current, total, records } = res.data; // ... }); ``` 通过 Mybatis-plus分页插件,我们不仅可以简化分页操作,还可以通过配置实现一些高级功能,例如性能优化和多租户分页。因此,Mybatis-plus分页插件是一个非常实用的工具,值得推荐使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酱学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值