MybatisPlus分页查询详解

时间:2025-03-23 17:21:33

对于page–>pageDTO

我们改造pageDTO

@Data
public class PageDTO<T> {
    @ApiModelProperty("总条数")
    private Long total;
    @ApiModelProperty("总页数")
    private Long pages;
    @ApiModelProperty("集合")
    private List<T> list;

    /**
     * 对po到vo的转换
     * @param userPage
     * @param clazz
     * @return
     * @param <PO>
     * @param <VO>
     */
    public static <PO,VO> PageDTO<VO> of(Page<PO> userPage , Class<VO> clazz){
        // 封装VO结果
        PageDTO<VO> pageDTO = new PageDTO<>();
        (());
        (());

        List<PO> list = ();
        //判断数据为空
        if((list)){
            (());
            return pageDTO;
        }
        //PO转VO
        List<VO> userVOList = (list, clazz);
        (userVOList);
        //4 返回
        return pageDTO;
    }
}

这里同样定义泛型 这个转换其实本质上就是一个PO–>VO的转换因此我们为了通用化可以定义<PO,VO>两个泛型

但是这样就要求PO和VO中要转换的字段名一致,不可以进行特殊的转换,我们可以重载函数并且利用函数式接口编程定义一个转换器进行特定转换

    /**
     * 利用函数式接口编程创建一个转换器可以特定转换
     * @param userPage
     * @param convert
     * @return
     * @param <PO>
     * @param <VO>
     */
    public static <PO,VO> PageDTO<VO> of(Page<PO> userPage , Function<PO,VO> convert){
        //3 封装VO结果
        PageDTO<VO> pageDTO = new PageDTO<>();
        pageDTO.setTotal(userPage.getTotal());
        pageDTO.setPages(userPage.getPages());

        List<PO> list = userPage.getRecords();
        //判断数据为空
        if(CollUtil.isNotEmpty(list)){
            pageDTO.setList(Collections.emptyList());
            return pageDTO;
        }
        //PO转VO 
        List<VO> userVOList = list.stream().map(convert).collect(Collectors.toList());
        pageDTO.setList(userVOList);
        //4 返回
        return pageDTO;
    }

这里利用到了stream流使用map转换,这样我们就可以在调用处编写特定的转换逻辑

最终实体为

@Data
public class PageDTO<T> {
    @ApiModelProperty("总条数")
    private Long total;
    @ApiModelProperty("总页数")
    private Long pages;
    @ApiModelProperty("集合")
    private List<T> list;

    /**
     * 对po到vo的转换
     * @param userPage
     * @param clazz
     * @return
     * @param <PO>
     * @param <VO>
     */
    public static <PO,VO> PageDTO<VO> of(Page<PO> userPage , Class<VO> clazz){
        //3 封装VO结果
        PageDTO<VO> pageDTO = new PageDTO<>();
        pageDTO.setTotal(userPage.getTotal());
        pageDTO.setPages(userPage.getPages());

        List<PO> list = userPage.getRecords();
        //判断数据为空
        if(CollUtil.isNotEmpty(list)){
            pageDTO.setList(Collections.emptyList());
            return pageDTO;
        }
        //PO转VO
        List<VO> userVOList = BeanUtil.copyToList(list, clazz);
        pageDTO.setList(userVOList);
        //4 返回
        return pageDTO;
    }

    /**
     * 利用函数式接口编程创建一个转换器可以特定转换
     * @param userPage
     * @param convert
     * @return
     * @param <PO>
     * @param <VO>
     */
    public static <PO,VO> PageDTO<VO> of(Page<PO> userPage , Function<PO,VO> convert){
        //3 封装VO结果
        PageDTO<VO> pageDTO = new PageDTO<>();
        pageDTO.setTotal(userPage.getTotal());
        pageDTO.setPages(userPage.getPages());

        List<PO> list = userPage.getRecords();
        //判断数据为空
        if(CollUtil.isNotEmpty(list)){
            pageDTO.setList(Collections.emptyList());
            return pageDTO;
        }
        //PO转VO
        List<VO> userVOList = list.stream().map(convert).collect(Collectors.toList());
        pageDTO.setList(userVOList);
        //4 返回
        return pageDTO;
    }
}

最终我们的代码可以简化为如下

    @Override
    public PageDTO<UserVO> queryUsersByPage(UserQuery query) {
//        过滤条件
        String name = query.getName();
        Integer status = query.getStatus();
//        分页条件
        Page<User> page = query.toMpPageDefaultSortByCreateTimeDesc();

//        分页查询`
        Page<User> userPage = lambdaQuery()
                .like(name != null, User::getUsername, name)
                .eq(status != null, User::getStatus, status)
                .page(page);

//返回
//        return (userPage, ); 无需进行特定的处理
        return PageDTO.of(userPage,user -> {
            UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);
            //可以进行特定处理如(将后2个名字隐藏)
            userVO.setUsername(userVO.getUsername().substring(0,userVO.getUsername().length() - 2) + "**");
            return userVO;
        });
    }