mybatis的通用分页查询一般都是调用API
<P extends IPage<T>> P selectPage(P page, @Param("ew") Wrapper<T> queryWrapper);
但这种操作对于编码结构而言,一般是放在数据层/业务层进行处理,一般的做法是:
因此这里考虑设计一个通用的分页查询工具,从而替代繁琐的代码封装
本次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;
}
}
这里提供了通用的业务查询
同时在业务查询前后加入了前置,后置操作,用于其他特殊业务逻辑处理
那最终使用的方法是
@RestController
@RequestMapping("/user")
public class UserController extends AbstractPageController<UserDTO, User> {
}
public interface IUserService extends PageService<User> {
}
@Service
public class IUserServiceImpl extends AbstractPageServiceImpl<User> implements IUserService {
}
最后通过postman调用一下测试
gitee仓库地址
https://gitee.com/twy12138/pagequery-helper