现在有一些MySQL的分页插件,比如com.github.miemiedev.mybatis.paginator,尽管这些插件可以帮助开发,我还是觉得作为一个后端人员,对于MySQL的分页不仅仅只停留在调插件的水平,至少原理要知道,最好能封装自己的分页插件。
1.原理
MySQL用limit来限制每次查询数据的数量,利用limit,就可以实现分页。
实际上,第三方插件也是利用这点来实现分页。
limit #{startIndex}, #{pageSize}
start表示从哪条数据开始返回,从0开始;size表示一共返回多少条数据。
比如limit 0,3,查询的是从第一条数据开始,共返回3条数据。2.Java实现
首先要计算查询的总数目,所以要多写一条sql来查询count数。
插件的实现方式是在mybatis里面配拦截器,拦截目标sql,在目标sql前面加上count,来获取数目。
然后需要计算共多少页,我已经做了实现。
/**
* 分页,可以返回总页数
*
* @param lastPageSize 每页数据条数
* @param startIndex 起始页
* @param pageTotal 总页数
* @return
* */
public static HashMap<String, Integer> pagination(int pageSize,
int startIndex, int count) {
HashMap<String, Integer> pageInfo = new HashMap<>();
// 总页数
int pageTotal = count / pageSize;
int sax = count % pageSize;
if (sax != 0) {
pageTotal = pageTotal + 1;
}
// 传入的页码大于总页数
if (startIndex > pageTotal) {
// 返回错误
return null;
}
int lastPageSize = 0;
int realStartIndex = 0;
if (startIndex != 1) {
realStartIndex = (startIndex - 1) * pageSize;
// 最后一页特殊处理,要处理pageSize
if (startIndex == pageTotal) {
lastPageSize = count - (pageTotal - 1) * pageSize;
} else {
lastPageSize = pageSize;
}
} else {
lastPageSize = pageSize;
}
pageInfo.put("pageTotal", pageTotal);
pageInfo.put("lastPageSize", lastPageSize);
pageInfo.put("startIndex", realStartIndex);
return pageInfo;
}
pageTotal为总页数,需要返回给前端;
startIndex和lastPageSize分别为limit入参。
3.分装成插件
需要在mybatis里面拦截sql,待实现。