当前位置: 首页 > 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

相关文章:

  • 【毕业设计】 心血管疾病分析系统(医学大数据分析)
  • MyBatis学习(三)
  • 【数据挖掘】2022年2023届秋招知能科技公司机器学习算法工程师 笔试题
  • 基于Python的视频中的人脸识别系统设计与实现
  • MySQL主从复制详解
  • 【深度学习入门】- 用电路思想解释感知机
  • 文字生成图片
  • HTTPS的原理浅析与本地开发实践(下)
  • java-多态
  • 一、CSS文本样式[文本基础、文本样式、段落控制]
  • Nginx网络服务的配置
  • m基于随机接入代价的异构网络速率分配算法matlab仿真(包括matlab仿真录像)
  • 【VUE的Form表单】使用v-if切换控件时,表单校验不生效
  • EnumWindowsProc
  • SSL安全证书:免费的SSL证书申请渠道有哪些?
  • 【Linux系统编程】快速查找errno错误码信息
  • 【面试系列】之二:关于js原型
  • Docker入门(二) - Dockerfile
  • Mithril.js 入门介绍
  • 程序员该如何有效的找工作?
  • 检测对象或数组
  • 前端技术周刊 2019-01-14:客户端存储
  • 浅谈Golang中select的用法
  • 网页视频流m3u8/ts视频下载
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 写给高年级小学生看的《Bash 指南》
  • ​【已解决】npm install​卡主不动的情况
  • #include
  • (9)目标检测_SSD的原理
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (补)B+树一些思想
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (蓝桥杯每日一题)love
  • (区间dp) (经典例题) 石子合并
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • .Net FrameWork总结
  • .NET 事件模型教程(二)
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .so文件(linux系统)
  • @Autowired多个相同类型bean装配问题
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @我的前任是个极品 微博分析
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ solr入门 ] - 利用solrJ进行检索
  • [Bugku]密码???[writeup]
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [C]整形提升(转载)
  • [codeforces]Checkpoints
  • [E单调栈] lc2487. 从链表中移除节点(单调栈+递归+反转链表+多思路)
  • [Flex][问题笔记]TextArea滚动条问题
  • [I2C]I2C通信协议详解(二) --- I2C时序及规格指引