Mybatis分页插件的原理
MyBatis 的分页插件主要通过拦截 SQL 执行过程来实现分页功能。其原理大致如下:
- 拦截器:MyBatis 分页插件是通过拦截器(Interceptor)来实现的。拦截器可以在执行 SQL 语句前后进行拦截和处理。
- SQL 解析:当执行查询操作时,分页插件会拦截 SQL 语句,并解析其中的分页相关信息,比如需要查询的页数、每页的记录数等。
- SQL 重写:基于解析的结果,分页插件会对原始的 SQL 语句进行改写,通常是在原始的 SQL 语句外部包裹一层包含分页逻辑的 SQL,以实现分页查询。
- 执行查询:改写后的 SQL 语句将被用来执行数据库查询操作,只返回符合分页条件的数据。
总的来说,在你调用PageHelper的开始分页方法时,只会在接下来执行的第一条查询有效,在它返回的list其实不是Collection类型,而是Page。
我碰到的问题:使用分页插件分页后,返回的total总数是正确的,由于我需要返回给前端的数据需要组装为其他数据, 在组装之后这时候发现,total总数不正确。
原因:
public PageInfo(List<? extends T> list, int navigatePages) {
super(list);
this.isFirstPage = false;
this.isLastPage = false;
this.hasPreviousPage = false;
this.hasNextPage = false;
if (list instanceof Page) {
//如果是Page对象
Page page = (Page)list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.pages = page.getPages();
this.size = page.size();
if (this.size == 0) {
this.startRow = 0L;
this.endRow = 0L;
} else {
this.startRow = page.getStartRow() + 1L;
this.endRow = this.startRow - 1L + (long)this.size;
}
} else if (list instanceof Collection) {
//如果是集合,page的size就会使用list的大小
this.pageNum = 1;
this.pageSize = list.size();
this.pages = this.pageSize > 0 ? 1 : 0;
this.size = list.size();
this.startRow = 0L;
this.endRow = list.size() > 0 ? (long)(list.size() - 1) : 0L;
}
if (list instanceof Collection) {
this.calcByNavigatePages(navigatePages);
}
}
我的解决方法:
PageInfo<CaseLibVo> pageInfo = new PageInfo();
pageInfo.setList(yourList);
pageInfo.setTotal(yourList.size());
//可以选择使用这个pageInfo对象返回
return pageinfo;
希望能帮到碰到这种问题的人。
不知道大家有没有更好的解决方法,欢迎评论!!!!!