Mybatis-plus分页查询返回之坑

 

 

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对象。

各位看官,本文有什么不足的地方,可以直接指出来,毕竟第一次写这种文章,还请各位谅解。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
MyBatis-Plus 是一个 MyBatis 的增强工具包,提供了很多方便的功能和特性,其中包括分页查询插件。使用 MyBatis-Plus分页查询插件可以简化分页查询的操作。 在 MyBatis-Plus 中,分页查询可以通过 `Page` 对象和 `PageHelper` 工具类来实现。下面是使用 MyBatis-Plus 进行分页查询的示例代码: 1. 首先,添加 MyBatis-Plus 和分页插件的依赖到你的项目中。你可以在项目的 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本</version> </dependency> ``` 2. 创建一个 `Page` 对象,并设置分页参数: ```java // 创建一个 Page 对象 Page<User> page = new Page<>(current, size); // 设置分页参数 page.setPages(current); // 当前页码 page.setSize(size); // 每页显示的记录数 ``` 3. 在 MyBatis 的 Mapper 接口中使用 `@Param` 注解传递 `Page` 对象,并在 SQL 中使用 MyBatis-Plus 提供的分页查询方法: ```java @Mapper public interface UserMapper extends BaseMapper<User> { List<User> selectUserPage(@Param("page") Page<User> page, @Param("name") String name); } ``` 4. 在 Service 层中调用分页查询方法: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public IPage<User> getUserPage(long current, long size, String name) { Page<User> page = new Page<>(current, size); return userMapper.selectUserPage(page, name); } } ``` 这样,你就可以使用 MyBatis-Plus分页查询插件进行分页查询了。记得在你的 SQL 语句中使用 MyBatis-Plus 提供的分页查询方法,而不是传统的 LIMIT 语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值