在 MyBatis 中实现分页查询,主要有以下几种方法:
1. 使用 MyBatis 分页插件:
MyBatis 有一个非常流行的分页插件叫做 PageHelper
。它允许你通过简单的配置就能实现分页查询。使用 PageHelper
,你只需要在你的 Mapper
接口的方法上添加 @Select
注解,然后在方法调用前使用 PageHelper
的 startPage
方法即可。
例如:
java
// 在 Mapper 接口中的方法
@Select("SELECT * FROM tb_phones WHERE category_id = #{categoryId}")
List<Phone> selectPhonesByCategory(@Param("categoryId") int categoryId);
然后在服务层代码中:
java
PageHelper.startPage(1, 10); // 当前页码和每页显示的记录数
List<Phone> phones = phoneMapper.selectPhonesByCategory(1);
PageInfo<Phone> pageInfo = new PageInfo<>(phones);
PageInfo
是 PageHelper
提供的一个辅助类,它包含了分页信息,如当前页码、每页记录数、总记录数等。
2. 使用 MyBatis 的 RowBounds
参数:
MyBatis 提供了一个 RowBounds
对象,你可以在调用 Mapper
方法时传入 RowBounds
来实现分页。这种方法比较简单,但它的性能不如使用分页插件,因为它会查询出所有的记录然后进行截取。
java
// 在服务层代码中
RowBounds rowBounds = new RowBounds(0, 10); // 从第一条记录开始,获取10条记录
List<Phone> phones = phoneMapper.selectPhonesByCategory(1, rowBounds);
3. 自定义分页 SQL:
如果你不想使用任何现成的分页插件,你也可以自己编写分页的 SQL 语句。在 MyBatis 中,你可以直接在 Mapper
XML 文件中编写完整的分页 SQL,例如使用 LIMIT
和 OFFSET
或者其他数据库特有的分页语法。
例如,对于 MySQL:
xml
<select id="selectPhonesByCategory" resultType="Phone">
SELECT * FROM tb_phones WHERE category_id = #{categoryId} LIMIT #{limit} OFFSET #{offset}
</select>
然后在你的服务层代码中,传入 limit
和 offset
参数。
4. 使用 MyBatis Plus:
MyBatis Plus 是 MyBatis 的增强工具,在 MyBatis Plus 中,你可以使用其提供的分页功能,通过配置 Page
对象来实现分页查询。
java
Page<Phone> page = new Page<>(currentPage, pageSize);
page.setRecords(phoneMapper.selectPhonesByCategory(categoryId));
在这个例子中,currentPage
和 pageSize
分别代表当前页码和每页显示的记录数。
每种方法都有其适用场景,你可以根据自己的需求和项目情况选择最合适的分页实现方式。在实际项目中,使用分页插件(如 PageHelper
)通常是最方便且性能较好的选择。