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>, 注意是范围!(❓)
标签:DishDto,updateById,Page,Dish,Plus,Mybatis,new,page From: https://www.cnblogs.com/9fall/p/17055856.html