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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步