Mybatis是如何进行分页的?

大家好,我是锋哥。今天分享关于【Mybatis是如何进行分页的?**】面试题。**希望对大家有帮助;

Mybatis是如何进行分页的?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

MyBatis 实现分页的方式有很多种,最常见的方法是通过 SQL 查询语句中的 LIMITOFFSET,或者通过使用分页插件来简化开发。以下是 MyBatis 中实现分页的几种常见方式:

1. 手动编写分页 SQL

在 MyBatis 中,最直接的分页方式是手动在查询的 SQL 语句中加入分页的 LIMITOFFSET(针对 MySQL)或 ROWNUM(针对 Oracle)等分页关键字。

示例:MySQL 分页

假设我们有一个用户表 users,可以通过如下 SQL 语句进行分页查询:

复制代码
<select id="selectUsers" resultType="User">
    SELECT * FROM users
    LIMIT #{offset}, #{limit}
</select>
  • #{offset} 表示查询的起始位置,通常是 (页数 - 1) * 每页记录数
  • #{limit} 表示每页的记录数。

调用时,传入分页参数,例如:

复制代码
int offset = (pageNum - 1) * pageSize;
List<User> users = sqlSession.selectList("selectUsers", Map.of("offset", offset, "limit", pageSize));
示例:Oracle 分页

对于 Oracle 数据库,分页通常通过 ROWNUMROW_NUMBER() 来实现:

复制代码
<select id="selectUsers" resultType="User">
    SELECT * FROM (
        SELECT a.*, ROWNUM rnum FROM users a 
        WHERE ROWNUM <= #{end}
    ) WHERE rnum > #{start}
</select>

调用时,传入分页参数,例如:

复制代码
int start = (pageNum - 1) * pageSize;
int end = pageNum * pageSize;
List<User> users = sqlSession.selectList("selectUsers", Map.of("start", start, "end", end));

这种方法的缺点是每次都需要手动编写分页逻辑,且与数据库的分页语法紧密耦合。

2. 使用 MyBatis 分页插件

为了简化分页的实现,可以使用第三方分页插件。常见的 MyBatis 分页插件有 PageHelperMyBatis-Plus

使用 PageHelper 插件

PageHelper 是一个非常流行的 MyBatis 分页插件,它通过拦截 SQL 查询并动态生成分页 SQL 语句来实现分页功能。

  1. 添加依赖 : 如果使用 Maven,可以在 pom.xml 文件中添加 PageHelper 依赖:

    复制代码
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.2.0</version>
    </dependency>
  2. 配置 PageHelper : 在 MyBatis 配置文件中配置 PageHelper 插件:

    复制代码
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <property name="helperDialect" value="mysql" />
            <property name="reasonable" value="true" />
        </plugin>
    </plugins>
  3. 分页查询 : 在调用分页查询时,直接使用 PageHelper.startPage() 方法来设置分页参数:

    复制代码
    PageHelper.startPage(pageNum, pageSize);
    List<User> users = userMapper.selectUsers(); // 这里的 selectUsers 是查询方法
    PageInfo<User> pageInfo = new PageInfo<>(users);

    PageHelper.startPage(pageNum, pageSize) 会在执行查询之前拦截 SQL 并修改其为分页查询,返回的结果会自动封装成 PageInfo 对象,里面包含了分页信息(总页数、总记录数等)。

使用 MyBatis-Plus 插件

MyBatis-Plus 是另一个流行的 MyBatis 扩展库,它也提供了简单易用的分页功能。

  1. 添加依赖 : 如果使用 Maven,可以在 pom.xml 文件中添加 MyBatis-Plus 依赖:

    复制代码
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.0</version>
    </dependency>
  2. 分页查询 : 使用 MyBatis-Plus 提供的 Page 类来进行分页查询:

    复制代码
    Page<User> page = new Page<>(pageNum, pageSize);
    IPage<User> usersPage = userMapper.selectPage(page, null); // 第二个参数为查询条件
    List<User> users = usersPage.getRecords(); // 获取分页结果
    long total = usersPage.getTotal(); // 获取总记录数

    MyBatis-Plus 会自动处理分页逻辑,不需要手动编写分页 SQL,且支持多种数据库。

总结

MyBatis 中分页通常有以下几种方式:

  1. 手动编写 SQL:适合简单场景,但需要针对不同的数据库写不同的 SQL。
  2. 使用分页插件(如 PageHelper 或 MyBatis-Plus):插件方式更简洁,能够自动处理分页逻辑,减少开发工作量。

通常情况下,使用分页插件会更加方便和高效,特别是当项目需求中涉及到多种数据库或复杂的查询逻辑时。

相关推荐
fouryears_234173 分钟前
什么是JSON,如何与Java对象转化
java·spring boot·spring·json
go54631584653 分钟前
Python点阵字生成与优化:从基础实现到高级渲染技术
开发语言·人工智能·python·深度学习·分类·数据挖掘
猫头虎8 分钟前
2025年02月11日 Go生态洞察:Go 1.24 发布亮点全面剖析
开发语言·后端·python·golang·go·beego·go1.19
CHEN5_0217 分钟前
【RocketMQ】一分钟了解RocketMQ
java·rocketmq·java-rocketmq
仰望天空—永强20 分钟前
PS 2025【七月最新v26.5】PS铺软件安装|最新版|附带安装文件|详细安装说明|附PS插件
开发语言·图像处理·python·图形渲染·photoshop
寒士obj23 分钟前
JVM 内存结构
java·开发语言·jvm
MediaTea32 分钟前
Python 库手册:xmlrpc.client 与 xmlrpc.server 模块
开发语言·python
悦悦子a啊34 分钟前
Python之--字典
开发语言·python·学习
带刺的坐椅1 小时前
Solon 整合 LiteFlow 规则引擎:概念与实战
java·solon·liteflow
wuk9981 小时前
互联网应用主流框架整合 Spring Boot开发
java·spring boot·后端