逻辑就是:根据索引数和每个表的总个数去查询,最主要的是计算每个表的实际索引
首先是根据前端传过来的pageNum和pageSize可以计算出逻辑索引,接着就是根据逻辑索引计算出实际索引的值
首先从第二个表开始,能看到一些规律,就是:实际索引=逻辑索引-(前边的所有表的所有条数(不包含自身的表)),如下表所示
表的条数 | 逻辑索引 | 实际索引 | 实际索引 |
4 | 0 | 0 | |
1 | 1 | ||
2 | 2 | ||
3 | 3 | ||
3 | 4 | 0 | 4-4 |
5 | 1 | 5-4 | |
6 | 2 | 6-4 | |
6 | 7 | 0 | 7-7 |
8 | 1 | 8-7 | |
9 | 2 | ||
10 | 3 | ||
11 | 4 | ||
12 | 5 | ||
1 | 13 | 0 |
但是其中会有一些特殊情况,就是逻辑索引小于表的条数的情况,比如我要查询第2页的数据,每页3个数据,那么它的逻辑索引就是3;
它查询的结果应该是第一个表的最后一个,以及第一个表的前两个数据
第一个表查完后,需要对逻辑索引进行重新计算,则逻辑索引-表的总条数则就是下一个表的实际索引;
但是目前的情况是3-4=-1,所以则是不对的,可以进行修正,就是在逻辑索引小于总条数的时候进行加一进行补正,为了更符合逻辑,在最后进行判断,如果逻辑索引小于0的情况下,则将逻辑索引修正为0;
主要逻辑代码如下:
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
// pageSize 每页个数, pageNum 第几页
// 开始索引
long[] fromIndex = new long[] { (long) pageSize };
// 剩余个数
long[] surplusSize = new long[] { pageSize * pageNum - pageSize };
tableList.forEach(tableName -> {
if (surplusSize[0] > 0) {
//进行分页查询,需要注意的是这里使用的是索引和个数,也就是limit offset
Page<Object> dbPageList = dbservice.selectDataByTableName(fromIndex[0], surplusSize[0],tableName);
//这个就是要查出来的数据,将数据保存到结果集中
List<Object> list = data.getRecords();
surplusSize[0] -= list.size();
//获取本表的总条数
long totalThis = data.getTotal();
//如果索引大于总条数,则直接相减
if(fromIndex[0]>=totalThis) {
fromIndex[0]-=totalThis;
}else {
fromIndex[0]-=(totalThis-1);
}
if(fromIndex[0]<0) {
fromIndex[0] = 0;
}
}
}