认识JPA的接口
前言
JPA提供了操作数据库的接口。在开发过程中继承和使用这些接口,可简化现有的持久化开发工作。可以使Spring 找到自定义接口,并生成代理类,后续可以把自定义接口注入Spring容器中进行管理。在自定义接口过程中,可以不写相关的SQL操作,由代理自动生成。
JPA接口JpaRepository
JpaRepository 继承自 PagingAndSortingRepository。该接口提供了JPA的相关实用功能。以及通过Example进行查询的功能。Example对象是JPA提供用来构造查询条件的对象。该接口的关键代码如下:
public interface JpaRepository <T, ID> extends PagingAndSortingRepository<T, ID>,QueryByExampleExecutor<T> {}
在上述代码中,T表示实体对象,ID表示主键。ID必须实现序列化。
JpaRepository提供的方法
方法 | 描述 |
---|---|
List< T > findAll(); | 查询所有实体 |
List< T > findAll(Sort var1) | 排序、查找所有实体 |
List< T > findAllById( Iterable< ID > var1 ); | 返回制定一组ID的实体 |
< S extends T >List< S > saveAll( Iterable< S > var1) | 保存集合 |
void flush | 执行缓存与数据库同步 |
< S extends T > S saveAndFlush( S var1 ) | 强制执行持久化 |
void deleteInBatch( Iterable< T > var1 ) | 删除一个实体集合 |
void deleteAllInBatch() | 删除所有实体 |
T getOne( ID var1 ) | 返回ID对应的实体。如果不存在,则返回空值 |
< S extends T >List< S > findAll(Example< S > var1) | 查询满足Example的所有对象 |
< S extends T > List< S > findAll( Example< S > var1, Sort var2 ) | 查询满足Example的所有对象,并且进行排序返回 |
分页排序接口 PagingAndSortingRepository
PagingAndSortingRepository继承自CurdRepository提供的分页和排序方法。其关键代码如下。
@NoRepositoryBean
public interface PagingAndSortingRepository< T,ID >extendsCurdRepository<T,ID>{
Iterable<T> findAll(Sort var1);
Page<T> findAll(Pageable var1);
}
其中两种方法:
- Iterable< T > findAll(Sort sort);排序功能。它按照“sort”制定的排序返回数据
- Page findAll(Pageable pageable):分页查询(含排序功能)
数据操作接口 CurdRepository
CurdRepository接口继承自Repository接口,并新增了增加、删除、修改和查询方法。CurdRepository提供的方法见下表。
方法 | 说明 |
---|---|
< S extends T> S save(S entity) | 保存实体。当实体中包含主键时,JPA会进行更新操作 |
< S extends T > Iterable< S > saveAll( Iterable< S > entities ) | 保存所有实体。实体必须不为空 |
“Optional< T > findById(ID id)” | 根据主键id 检索实体 |
“boolean exstsById(ID id)” | 根据主键id检索实体,并返回是否存在。值为布尔类型 |
Iterable < T > findAll | 返回所有实体 |
Iterable< T > findAllById(Iterable< ID > ids) | 根据给定的一组id值返回一组实体 |
long count() | 返回实体的数量 |
void deleteById(ID id) | 根据id删除数据 |
void delete(T entity) | 删除给定实体 |
void deleteAll(Iterable< ? entends T > entities) | 删除实体 |
void deleteAll() | 删除所有实体 |
分页接口Pageable 和 Page
Pageable 接口用于构造翻页查询,返回Page对象。Page从0开始分页。
例:可以通过以下代码来构建文章的翻页查询参数
@RequestMapping("/article")
public ModelAndView articlelist(@RequestParam(value = "start", defaultValue = "0") Integer start,
@RequestParam(value = "limit", defaultValue = "5") Integer limit) {
start = start < 0 ? 0 : start;
Sort sort = Sort.by(Sort.Direction.DESC, "id");
Pageable pageable = PageRequest.of(start, limit, sort);
Page<Article> page = articleRepository.findAll(pageable);
ModelAndView mav = new ModelAndView("article/list");
mav.addObject("page", page);
return mav;
}
然后,在调用它的参数获取总页数、上一页、下一页和末页,代码如下:
<div>
<a th:href="@{/article(start=0)}">[首页]</a>
<a th:if="${not page.isFirst()}" th:href="@{/article(start=${page.number-1})}">[上页]</a>
<a th:if="${not page.isLast()}" th:href="@{/article(start=${page.number+1})}">[下页]</a>
<a th:href="@{/article(start=${page.totalPages-1})}">[末页]</a>
</div>
排序类Sort
Sort类专门用来处理排序。最简单的排序就是先传入一个属性列,然后根据属性列的值进行排序。默认情况下是升序排列。它还可以根据提供多个字段属性值进行排序。例如以下代码是通过Sort.Order对象的List集合来创建Sort对象的:
List<Sort.Order> orders = new ArrayList<>();
orders.add(new Sort.Order(Sort.Direction.DESC,"id"));
orders.add(new Sort.Order(Sort.Direction.ASC,"view"));
Pageable pageable = PageRequest.of(start,limit,sort);
Pageable pageable1 = PageRequest.of(start,limit,Sort.by(orders));
Sort排序的方法有以下几种
- 直接创建Sort对象,适合对单一属性做排序
- 通过Sort.Order对象创建Sort对象,适合对单一对象做排序
- 通过属性的List集合创建Sort对象,适合所有情况,比较容易设置排序方式
- 忽略大小写排序
- 使用JpaSort.unsafe进行排序
- 使用聚合函数进行排序