当前位置: 首页 > news >正文

mybatis-plus通用业务分页查询封装

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/tree/main

相关文章:

  • 防高德/泡泡玛特抽盒机 滑动弹出层 uniapp slide-popup
  • 计算机毕业设计之java+javaweb篮球系列网上商城设计与实现
  • 【SCT52245STD】替代UCC27325,一级代理,支持现货
  • 【面试题】Vue 基础之Vuex(五)
  • 2022-05-28前端周报 践行PDCA方法
  • [Java]深入剖析常见排序
  • UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象
  • Hugging Face学习
  • PHP:命名空间必知必会
  • Jackson多克隆抗体丨艾美捷Jackson纳米二级抗体研究
  • 基于JavaSwing开发帐号管理系统+报告 课程设计 大作业源码
  • 【Java面试】快手面试遭遇滑铁卢:Java中的单例模式如何实现 满分回答快拿走
  • Android 4.4 如何添加局域网ADB调试流程
  • java-多态
  • 两个有序表的合并(三种方法)
  • python毕业设计项目源码选题(16)跳蚤市场二手物品交易系统毕业设计毕设作品开题报告开题答辩PPT
  • vscode打了断点,但是不能debug
  • 速来!人社部发布100个最缺工职业;人均梵高的自画像工具;YSDA深度视觉与图形课程;机器学习系统VS机器学习模型;前沿论文 | ShowMeAI资讯日报
  • Ceph分布式集群安装配置
  • druid产生大量mysql的sleep连接
  • 2022全国车辆工程专业大学排名一览表
  • 2022周口职业技术学院单招学费多少钱一年-各专业收费标准
  • 2022年中原工学院艺术类招生简章
  • 2022浙江经贸职业技术学院学费多少钱一年-各专业收费标准
  • 2022年湖南大学强基计划报名条件-报名时间-报名入口
  • 2020河北工程大学运动训练专业招生简章
  • 2022湖州有哪些民办大学?湖州所有民办大学名单一览表(1所)
  • 2022天津城市建设管理职业技术学院学费多少钱一年-各专业收费标准
  • 2022滁州学院艺术类学费多少钱一年-各专业收费标准
  • 2022云南警官学院学费多少钱一年-各专业收费标准