DDD死党:单引擎查询利器( 六 )


直接继承BaseSpecificationQueryObjectRepository,注入 JpaSpecificationExecutor 和 实体对象即可,具体如下:
public class JpaBasedQueryRepository extends BaseSpecificationQueryObjectRepository {// 注入 JpaUserRepository 和 specificationConverterFactory(框架自动生成)public JpaBasedQueryRepository(JpaUserRepository userRepository,SpecificationConverterFactoryspecificationConverterFactory) {// 指定实体对象 JpaUsersuper(userRepository, JpaUser.class, specificationConverterFactory);}}整体架构如下:

DDD死党:单引擎查询利器

文章插图
核心流程如下:
  • SpecificationConverter 将输入的 QueryObject 转换为 Specification、Pageable、Sort等实例 。
  • 使用 SpecificationExecutor 实例的查询方法获取返回值 。
  • 返回值通过 ResultConverter 将 Entity 转换为最终结果 。
其中,从 QueryObject 到相关输入参数的转换为框架的核心,主要包括如下几部分:
  • Pageable 。从 QueryObject 中读取 Pageable 属性,并转化为 Spring data 的 Pageable 实例 。
  • Sort 。从 QueryObject 中读取 Sort 属性,并转换为Spring data 的 Sort 实例 。
  • 过滤注解 。遍历 QueryObject 中属性,根据注解查找到注解处理器,由注解处理器将其转化为 Predicate 实例,最终封装为 Specification 示例 。
4、小结本文从一个日常开发场景出发,提出两个关键问题:
  • 代码过于繁琐,容易出错,同时开发效率低下 。
  • 对性能设计关注不足,容易遗漏,产生性能问题 。
对于性能问题,从 MySQL B+Tree 进行推演 , 总结出该场景下的最佳使用实践,并将其提取为规范 。
对于代码繁琐问题,提出通过在 QueryObject 上增加注解的方式来实现简单查询 。
两者相结合,便形成了 Single Query 框架:
  • 提供一套注解,应用于 QueryObject 之上,以声明化的方式完成查询定义 。
  • 提供一套API,以 QueryObject 作为参数,提供 单条、批量、统计、分页等查询 。
  • 提供MyBatis和Jpa两套实现 , 快速实现 QueryObjectRepository,以提升开发速度 。

【DDD死党:单引擎查询利器】


推荐阅读