✅使用MyBatis如何实现分页?
典型回答
MyBatis中可以通过两种方式来实现分页:基于物理分页和基于逻辑分页。
所谓物理分页,指的是最终执行的SQL中进行分页,即SQL语句中带limit,这样SQL语句执行之后返回的内容就是分页后的结果。
所谓逻辑分页,就是在SQL语句中不进行分页,照常全部查询,在查询到的结果集中,再进行分页。
在MyBatis中,想要实现分页通常有四种做法:
1、在SQL中添加limit语句:
<select id="getUsers" resultType="User">
select * from user
<where>
<if test="name != null">
and name like CONCAT('%',#{name},'%')
</if>
</where>
limit #{offset}, #{limit}
</select>2、基于PageHelper分页插件,实现分页:
在使用PageHelper时,只需要在查询语句前调用PageHelper.startPage()方法,然后再进行查询操作。PageHelper会自动将查询结果封装到一个PageInfo对象中,包含了分页信息和查询结果。
// Java代码中使用 PageHelper
PageHelper.startPage(1, 10);
List<User> userList = userMapper.getUsers();
PageInfo<User> pageInfo = new PageInfo<>(userList);使用PageHelper时,不需要在mapper.xml文件中使用limit语句。
3、基于RowBounds实现分页
RowBounds是MyBatis中提供的一个分页查询工具,其中可以设置offset和limit用于分页。
int offset = 10; // 偏移量
int limit = 5; // 每页数据条数
RowBounds rowBounds = new RowBounds(offset, limit);
List<User> userList = sqlSession.selectList("getUsers", null, rowBounds);4、基于**MyBatis-Plus实现分页**
MyBatis-Plus中提供了分页插件,可实现简单易用的分页功能,可以根据传入的分页参数自动计算出分页信息,无需手动编写分页SQL语句。
public interface UserMapper extends BaseMapper<User> {
List<User> selectUserPage(Page<User> page, @Param("name") String name);
}以上四种做法中,能实现逻辑分页的是RowBounds和**MyBatis-Plus,能实现物理分页的是手动添加limit、PageHelper以及MyBatis-Plus**
物理分页和逻辑分页,工作中推荐使用那种分页呢?
数据小的话无所谓,逻辑分页更简单点,数据量大的话,一定是物理分页,避免查询慢,也避免内存被撑爆、