Skip to content

面试速答(先看这里)

**一句话结论:**MyBatis的RowBounds是一个用于分页查询的简单POJO类,它包含两个属性offset和limit,分别表示分页查询的偏移量和每页查询的数据条数。

60秒标准回答:

MyBatis的RowBounds是一个用于分页查询的简单POJO类,它包含两个属性offset和limit,分别表示分页查询的偏移量和每页查询的数据条数

在使用RowBounds进行逻辑分页的时候,我们的SQL语句中是不需要指定分页参数的。 就正常的查询即可,如

然后,在查询的时候,将RowBounds当做一个参数传递

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**在使用RowBounds进行逻辑分页的时候,我们的SQL语句中是不需要指定分页参数的。
  • **要点2:**然后,在查询的时候,将RowBounds当做一个参数传递:
  • **要点3:**这样,实际上在查询的时候,将会先所有符合条件的记录返回,然后再在内存中进行分页,分页的方式是根据RowBounds中指定的offset和limit进行数据保留,即抛弃掉不需要的数据再返回。

**记忆锚点:**RowBounds → offset → limit → 当做一个参数传递 → MyBatis → POJO

追问准备:

  • 围绕「RowBounds」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「offset」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「limit」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

MyBatis的RowBounds是一个用于分页查询的简单POJO类,它包含两个属性offset和limit,分别表示分页查询的偏移量和每页查询的数据条数。

**在使用RowBounds进行逻辑分页的时候,我们的SQL语句中是不需要指定分页参数的。**就正常的查询即可,如:

plain
<select id="getUsers" resultType="User">
    select * from user
    <where>
        <if test="name != null">
            and name like CONCAT('%',#{name},'%')
        </if>
    </where>
		order by id
</select>

然后,在查询的时候,将RowBounds当做一个参数传递:

plain
int offset = 10; // 偏移量
int limit = 5; // 每页数据条数
RowBounds rowBounds = new RowBounds(offset, limit);
List<User> userList = sqlSession.selectList("getUserList", null, rowBounds);

这样,实际上在查询的时候,将会先所有符合条件的记录返回,然后再在内存中进行分页,分页的方式是根据RowBounds中指定的offset和limit进行数据保留,即抛弃掉不需要的数据再返回。