Mybatis-plus的分页查询,
需要传入,page(分页条件),和Wrapper查询条件,返回一个IPage,这些用过的人都应该知道
注意往下看,我将传入的分页page对象换成同一个,
Page page = new Page(1, 3);
QueryWrapper<TodayNews> rdxwQueryWrapper = new QueryWrapper<>();
rdxwQueryWrapper.lambda().eq(TodayNews::getLabel, "22")
.orderByDesc(SuperEntity::getCreateTime);
IPage rdxwIPage = todayNewsMapper.selectPage(page, rdxwQueryWrapper);
QueryWrapper<TodayNews> ckjsQueryWrapper = new QueryWrapper<>();
ckjsQueryWrapper.lambda().eq(TodayNews::getLabel, "23")
.orderByDesc(SuperEntity::getCreateTime);
IPage ckjsIPage = todayNewsMapper.selectPage(page, ckjsQueryWrapper);
看到这里,不看结果的情况下,问一句返回的两个IPage对象是否一样呢?
结果就是一样的,两个IPage里面的内容一样,对象的地址都是一样的,下面废话不多说直接上图,
毕竟实践才是检验真理的唯一标准:
刚遇到遇到这个问题的时候,我是没有去关注对象的地址的,只关注的IPage对象里的内容为什么会一样,想的问题就是:
1.第二个查询返回的IPage对象会把第一个覆盖掉呢?
2.也不应该覆盖掉啊,因为每个查询返回的IPage对象都是新的,而不是说像传入的分页对象page一样,用的一个
想了一会之后,我以为Mybatis-plus不能这么用, 但是我想不应该啊,然后我就用传统Sql+limt分页,去写了返回多个list集合(因为当时前端等着呢,当时就没有去深究这个问题),
遇到问题之后没有去查看源码,而是去问百度了, 不知道是我没有搜对,还是什么,记得有一个搜到的是一级缓存和二级缓存的原因,但是想了想,我写的每个查询条件都不一样啊,为什么会出现这样的问题呢?
后来请教老大之后,一上来直接看对象地址,返回的两个IPage地址一样,就说明是一个IPage,内容肯定一样。
但是我每个查询都返回新的了啊,应该不至于把。
接着我点进去看了看Mybatis-plus分页查询selectPage这个方法:注意重点来了
/**
* 根据 entity 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件(可以为 RowBounds.DEFAULT)
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
这是查询方法,需要注意的是,这里传入的并不是page对象,而是IPae,那为什么page可以传过去呢?
我们在点进去看对象page的类
public class Page<T> implements IPage<T>
这就是为什么查询方法接收的是IPage对象,自己穿的page也可以的原因,因为,他继承了IPage,
看到这两个方法忽然间想到一个问题,上面介绍到说两个查询返回的IPage对象是一个,此时不禁在想,是不是分页查询返回的IPage对象是用的传入的page对象呢, 根据传入的page对象里面的分页参数,将查询到的返回数据写入传入的page对象,然后又返回呢?
还是那句话:实践是检验真理的唯一标准,直接上代码
Page rdxepage=new Page(1, 3);
QueryWrapper<TodayNews> rdxwQueryWrapper = new QueryWrapper<>();
rdxwQueryWrapper.lambda().eq(TodayNews::getLabel, "22")
.orderByDesc(SuperEntity::getCreateTime);
IPage rdxwIPage = todayNewsMapper.selectPage(rdxepage, rdxwQueryWrapper);
Page ckjspage=new Page(1, 3);
QueryWrapper<TodayNews> ckjsQueryWrapper = new QueryWrapper<>();
ckjsQueryWrapper.lambda().eq(TodayNews::getLabel, "23")
.orderByDesc(SuperEntity::getCreateTime);
IPage ckjsIPage = todayNewsMapper.selectPage(ckjspage, ckjsQueryWrapper);
page是传入的分页对象,IPage是查询返回对象,传入的对象地址和返回的对象地址一致。
看到这里我想,应该可以印证我的猜测了把。
这里我得出的结论就是Mybatis-plus返回的IPage对象就的传入的分页page对象,将查询返回的数据写入传入的page对象,然后返回一个IPage对象。
各位看官,本文有什么不足的地方,可以直接指出来,毕竟第一次写这种文章,还请各位谅解。