MybatisPlus-20.插件功能-通用分页实体与MP转换

我们实现分页查询,需要在UserServiceImp里面进行具体的调用如下

package com.itheima.mp.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mp.domain.dto.PageDTO;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.query.PageQuery;
import com.itheima.mp.domain.query.UserQuery;
import com.itheima.mp.domain.vo.UserVO;
import com.itheima.mp.mapper.UserMapper;
import com.itheima.mp.service.IUserService;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;

import static net.sf.jsqlparser.util.validation.metadata.NamedObject.user;

//注意添加注解
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService {
    @Override
    //controller参数类型不一致还能跑起来真是牛啊
    public PageDTO<UserVO> queryUserPage(UserQuery query) {
        String name = query.getName();
        Integer status = query.getStatus();
        //1.构建条件
        Page<User> page = query.toMpPageDefaultSortByUpdateTimeDesc();
        //2.分页查询
        Page<User> p = lambdaQuery()
                .like(name != null, User::getUsername, name)
                .eq(status != null, User::getStatus, status)
                .page(page);
        //3.封装返回
        return PageDTO.of(page, user->{
            //1.拷贝属性到VO
            UserVO vo = BeanUtil.copyProperties(user, UserVO.class);
            //2处理特殊逻辑
            vo.setUsername(vo.getUsername().substring(0,vo.getUsername().length()-2) + "**");
            return vo;
        });
    }
}

当多个页面使用分页就会显得冗余,这时候我们可以使用泛型进行封装,只需要调用对应的方法就可以了

1.完善PageQuery

package com.itheima.mp.domain.query;

import cn.hutool.db.sql.Order;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

@Data
@ApiModel(description = "分页查询实体")
public class PageQuery {
    @ApiModelProperty("页码")
    private Long pageNo;
    @ApiModelProperty("页码")
    private Long pageSize;
    @ApiModelProperty("排序字段")
    private String sortBy;
    @ApiModelProperty("是否升序")
    private Boolean isAsc;
/**
 * @description: ...表示里面可以有多个函数
 * @author: xuzhenyu
* @date: 2025/4/30 下午2:26 
 * @param: orders 
 * @return: com.baomidou.mybatisplus.extension.plugins.pagination.Page<T>
 *     ,跟课程代码不完全一样
 **/

    public <T> Page<T> toMpPage(OrderItem ...orders){
        //1.分页条件
        Page<T> p = Page.of(pageNo, pageSize);
        //2.排序条件
        //2.1先看前端有没有传排序字段
        if(sortBy != null){
            p.addOrder(OrderItem.asc(sortBy));
            return  p;
        }
        //2.2再看看有没有手动指定排序字
        if( orders != null){
            p.addOrder(orders);
        }
        return p;
    }

    public <T> Page<T> toMpPageDefaultSortByCreateTimeDesc(){
        //升序从小到大,降序从大到小
        return toMpPage(OrderItem.desc("create_time"));
    }
    /**
     * @description: 视频9:00,方法名略有不同没关系
     * @author: xuzhenyu
    * @date: 2025/4/30 下午3:41
     * @return: com.baomidou.mybatisplus.extension.plugins.pagination.Page<T>
     **/
    public <T> Page<T> toMpPageDefaultSortByUpdateTimeDesc(){
        //升序从小到大,降序从大到小
        return toMpPage(OrderItem.desc("update_time"));
    }
}

说明:这里面没有使用new OrderItem,源码里面的OrderItem是无参构造,之前使用new OrderItem()里面传入参数,随着更细,变成了OrderItem.desc("create_time")这些之类的方法。需要特别注意,这里只是我实践过程中遇到了,仅代表个人意见。

2.完善PageDTO

package com.itheima.mp.domain.dto;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

@Data
@ApiModel(description = "分页结果")
public class PageDTO<T> {
    @ApiModelProperty("总条数")
    private Long total;
    @ApiModelProperty("总页数")
    private Long pages;
    @ApiModelProperty("集合")
    private List<T> list;
    public PageDTO() {
    }
    /**
     * @description:
     * @author: xuzhenyu
    * @date: 2025/4/30 下午2:49 
     * @param: p 
     * @return: com.itheima.mp.domain.dto.PageDTO<V>
     **/
    public static <PO,VO> PageDTO<VO> of(Page<PO> p,Class<VO> clazz) {
        PageDTO<VO> dto = new PageDTO<>();
        //1.总条数
        dto.setTotal(p.getTotal());
        //2.总页数
        dto.setPages(p.getPages());
        //3.当前页数据
        List<PO> records = p.getRecords();
        if(CollUtil.isEmpty(records)){
            dto.setList(Collections.emptyList());
            return  dto;
        }
        //4.拷贝user的vo
        dto.setList(BeanUtil.copyToList(records, clazz));
        //5返回
        return dto;
    }
    public static <PO,VO> PageDTO<VO> of(Page<PO> p, Function<PO,VO> convertor) {
        PageDTO<VO> dto = new PageDTO<>();
        //1.总条数
        dto.setTotal(p.getTotal());
        //2.总页数
        dto.setPages(p.getPages());
        //3.当前页数据
        List<PO> records = p.getRecords();
            if(CollUtil.isEmpty(records)){
                dto.setList(Collections.emptyList());
                return  dto;
            }
            //4.拷贝user的VO
            dto.setList(records.stream().map(convertor).collect(Collectors.toList()));
            //5.返回
            return dto;
            }

}

使用之前写的UserVO

3.重写UserServiceImol

package com.itheima.mp.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mp.domain.dto.PageDTO;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.query.PageQuery;
import com.itheima.mp.domain.query.UserQuery;
import com.itheima.mp.domain.vo.UserVO;
import com.itheima.mp.mapper.UserMapper;
import com.itheima.mp.service.IUserService;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;

import static net.sf.jsqlparser.util.validation.metadata.NamedObject.user;

//注意添加注解
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService {
    @Override
    public PageDTO<UserVO> queryUserPage(UserQuery query) {
        String name = query.getName();
        Integer status = query.getStatus();
        //1.构建条件
        Page<User> page = query.toMpPageDefaultSortByUpdateTimeDesc();
        //2.分页查询
        Page<User> p = lambdaQuery()
                .like(name != null, User::getUsername, name)
                .eq(status != null, User::getStatus, status)
                .page(page);
        //3.封装返回
        return PageDTO.of(page, user->{
            //1.拷贝属性到VO
            UserVO vo = BeanUtil.copyProperties(user, UserVO.class);
            //2处理特殊逻辑
            vo.setUsername(vo.getUsername().substring(0,vo.getUsername().length()-2) + "**");
            return vo;
        });
    }
}

我们会发现跟之前那的比,这个我们进行封装后更简洁了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值