https://juejin.cn/post/7365741765729632306
今天给大家带来的是一道来自京东的关于 MyBatis 实现分页功能的面试题:MyBatis是如何进行分页的?分页插件的实现原理是什么?
通常,分页的方式可以分为两种:
逻辑(内存)分页指的是数据库返回全部符合条件的数据,然后再通过程序代码对数据结果进行分页处理;物理分页指的是通过 SQL 语句查询,由数据库返回分页后的查询结果。
逻辑(内存)分页和物理分页各有优缺点,物理分页需要频繁的访问数据库,对数据库的负担较重,逻辑(内存)分页在数据量较大时也会对应用程序的性能造成较大的影响。
在 MyBatis 中实现逻辑(内存)分页,需要借助 MyBatis 提供的 RowBounds 对象。我们举个例子,首先定义 Mapper 接口:
List<UserDO> logicalPagination(RowBounds rowBounds);
接着我们来写 MyBatis 映射器中的
<select id="logicalPagination" resultType="com.wyz.entity.UserDO">
select * from user
</select>
可以看到,虽然我们在 Java 的接口中定义了入参 RowBounds,但是在 MyBatis 映射器中并没有使用它。
最后我们来写单元测试代码:
public void testLogicalPagination() {
Reader mysqlReader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(mysqlReader);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
RowBounds rowBounds = new RowBounds(0, 3);
List<UserDO> users = userMapper.logicalPagination(rowBounds);
log.info(JSON.toJSONString(users));
sqlSession.close();
}