请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师为什么不把productListVoList直接给到PageInfo?

https://img1.sycdn.imooc.com/szimg//5915be2200010e5e06940181.jpg

老师直接把productListVoList传到PageInfo不行吗?

PageInfo pageResult=new PageInfo(productListVoList);

为什么要替换一下?

PageInfo pageResult=new PageInfo(productList);
pageResult。setList(productListVoList);


正在回答

4回答

Geely 2017-05-14 14:12:26

hi 同学你好,这块课程里提过,是mybatispagehepler的原理,看看源码就知道,它是用aop做的切面。所以必须和之前的dao层有请求才会添加分页相关信息呢。。如果直接放 分页的信息就木有啦哈

9 回复 有任何疑惑可以回复我~
  • 提问者 Sxy97 #1
    谢谢老师
    回复 有任何疑惑可以回复我~ 2017-05-14 14:13:59
  • 老师,能说详细点吗,还是不太明白,这个项目里时怎么使用aop的?
    回复 有任何疑惑可以回复我~ 2018-06-03 13:47:30
  • 这个项目我们没有写aop,而是mybatispagehelper里面的原理是通过aop实现动态分页
    回复 有任何疑惑可以回复我~ 2018-06-05 15:44:23
慕标1082694 2018-12-25 17:34:05

我开始也想了很久,看了问答区的很多回答,觉得都没有讲到点子上,后面自己翻看了一下这个插件的源码才搞懂的。

首先,我们要知道:

List<Product> productList = productMapper.selectList();

这一句当中,productList的实际类型是什么?

我查了一下官方的文档,是这样解释的:

//分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>,//或者使用PageInfo类

也就是说,productList实际上指向的是一个Page对象。而我们自己写的productListVo仅仅是一个简单的List对象。

那么,为什么我们在这一句中,一定要传入一个Page对象呢?

我们翻看一下new PageInfo(productList);中的构造方法是怎样工作的:

public PageInfo(List<T> list, int navigatePages) {
    if (list instanceof Page) {
        Page page = (Page) list;
        this.pageNum = page.getPageNum();
        this.pageSize = page.getPageSize();
        this.orderBy = page.getOrderBy();

        this.pages = page.getPages();
        this.list = page;
        this.size = page.size();
        this.total = page.getTotal();
        //由于结果是>startRow的,所以实际的需要+1
        if (this.size == 0) {
            this.startRow = 0;
            this.endRow = 0;
        } else {
            this.startRow = page.getStartRow() + 1;
            //计算实际的endRow(最后一页的时候特殊)
            this.endRow = this.startRow - 1 + this.size;
        }
    } else if (list instanceof Collection) {
        this.pageNum = 1;
        this.pageSize = list.size();

        this.pages = 1;
        this.list = list;
        this.size = list.size();
        this.total = list.size();
        this.startRow = 0;
        this.endRow = list.size() > 0 ? list.size() - 1 : 0;
    }
    if (list instanceof Collection) {
        this.navigatePages = navigatePages;
        //计算导航页
        calcNavigatepageNums();
        //计算前后页,第一页,最后一页
        calcPage();
        //判断页面边界
        judgePageBoudary();
    }
}

我们发现,如果传进来的是一个Page对象,将会根据这个Page对象计算相应的数值,此时Page对象的total为数据库中实际数据的总条数,而不是我们查出来的List的大小。包括当前实际处于的页数pageNum也是准确的。代码如下所示:

this.total = page.getTotal();
this.pageNum = page.getPageNum();

但是,我们仍然会发现,如果传入的参数不是Page对象,而是直接传入一个List的话,又是怎么处理的呢?我们发现,处理过程非常简单粗暴:

else if (list instanceof Collection) {
        this.pageNum = 1;
        this.pageSize = list.size();
        this.pages = 1;
        this.list = list;
        this.size = list.size();
        this.total = list.size();
        this.startRow = 0;
        this.endRow = list.size() > 0 ? list.size() - 1 : 0;
    }

此时,直接把当前页数设置为第1页(实际可能不是第1页),总数total设置为List的大小,然而我们数据库中的数据肯定不止这个List这么大,因此,此时计算出来的页面信息全是错误的!

List<Product> productList = productMapper.selectList();

    因此,如果我们先传入Mapper返回来的这个productList(实际上也是一个Page对象),那么我们在执行

PageInfo pageResult = new PageInfo(productList);

的时候,算出来的什么pageNum啊,total啊都是实际数据库中的数值,而不是简单的1和List的大小。

    但是,我们最后又需要传给前端produstListVoList,因此,我们在构造函数算完这些值后,然后在替换其中的productList为productListVoList,前端既能收到productListVoList,又能得到正确的页面信息。

    所以,老师第一步传入productList只是借来算页面信息的,实际展示给前端的还是展示productListVoList对象。

    希望能帮助到一些同学,有错误欢迎指出。

更多详细内容,欢迎参考我的博客:https://blog.csdn.net/qq_19782019

24 回复 有任何疑惑可以回复我~
Geely 2018-06-05 15:44:58

首先课程中有说。pageHelper分页主要是通过 aop来实现,在执行sql之前会在sql语句中添加limit offset这两个参数。这样就完成了动态的分页。


然而我们需要用vo返回给前端。如果我们用vo里的字段,是和pojo总会有不一致的地方。例如时间的类型,又例如添加的一些枚举状态等。那么为了自动分页,我们会用dao层找到原始的pojoList,(因为pageHelper是对dao层在执行mapper的时候才会动态分页,所以我们要先执行一下mapper)然后转换成vo。那么其实这两个list的集合的分页参数是一致的。所以用了一个比较巧妙的办法。来把vo进行分页~~这样就达到了目的~


希望你能理解哈~~


6 回复 有任何疑惑可以回复我~
慕姐8315644 2018-08-26 14:00:07

此处思路:
* 通过pageHelper 的底层原理是基于aop的,aop需要切点,可以理解为执行dao层就是这个切点
* 需要通过执行dao层,才可以动态的进行分页信息的添加
* 1.我们使用productList进行 pageInfo的初始化 是为了触发pageHelper的动态分页,将分页信息储存在pageInfo中
* 2. 替换list , 因为productListVoList和productList所需的分页信息一致

4 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信