本文主要是介绍BaseRepository 用法指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
8-7 BaseRepository API
本文将通过讲解+测试来一一列举BaseRepository的用法与特点。
一、使用流程
在理解使用的每一步意义之前,我们先来了解一下整体使用过程。
本章节将通过描述对Article类的查询来进行。
查询条件为:
- 根据userId来查找
- 根据title来全模糊匹配
- 根据descr来左模糊匹配
- 进行分页,每页2条数据,查找第2页内容
- 正序排序
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接口提供持久层服务
我们可以通过该接口查看持久方法,我们在使用这些接口的时候要考虑
- 我么需要提供什么参数
- 得到的返回值类型
// 普通查询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 用法指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!