BaseRepository 用法指南

2024-03-09 08:32

本文主要是介绍BaseRepository 用法指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

8-7 BaseRepository API
本文将通过讲解+测试来一一列举BaseRepository的用法与特点。


一、使用流程

在理解使用的每一步意义之前,我们先来了解一下整体使用过程。
本章节将通过描述对Article类的查询来进行。
查询条件为:

  1. 根据userId来查找
  2. 根据title来全模糊匹配
  3. 根据descr来左模糊匹配
  4. 进行分页,每页2条数据,查找第2页内容
  5. 正序排序

1.1 搭建使用环境


1.1.1 引入框架源码

引入这些类,这些类是我们的封装JPA框架的底层代码。
在这里插入图片描述

1.1.2 修改主启动类

加上这个注解,标识我们使用我们自己的BaseRepositoryFactoryBean来生成我们自己的RepositoryBean。
在这里插入图片描述


1.2 写查询类(Qo)


查询类是我们条件的集合对象,我们通过书写查询类来实现条件查询。

1.2.1 创建Qo对象 ArticleQo
  • 如果需要分页和排序就继承DataQueryObejctPage对象
  • 如果仅需要排序就继承DataQueryObjectSort对象
  • 如果仅需要分页,也应继承DataQueryObjectPage对象
  • 如果不需要分页和排序就谁都不用继承
    但最好还是继承DataQueryObejctPage对象,因为他继承了DataQueryObjectSort对象,啥都有。
public class ArticleQo extends DataQueryObjectPage
{@QueryField(type = QueryType.EQUAL, name ={ "userId" })private Integer userId;@QueryField(type = QueryType.FULL_LIKE, name = "title")private String title;@QueryField(type = QueryType.LEFT_LIKE, name = "descr")private String descr;public String getTitle(){return title;}public void setTitle(String title){this.title = title;}public Integer getUserId(){return userId;}public void setUserId(Integer userId){this.userId = userId;}public String getDesrc(){return descr;}public void setDesrc(String descr){this.descr = descr;}
}

1.3 创建ArticleRepository


@Repository
public interface ArticleRepository extends BaseRepository<Article, Integer>
{}

1.4 写service


    @Overridepublic Page<Article> findByUserAndLikeMatcher(ArticleQo qo){Page<Article> articles = repository.findAll(qo);return articles;}

1.5 写controller


    @RequestMapping("/test")public ModelAndView test(String qoJsonStr){return feedBack(articleService.findByUserAndLikeMatcher(parseModel(qoJsonStr, new ArticleQo())));}

1.6 测试


在这里插入图片描述
传入的JSON字符串为:

{"userId":1,"title":"a","descr":"j","pageSize":3,"pageNumber":2,"sortAscending":true
}

为何我们可以写pageSize,sortAscending等属性作为Article值?
因为Qo继承了DataQueryObjectPage,DataQueryObjectPage继承了DataQueryObjectSort。这些属性都有它的默认值,我们可以修改。

二、BaseRepository接口提供持久层服务

我们可以通过该接口查看持久方法,我们在使用这些接口的时候要考虑

  1. 我么需要提供什么参数
  2. 得到的返回值类型
	// 普通查询List<T> findAll(DataQueryObject query);// 分页查询,结果为List集合List<T> findAllForList(DataQueryObjectPage query);// 自定义分页器的分页查询,结果为分页对象Page<T> findAll(DataQueryObject query, Pageable page);// 分页查询,结果为分页对象Page<T> findAll(DataQueryObjectPage dataQueryObjectpage);// 自定义排序查询List<T> findAll(DataQueryObject dataQueryObject, Sort sort);// 排序查询List<T> findAll(DataQueryObjectSort dataQueryObjectSort);

三、DataQueryObject接口实现类的继承链

综上,我们可以看到,我们想要使用BaseRepository接口提供的服务,我们需要提供DataQueryObject或其实现类作为参数,而这也是我们构造的Qo对象需要继承他们的原因。


3.1 DataQueryObject接口


DataQueryObeject是一个空接口,做为最上层抽象不提供任何配置。目的是为了不同实现类的统一管理。我们可以通过修改其属性来修改查询的默认配置。


3.2 DataQueryObjectSort


DataQueryObjectSort实现了DataQueryObject接口提供了排序相关的配置。

	protected String sortPropertyName = "id";protected boolean sortAscending = false;

3.3 DataQueryObjectPage


DataQueryObjectPage继承了DataQueryObjectSort,因此具备排序相关的属性。并且提供了分页相关的配置。

	protected Integer pageNumber = 1;protected Integer pageSize = Constants.PAGESIZE_MIN;

四、Qo类的写法

Qo类是我们用法的核心,理解Qo类的用法规则,是我们能够灵活运用BaseRepository框架的基础。
首先,我们需要实现DataQueryObejct或继承它的子类来最为查询服务的参数(条件),具体需要哪种服务要根据继承的类来确定。并且自动拥有他们的默认配置属性。


