我们实现分页查询,需要在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;
});
}
}
我们会发现跟之前那的比,这个我们进行封装后更简洁了。