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依赖组件如下
代码目录核心类包括
分别职责为;
控制器层;提供外部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/tree/main