mybatis的通用分页查询一般都是调用API

<P extends IPage<T>> P selectPage(P page, @Param("ew") Wrapper<T> queryWrapper);

但这种操作对于编码结构而言,一般是放在数据层/业务层进行处理,一般的做法是:

  • 封装Controller层
  • 实现Entity/Vo转换DTO
  • 封装Service层
  • 调用mybatis-plus层分页查询方法selectPage
    对于每一种业务场景,都需要做此封装,从而带来许多重复冗余的代码

因此这里考虑设计一个通用的分页查询工具,从而替代繁琐的代码封装
本次demo用到的后端maven依赖组件如下

  • springboot
  • mybatis-plus
  • druid+mysql
  • springboot-web

代码目录核心类包括
在这里插入图片描述
分别职责为:
控制器层,提供外部http调用
业务层:封装通用的分页查询

public abstract class AbstractPageController<T,E> {

    @Autowired
    PageService<E> pageService;
    private Class<T> dtoClass;

    public AbstractPageController() {
        ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
        Type[] actualTypeArguments = type.getActualTypeArguments();
        dtoClass = (Class<T>) actualTypeArguments[0];

    }

    @PostMapping("/pageQuery")
    public IPage<T> pageQuery(@RequestBody Object param) {
        return PageUtils.copy(pageService.pageQuery(param), dtoClass);
    }

}

这里通过反射的方式,拿到外部配置的DTO类

@Service
public abstract class AbstractPageServiceImpl<T> implements PageService<T> {

    private final String PAGE_SIZE = "pageSize";

    private final String CURRENT_PAGE = "currentPage";

    @Autowired
    private BaseMapper<T> mapper;

    public void beforePageQuery(Object param) {
    }

    public IPage<T> afterPageQuery(IPage<T> iPage) {
        return iPage;
    }

    public IPage<T> pageQuery(Object param) {
        try {
            beforePageQuery(param);
        } catch (Exception e) {
            e.printStackTrace();
        }
        IPage<T> iPage;
        Map<String, Object> convertParam = BeanUtils.bean2Map(param);
        if (CollectionUtils.isEmpty(convertParam)) {
            return new Page<>();
        }
        int pageSize = Optional.ofNullable(convertParam.get(PAGE_SIZE)).map(Object::toString).map(Integer::parseInt).orElse(0);
        int pageNum = Optional.ofNullable(convertParam.get(CURRENT_PAGE)).map(Object::toString).map(Integer::parseInt).orElse(0);
        if (pageNum == 0 || pageSize == 0) {
            return new Page<>();
        }
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        Page<T> page = new Page<>(pageNum, pageSize);
        iPage = mapper.selectPage(page, wrapper);
        try {
            iPage = afterPageQuery(iPage);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return iPage;
    }

}

这里提供了通用的业务查询
同时在业务查询前后加入了前置,后置操作,用于其他特殊业务逻辑处理

那最终使用的方法是

  • Controller
@RestController
@RequestMapping("/user")
public class UserController extends AbstractPageController<UserDTO, User> {
}
  • Service
public interface IUserService extends PageService<User> {
}
@Service
public class IUserServiceImpl extends AbstractPageServiceImpl<User> implements IUserService {
}

最后通过postman调用一下测试
在这里插入图片描述
gitee仓库地址
https://gitee.com/twy12138/pagequery-helper

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