• 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

  • 相关阅读:
    单片机通信总述——理论部分(CAN、串口、SPI、I2C等)
    Java项目:SSM律师事务所律师管理系统
    魔兽服务器学习-笔记1
    SpringCloud Alibaba微服务第4章之Nacos
    怎么把录音转文字?这些方法值得收藏
    【Node.js】NPM 和 package.json
    Compiere的应用字典介绍
    聊聊编程中的 “魔数”
    吴恩达机器学习系列课程笔记——第十二章:支持向量机(Support Vector Machines)
    小程序对接停车场支付流程思考
  • 原文地址:https://blog.csdn.net/weixin_43005178/article/details/127104349