Mybatis Plus 的 page(E page) 方法

MP 的 page(E page) 方法

1、为何不能直接通过 Page<DishDto> pageDto = new Page<>();来查数据库获取相关数据反而要用数据拷贝的方式来将 Page<Dish> 的和其他的数据拷贝到 Page<DishDto> 中?(当 page 方法中传入 Page<DishDto> 参数时会在编译阶段报错)

2、为何 updateById 可以直接传入 DishDto 参数?

public Page<DishDto> myPage(int page, int pageSize, String name) {
Page<Dish> pageInfo = new Page<>(page, pageSize);
Page<DishDto> pageDto = new Page<>();
// 条件构造器
LambdaQueryWrapper<Dish> dishLqw = new LambdaQueryWrapper<>();
dishLqw.like(StringUtils.isNotEmpty(name), Dish::getName, name);
dishLqw.orderByAsc(Dish::getUpdateTime);
/**
* 查询分页数据
*/
page(pageInfo, dishLqw);
...

updateById() 方法:

@Override
public void updateDto(DishDto dishDto) {
this.updateById(dishDto);
}

分析:

查看源码可知:

page 方法的返回值是 <E extends IPage<T>>,意思为 IPage<T> 及其子类(extends 可以理解为<)。T 为与数据库表对应的实体类,DishDto 继承自 Dish,但是 Page<DishDto> 并不是 IPage<Dish> 的子类,因此 page() 方法中传入 Page<DishDto> 会报错。

而 updateById(T entity) 中的 T 是 Dish,DishDto 继承自 Dish,所以 updateById()方法是可以使用 DishDto 作为形参的。

从数据库方面来看:之所以不能使用 Page<DishDto> 是因为 DishDto 中有数据库的 Dish 表没有的字段。

public interface IService<T> {
default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper) {
return getBaseMapper().selectPage(page, queryWrapper);
}
default boolean updateById(T entity) {
return SqlHelper.retBool(getBaseMapper().updateById(entity));
}
....
}

关于为什么说 Page<DishDto> 并不是 IPage<Dish> 的子类:

主要看泛型,若泛型为具体的类,则可以看做两个点,若泛型含有通配符可以看做一个范围,若 A 范围属于 B 范围,则认为是 Page<A> extends Page<B>, 注意是范围!(❓)

本文作者:九落

本文链接:https://www.cnblogs.com/9fall/p/17055856.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   九落  阅读(883)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.