首页 > 其他分享 >Mybatis Plus 的 page(E page) 方法

Mybatis Plus 的 page(E page) 方法

时间:2023-01-16 17:14:42浏览次数:35  
标签:DishDto updateById Page Dish Plus Mybatis new 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>, 注意是范围!(❓)

标签:DishDto,updateById,Page,Dish,Plus,Mybatis,new,page
From: https://www.cnblogs.com/9fall/p/17055856.html

相关文章