4.1 写哪些属性?


需要查询什么字段就写哪些属性。


4.2 怎么写条件?


通过@QueryField注解中的type属性,写查询的条件


4.3 如何与实体中的属性进行匹配


通过@QueryField注解中的name属性,进行匹配。

注意,这个name属性是一个String数组,意味着我们可以对多个字段进行匹配。
比如说我想查询:title、desrc、content某一个包含某个字符串的时候,我可以这样写

@QueryField(type = QueryType.FULL_LIKE, name ={ "title", "descr", "content" })
private String sea; // 这个属性名的值最为查询的条件,所以名字无所谓,但最好不要像我这样胡写。

测试结果:
在这里插入图片描述


4.4 QueryType


QueryType为我们提供了许多条件,我们来一起看看每种条件的用法吧

    EQUAL(false), BEWTEEN(false), LESS_THAN(false), LESS_THAN_EQUAL(false), GREATEROR_THAN(false), GREATEROR_THAN_EQUAL(false), NOT_EQUAL(false), IS_NULL(true), IS_NOT_NULL(true), RIGHT_LIKE(false), LEFT_LIKE(false), FULL_LIKE(false), BATCH_FULL_LIKE(false), DEFAULT_LIKE(false),NOT_LIKE(false), IN(false);

每种条件都有一个值(注解下的那个属性值)可否为空的判断,但是源码中并没有做相应的处理而是直接跳过去,所以我们不必去关注。
我将把 @QueryField注解下的字段称为条件字段、对应的实体类中的字段称为被验证字段,来进行下面的讲解。

  • EQUAL:相等比较。
  • BEWTEEN:被验证字段在某个范围之间。 被验证字段必须实现Comparable接口来进行排序。而且条件字段的类型必须继承QueryBetween。通过after和before指定在什么类型数据的什么范围中查找,才能使用BEWTEEN。特别注意:after相当于左区间临界值"[",before相当于右区间临界值"]",表示在…之后和在…之前的范围。

在这里插入图片描述在这里插入图片描述

  • 在这里插入图片描述
  • LESS_THAN:小于比较。要求与BETWEEN一样。 只用填写before属性
  • LESS_THAN_EQUAL:小于等于比较。要求与BETWEEN一样。 只用填写before属性。
  • GREATEROR_THAN:大于比较。要求与BETWEEN一样
  • GREATEROR_THAN_EQUAL:大于等于。
  • NOT_EQUAL:不等于。
  • IS_NULL:是否为空。必填项,如果条件字段没有内容,不对改字段进行判断。
  • IS_NOT_NULL:是否不为空。必填项,如果条件字段没有内容,不对改字段进行判断。
  • RIGHT_LIKE:右模糊。
  • LEFT_LIKE:左模糊。
  • FULL_LIKE:全模糊
  • BATCH_FULL_LIKE:批量全模糊,条件字段类型为List,对集合中每一项的值做全模糊查询,通过or连接。
  • DEFAULT_LIKE:自定义模糊查询,比如条件字段的值我们传:"%sdwerq^",自定义模糊规则。
  • NOT_LIKE:自定义模糊规则,返回没有被匹配到的。
  • IN:in查找。条件字段为List类型,将对name[0]中的queryFiled与List集合中的数据进行in比对,返回所有记录

除IN条件以外,以上所有条件均可以在name中填写多个被验证字段,与条件字段比较,并通过or连接。
以上所有的类型用法均是建立在测试成功的基础上描述的

附:点我了解BaseRepository封装SpringDataJpa原理

这篇关于BaseRepository 用法指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/790107

相关文章

c++中 unordered_map 与 unordered_set 用法指南

unordered_map 与 unordered_set 区别与联系 unordered_map 和 unordered_set 都是 C++ 标准模板库(STL)中的容器,它们使用哈希表作为底层数据结构,提供了快速的查找、插入和删除操作。下面是它们之间的联系与区别: 联系 底层实现:两者都基于哈希表实现,利用了哈希函数来分布元素。性能特点:它们都提供平均时间复杂度为 O(1) 的查找、插入

多语言异常处理用法指南

8-9 多语言异常架构初次分析 本文将以程序运行的顺序进行讲解,涉及到的方法都会解释。 末尾会整理所有用法,并列举可能出错的细节问题。 一、引入框架 1.1 基础架构 Exception相关 ServiceException…等自定义的ServiceException DefaultExceptionInterceptor 全局异常处理的地方,我们可以在这里指定哪些异常在

JavaScript Web Worker用法指南

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》 ​  ​ ✨ 前言         Web Worker可以将耗时任务放到后台执行,避免阻塞UI。本文将详细介绍Web Worker的用法,让你可以提升web应用性能。 通过本文你将学习: Web Worker的工作原理不同类型worker的区别w

CSDN-markdown编辑器用法指南

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入