1、Repository接口概述
Repository接口是Spring Data的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法。
Spring Data可以让我们只定义接口,只要遵循 Spring Data的规范,就无需写实现类。与继承 Repository等价的一种方式,就是在持久层接口上使用@RepositoryDefinition注解,并为其指定domainClass和idClass 属性。如下两种方式是完全等价的。
package org.springframework.data.repository;
import org.springframework.stereotype.Indexed;
/**
*<T, ID>中的T表示实体类的类型,ID表示注解的类型
*/
@Indexed
public interface Repository<T, ID> {
}
2、Repository的子接口
基础的Repository提供了最基本的数据访问功能,Repository接口仅仅是一个标识,表明任何继承它的均为仓库接口类。
Repository接口的子接口:
(1)CrudRepository接口:继承Repository接口,实现了一组CRUD相关的方法;
(2)PagingAndSortingRepository接口:继承CrudRepository接口,实现了一组分页排序相关的方法;
(3)JpaRepository接口:继承 PagingAndSortingRepository接口,实现一组 JPA 规范相关的方法;
(4)JpaSpecificationExecutor接口:不属于Repository体系,实现一组 JPA Criteria 查询相关的方法。
3、CrudRepository接口
package org.springframework.data.repository;
import java.util.Optional;
/**
* CrudRepository接口继承Repository接口
*/
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
//保存一个实体类
<S extends T> S save(S entity);
//保存一个集合
<S extends T> Iterable<S> saveAll(Iterable<S> entities);
//根据主键id查询得到一个集合
Optional<T> findById(ID id);
// 主键id是否存在
boolean existsById(ID id);
//查询所有的
Iterable<T> findAll();
//根据id集合获取一个集合
Iterable<T> findAllById(Iterable<ID> ids);
//统计数量
long count();
//根据主键id删除
void deleteById(ID id);
//根据实体类删除
void delete(T entity);
//根据实体类集合删除多个
void deleteAll(Iterable<? extends T> entities);
//删除所有
void deleteAll();
}
4、PagingAndSortingRepository接口
package org.springframework.data.repository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
/**
*
* @see Sort排序
* @see Pageable分页类
* @see Page 分页对象
*/
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
//查询所有并排序
Iterable<T> findAll(Sort sort);
/**
*
* @param pageable
* @return返回一个Page对象的一个实体
*/
Page<T> findAll(Pageable pageable);
}
【注意】其实Pageable 对象已经包含了排序Sort 的信息。
5、JpaRepository接口
package org.springframework.data.jpa.repository;
import java.util.List;
import javax.persistence.EntityManager;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
/*
* 获得所有实体类集合
*/
List<T> findAll();
/*
* 获得所有实体类集合并对其内容进行排序
*/
List<T> findAll(Sort sort);
/*
* 根据主键id集合获取所有实体类集合
*/
List<T> findAllById(Iterable<ID> ids);
<S extends T> List<S> saveAll(Iterable<S> entities);
void flush();
<S extends T> S saveAndFlush(S entity);
void deleteInBatch(Iterable<T> entities);
void deleteAllInBatch();
/*
* 根据主键id获取实体类
*/
T getOne(ID id);
/*
* 继承PagingAndSortingRepository类的方法
*/
@Override
<S extends T> List<S> findAll(Example<S> example);
/*
* 继承PagingAndSortingRepository类的方法
*/
@Override
<S extends T> List<S> findAll(Example<S> example, Sort sort);
}