在MyBatis中进行分页查询的两种方法详解

 更新时间:2025年11月17日 09:23:05   作者:java1234_小锋  
在 MyBatis 中进行分页查询通常有两种方法:一种是通过手动拼接 LIMIT 和 OFFSET,另一种是使用 MyBatis 插件(如 MyBatis-PageHelper)来自动处理分页逻辑,下面分别介绍这两种方法,需要的朋友可以参考下

如何在MyBatis中进行分页查询?

在 MyBatis 中进行分页查询通常有两种方法:一种是通过手动拼接 LIMITOFFSET,另一种是使用 MyBatis 插件(如 MyBatis-PageHelper)来自动处理分页逻辑。下面分别介绍这两种方法。

1.手动实现分页查询

手动分页查询需要在 SQL 语句中使用数据库支持的分页语法,如 LIMIT(MySQL、PostgreSQL)或 ROWNUM(Oracle)等。你可以通过传递 offset(起始行)和 limit(每页的条目数)来实现分页。

1.1 修改 Mapper XML 文件

在 XML 文件中,通常通过传递 offsetlimit 参数来构造分页查询 SQL。

Mapper 接口:

public interface UserMapper {
    List<User> selectUsersByPage(@Param("offset") int offset, @Param("limit") int limit);
}

Mapper XML 文件:

<mapper namespace="com.example.UserMapper">
    <select id="selectUsersByPage" resultType="com.example.User">
        SELECT * FROM users
        LIMIT #{limit} OFFSET #{offset}
    </select>
</mapper>

1.2 计算offset

通常,offset 的计算方式是 (currentPage - 1) * pageSize,其中:

  • currentPage 是当前页码(从 1 开始)。
  • pageSize 是每页显示的记录数。

调用分页查询:

int currentPage = 1; // 当前页
int pageSize = 10;   // 每页的条数
int offset = (currentPage - 1) * pageSize;

List<User> users = userMapper.selectUsersByPage(offset, pageSize);

2.使用 MyBatis 插件(如 PageHelper)进行分页

如果你不想手动编写分页逻辑,可以使用第三方分页插件,如 PageHelper,它可以自动处理分页,简化分页操作。

2.1 引入 PageHelper 插件

pom.xml 中添加 PageHelper 的依赖。

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.2.0</version> <!-- 确保使用最新版本 -->
</dependency>

2.2 配置 PageHelper 插件

在 MyBatis 的配置文件 mybatis-config.xml 中配置 PageHelper 插件。

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <property name="helperDialect" value="mysql"/> <!-- 针对 MySQL -->
        <property name="reasonable" value="true"/>
        <property name="supportMethodsArguments" value="true"/>
    </plugin>
</plugins>

2.3 使用 PageHelper 进行分页查询

PageHelper 插件通过 PageHelper.startPage(pageNum, pageSize) 来启用分页。分页的实际 SQL 会在查询时动态生成。

Mapper 接口:

public interface UserMapper {
    List<User> selectAllUsers();
}

调用分页查询:

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

int currentPage = 1;  // 当前页
int pageSize = 10;    // 每页记录数

// 启动分页
PageHelper.startPage(currentPage, pageSize);

// 执行查询
List<User> users = userMapper.selectAllUsers();

// 获取分页信息
PageInfo<User> pageInfo = new PageInfo<>(users);
System.out.println("Total pages: " + pageInfo.getPages());
System.out.println("Total records: " + pageInfo.getTotal());

返回分页信息:

  • pageInfo.getTotal() 获取总记录数。
  • pageInfo.getPages() 获取总页数。
  • pageInfo.getList() 获取当前页的数据。

总结

  • 手动分页:适用于简单的分页需求,你需要手动计算 offset 和 limit,并在 SQL 中使用适当的分页语法。
  • PageHelper 插件:适用于复杂分页查询,通过自动生成分页的 SQL,简化了分页的配置和调用。它支持多种数据库(MySQL、Oracle、PostgreSQL 等)和复杂的查询场景。

如果你的项目中经常需要分页查询,推荐使用 PageHelper 插件,因为它能自动处理很多复杂的分页逻辑,减少了代码量。

到此这篇关于在MyBatis中进行分页查询的两种方法详解的文章就介绍到这了,更多相关MyBatis进行分页查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot多文件上传代码实例及解析

    springboot多文件上传代码实例及解析

    这篇文章主要介绍了springboot多文件上传代码实例及解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringMvc根据返回值类型不同处理响应的方法

    SpringMvc根据返回值类型不同处理响应的方法

    这篇文章主要介绍了SpringMvc根据返回值类型不同处理响应,我们可以通过控制器方法的返回值设置跳转的视图,控制器支持如void,String,ModelAndView类型,需要的朋友可以参考下
    2023-09-09
  • Java从控制台接受输入字符的简单方法

    Java从控制台接受输入字符的简单方法

    这篇文章主要介绍了Java从控制台接受输入字符的简单方法,需要的朋友可以参考下
    2014-02-02
  • 浅谈@RequestParam(required = true)的误区

    浅谈@RequestParam(required = true)的误区

    这篇文章主要介绍了@RequestParam(required = true)的误区,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java Scanner 类的使用小结

    Java Scanner 类的使用小结

    在笔试编程过程中,关于数据的读取如果迷迷糊糊,那后来的编程即使想法很对,实现很好,也是徒劳,于是在这里认真总结了Java Scanner 类的使用,需要的朋友可以参考下
    2018-10-10
  • Java中的数组复制(clone与arraycopy)代码详解

    Java中的数组复制(clone与arraycopy)代码详解

    这篇文章主要介绍了Java中的数组复制(clone与arraycopy)代码详解,本文并未全部介绍数组复制的几种方式,仅对clone和copy的相关内容进行了解析,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java如何取掉json数据中值为null的属性字段

    Java如何取掉json数据中值为null的属性字段

    这篇文章主要介绍了Java如何取掉json数据中值为null的属性字段,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • java日期相关类实例详解

    java日期相关类实例详解

    这篇文章主要介绍了java日期相关类实例详解,小编觉得还是挺不错的,这里分享给大家,供需要的朋友参考。
    2017-10-10
  • Java之String类常用操作方法举例

    Java之String类常用操作方法举例

    这篇文章主要介绍了Java之String类常用操作方法的相关资料,包括了Java中String类的各个方面,包括String类的声明、内部属性、不可变性、实例化方式、拼接、构造器、相互转换方法以及常用方法,需要的朋友可以参考下
    2025-03-03
  • MyBatis 原生二级缓存"难以修复"的原因解析及解决方案

    MyBatis 原生二级缓存"难以修复"的原因解析及解决方案

    文章主要讨论了MyBatis原生二级缓存存在的问题,包括结构性缺陷、难以修复等,社区提供了多种增强插件方案,但这些方案也有各自的优缺点,本文结合实例代码介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-12-12

最新评论