Mybatis-plus插件功能
一、分页插件
注意:用的是mybatisplus的,不是hutool工具包的
在mybatisplus实现分页插件,第一步先在mybatisplus核心插件添加分页插件。
编写分页查询代码
二、统一分页实体
这是返回值
@Overridepublic PageDTO<UserVO> queryUsersPage(UserQuery query) {String name = query.getName();Integer status = query.getStatus();//1、构造查询条件//1.1.分页条件Page<User> page = Page.of(query.getPageNo(), query.getPageSize());//1.2.排序条件if(query.getSortBy()!=null){page.addOrder(new OrderItem(query.getSortBy(),query.getIsAsc()));}else {//按照默认修改时间排序page.addOrder(new OrderItem("update_time",false));}//2、查询Page<User> p = lambdaQuery().like(name != null, User::getUsername, name).eq(status != null, User::getStatus, status).page(page);//3、封装VO结果PageDTO<UserVO> dto = new PageDTO<>();//3.1.总条数dto.setTotal(p.getTotal());//3.2.总页数dto.setPages(p.getPages());//3.3.当前页数据List<User> records = p.getRecords();if (CollUtil.isEmpty(records)){dto.setList(Collections.emptyList());return dto;}//3.4.拷贝user的VOList<UserVO> vos = BeanUtil.copyToList(records, UserVO.class);dto.setList(vos);return dto;}
下面这个采用了DB静态工具
@Override
public PageDTO<UserVO> queryUsersPage(PageQuery query) {// 1.构建条件// 1.1.分页条件Page<User> page = Page.of(query.getPageNo(), query.getPageSize());// 1.2.排序条件if (query.getSortBy() != null) {page.addOrder(new OrderItem(query.getSortBy(), query.getIsAsc()));}else{// 默认按照更新时间排序page.addOrder(new OrderItem("update_time", false));}// 2.查询page(page);// 3.数据非空校验List<User> records = page.getRecords();if (records == null || records.size() <= 0) {// 无数据,返回空结果return new PageDTO<>(page.getTotal(), page.getPages(), Collections.emptyList());}// 4.有数据,转换List<UserVO> list = BeanUtil.copyToList(records, UserVO.class);// 5.封装返回return new PageDTO<UserVO>(page.getTotal(), page.getPages(), list);
}
三、通用分页实体与MP转换
就是把分页查询需要构建的查询条件,已经查询完后数据转换,抽到一个类中,需要时直接调它就行了
构建查询条件
public <T> Page<T> toMpPage(OrderItem ... items){//1.分页条件Page<T> page = Page.of(pageNo, pageSize);//2.排序条件if(StrUtil.isNotBlank(sortBy)){page.addOrder(new OrderItem(sortBy,isAsc));}else if(items!=null){//按照默认修改时间排序page.addOrder(items);}return page;}public <T> Page<T> toMpPage(String defaultSortBy,Boolean defaultAsc){return toMpPage(new OrderItem(defaultSortBy,defaultAsc));}public <T> Page<T> toMpPageDefaultSortByCreateTime(){return toMpPage(new OrderItem("create_time",false));}public <T> Page<T> toMpPageDefaultSortByUpdateTime(){return toMpPage(new OrderItem("update_time",false));}
//1、构造查询条件Page<User> page = query.toMpPageDefaultSortByUpdateTime();
数据类型转换
public static <PO,VO> PageDTO<VO> of(Page<PO> p,Class<VO> clazz){//3、封装VO结果PageDTO<VO> dto = new PageDTO<>();//3.1.总条数dto.setTotal(p.getTotal());//3.2.总页数dto.setPages(p.getPages());//3.3.当前页数据List<PO> records = p.getRecords();if (CollUtil.isEmpty(records)){dto.setList(Collections.emptyList());return dto;}//3.4.拷贝user的VOList<VO> vos = BeanUtil.copyToList(records, clazz);dto.setList(vos);return dto;}
当有特殊需求的数据转换,就用到函数式接口了
public static <PO,VO> PageDTO<VO> of(Page<PO> p, Function<PO,VO> convertor){//3、封装VO结果PageDTO<VO> dto = new PageDTO<>();//3.1.总条数dto.setTotal(p.getTotal());//3.2.总页数dto.setPages(p.getPages());//3.3.当前页数据List<PO> records = p.getRecords();if (CollUtil.isEmpty(records)){dto.setList(Collections.emptyList());return dto;}//3.4.拷贝user的VOdto.setList(records.stream().map(convertor).collect(Collectors.toList()));return dto;}