在日常开发中,数据查询是最为常见的需求,也是占比最大的一部分。为了降低成本提升开发效率,已经封装了两个组件:
两个组件,基本都能做到只“声明能力”,不“编写代码”,提升开发效率的同时,降低了bug概率。但,在两者结合使用时,就需要编写实现代码,将能力粘合起来。
在日常开发中,一个查询请求主要由以下几部分组成:
在lego框架中,三个步骤都提供了相应的组件进行支持,以一个订单分页查询为例:
- public Page<OrderDetail> pageByUserId(@Valid @NotNull(message = "查询参数不能为 null") PageByUserId query) {
- Page<OrderDetail> orderDetailPage = this.orderQueryRepository.pageOf(query, OrderDetail::new);
- if (orderDetailPage.hasContent()){
- this.joinService.joinInMemory(orderDetailPage.getContent());
- }
- return orderDetailPage;
- }
- @Data
- public class PageByUserId {
- @NotNull(message = "user id 不能为 null")
- @FieldEqualTo("userId")
- private Long userId;
- private Pageable pageable;
- }
- @Data
- public class OrderDetail {
- private Order order;
- @JoinItemByOrder(keyFromSourceData = "#{order.id}")
- private List<OrderItem> orderItems;
- public OrderDetail(Order order){
- this.order = order;
- }
- }
查询三大步骤均基于“声明式注解”通过描述的方式进行实现,然后通过 编码 的方式完成主流程。
仔细观察主流程,会发现这是一套标准的“模板代码”,重复枯燥、没有业务价值,像这样有规律的“重复”代码,就应交由框架实现。
构建声明式 QueryService,只需定义方法,无需编写实现代码,便能完成大多数场景的数据查询。
组件应具有如下特性:
设计目标与 Spring Data 的设计理念高度相似,QueryService 组件在实现上进行了借鉴,在使用上也与 Spring Data 保存一致,以降低使用门槛。