在MyBatis中实现分页查询的常见方式有两种:使用MyBatis内置的分页插件如PageHelper,或者手动编写分页的SQL语句。下面我将为你提供两种方式的示例代码。
使用PageHelper分页插件
首先,确保你的项目中已经添加了PageHelper的依赖。在Maven项目中,可以在pom.xml
文件中添加如下依赖(版本号可能需要更新):
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>最新版本</version>
</dependency>
然后,在你的Service或Mapper层调用PageHelper的静态方法startPage
来启动分页功能,之后紧跟着的查询就是一个分页查询了。
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import java.util.List;
public PageInfo<User> findByPage(int pageNum, int pageSize) {
// pageNum: 页码, pageSize: 每页显示数量
PageHelper.startPage(pageNum, pageSize);
// 紧跟着的第一个select方法会被分页
List<User> users = userMapper.selectAll();
// 使用PageInfo包装查询结果,便于使用
return new PageInfo<>(users);
}
手动编写分页SQL
如果你不想使用分页插件,也可以手动编写SQL实现分页。以下是一个基于MySQL数据库的分页查询示例:
<!-- MyBatis的Mapper文件 -->
<select id="findByPage" resultType="User">
SELECT * FROM users
ORDER BY id
LIMIT #{offset}, #{pageSize}
</select>
确实,如果你直接使用手动编写的分页SQL查询,这种方式并不会自动返回查询结果的总数(total)。要获取总数,通常需要执行一个额外的SQL查询来计算总记录数。这意味着对于分页功能,你通常需要执行两个查询:一个是分页查询本身,另一个是为了获取总记录数的查询。
以下是如何实现这一点的示例:
1. 查询总记录数(注意这里需要查询你需要数据库中全部信息返给前端作为total值)
首先,你需要一个SQL查询来获取总记录数。这通常是一个简单的SELECT COUNT语句。
<!-- 在MyBatis的Mapper文件中 -->
<select id="findTotalCount" resultType="int">
SELECT COUNT(*) FROM users
</select>
2. 修改Service或DAO层
然后,在你的Service或DAO层,你可以首先查询总记录数,然后执行分页查询。这样,你可以将总记录数和分页查询的结果一起返回给调用者。
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public Map<String, Object> findByPage(int pageNum, int pageSize) {
int offset = (pageNum - 1) * pageSize;
int total = userMapper.findTotalCount(); // 获取总记录数
List<User> users = userMapper.findByPage(offset, pageSize); // 分页查询
Map<String, Object> result = new HashMap<>();
result.put("total", total); // 总记录数
result.put("users", users); // 分页查询结果
return result;
}
这样,你就可以在前端或调用者那里得到总记录数和当前页的记录列表,从而可以计算出总页数、当前页码等分页信息,为用户提供完整的分页功能。
记得,每次分页查询都执行两次数据库操作(一次获取总数,一次实际分页查询)可能会对性能有一定影响,特别是在处理大量数据时。因此,对于数据量非常大的情况,需要考虑缓存策略或其他优化手段。在这里,#{offset}
是查询的起始位置(例如,在第2页,每页10条记录,offset
应该是10),#{pageSize}
是每页显示的记录数。