Spring Data JPA中的七大接口和两大实现类

Spring Data JPA 中的七大接口和两大实现类

接口

*PS:都是在org.springframework.data.包中的。
Repository接口
CrudRepository接口
PagingAndSortingRepository接口
JpaRepository接口
QueryByExampleExecutor接口
JpaSpecificationExecutor接口
QueryDslPredicateExecutor接口

实现类

PS:都是在org.springframework.data.jpa.repository.support中
SimpleJpaRepository类
QueryDslJpaRepository类

结构关系图

结构关系图

接口源码部分
  1. Repository接口 这是一个最顶层的接口 org.springframework.data.repository
    @Indexed //Spring 提供的注解 加快启动速度  org.springframework.stereotype.Indexed
    public interface Repository<T, ID> {
    }
    
  2. CrudRepository接口 org.springframework.data.repository
    @NoRepositoryBean //确保将该注释添加到所有存储库接口中,Spring数据不应在运行时为其创建实例。
    public interface CrudRepository<T, ID> extends Repository<T, ID> {
    	/**
    	* 保存,没有Id的情况下是插入,有id的情况下是更新
    	*/.
    	<S extends T> S save(S entity);
    	/**
    	 * 批量保存
    	 */
    	<S extends T> Iterable<S> saveAll(Iterable<S> entities);
    	/**
    	 * 根据Id查找对象
    	 */
    	Optional<T> findById(ID id);
    	/**
    	 * 根据id判断对象是否存在,不存在时返回null
    	 */
    	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);
    	/**
    	 * 批量删除  集合对象 实际上是一条一条的删除 调用delete
    	 */
    	void deleteAll(Iterable<? extends T> entities);
    	/**
    	 * 删除所有 实际上也是一条一条的删除
    	 */
    	void deleteAll();
    }
    
  3. PagingAndSortingRepository接口 org.springframework.data.repository
    @NoRepositoryBean
    public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
    	/**
    	 * 增加了一个排序的功能 
    	 * org.springframework.data.domain.Sort
    	 * Sort.Direction.DESC|ASC 降序/升序
    	 * 这个排序的类 比较常用的一个方法是:
    	 * 	public Sort(Direction direction, String... properties) {
    	 *		this(direction, properties == null ? new ArrayList<>() : Arrays.asList(properties));
    	 * }
    	 * 第一个参数指定排序的方向,第二个参数是排序的属性字段
    	 */
    	Iterable<T> findAll(Sort sort);
    	/**
    	 * 增加了排序的功能和分页的功能
    	 * import org.springframework.data.domain.Page
      	 * import org.springframework.data.domain.Pageable
    	 */
    	Page<T> findAll(Pageable pageable);
    }
    
  4. QueryByExampleExecutor接口 org.springframework.data.repository.query
    public interface QueryByExampleExecutor<T> {
    	/**
    	 * 查找一个对象  
    	 * Optional类Java8的新特性 是一个可以为null的容器对象  java.util.Optional
    	 * 		Optional 是个容器:它可以保存类型T的值,或者仅仅保存null
    	 * Example类  org.springframework.data.domain.Example 这个也是可以存储null值的 
    	 * 		用于条件查询
    	 */
    	<S extends T> Optional<S> findOne(Example<S> example);
    	/**
    	 *  查找所有的对象
    	 */
    	<S extends T> Iterable<S> findAll(Example<S> example);
    	/**
    	 * 查找所有的对象,并且有排序功能
    	 */
    	<S extends T> Iterable<S> findAll(Example<S> example, Sort sort);
    	/**
    	 * 查找所有的对象,并且有排序和分页的功能
    	 */
    	<S extends T> Page<S> findAll(Example<S> example, Pageable pageable);
    	/**
    	 * 统计对象的数目
    	 */
    	<S extends T> long count(Example<S> example);
    	/**
    	 * 判断对象是否存在
    	 */
    	<S extends T> boolean exists(Example<S> example);
    }
    
  5. JpaRepository接口 org.springframework.data.jpa.repository
    @NoRepositoryBean
    public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    	/*
    	 * 查询所有对象  对原先返回的迭代器进行了一次封装,可以返回List
    	 */
    	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);
    	/**
    	 * 批量删除  集合对象 后台执行时,生成一条语句执行,用多个or条件
    	 */
    	void deleteInBatch(Iterable<T> entities);
    	/**
    	 * 删除所有对象 直接一条语句解决 delete from table_name
    	 */
    	void deleteAllInBatch();
    	/**
    	 * 根据Id查询,返回对象的引用,对象的引用,对象的引用 重要的事情说三遍
    	 */
    	T getOne(ID id);
    	/*
    	 * 根据实例查询所有对象
    	 */
    	@Override
    	<S extends T> List<S> findAll(Example<S> example);
    	/*
    	 * 根据实例查询所有对象,并且提供排序功能
    	 */
    	@Override
    	<S extends T> List<S> findAll(Example<S> example, Sort sort);
    }
    
  6. JpaSpecificationExecutor接口 org.springframework.data.jpa.repository
    public interface JpaSpecificationExecutor<T> {
    	/**
    	 * @Nullable 表示可为空 @NotNull表示不可为空
    	 * 提供动态查询的支持
    	 * 返回与给定动态规范匹配的单个实体,如果未找到,则返回Optional为null的对象。
    	 */
    	Optional<T> findOne(@Nullable Specification<T> spec);
    	/**
    	 * 返回与给定动态规范匹配的所有实体
    	 */
    	List<T> findAll(@Nullable Specification<T> spec);
    	/**
    	 * 返回与给定动态规范匹配的所有实体,并提供分页功能
    	 */
    	Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable);
    	/**
    	 * 返回与给定动态规范匹配的所有实体,并提供排序功能
    	 */
    	List<T> findAll(@Nullable Specification<T> spec, Sort sort);
    	/**
    	 *  返回与给定动态规范匹配的所有对象的总数
    	 */
    	long count(@Nullable Specification<T> spec);
    }
    
  7. QueryDslPredicateExecutor接口 org.springframework.data.querydsl
    public interface QuerydslPredicateExecutor<T> {
    	/**
    	 * 返回与给定条件匹配单个对象
    	 */
    	Optional<T> findOne(Predicate predicate);
    	/**
    	 * 返回与给定条件匹配的所有对象
    	 */
    	Iterable<T> findAll(Predicate predicate);
    	/**
    	 * 返回与给定条件匹配的所有对象,并提供排序功能
    	 */
    	Iterable<T> findAll(Predicate predicate, Sort sort);
    	/**
    	 * 返回与给定条件匹配的所有对象,并按照一定的顺序
    	 */
    	Iterable<T> findAll(Predicate predicate, OrderSpecifier<?>... orders);
    	/**
    	 * 返回给定顺序的所有对象
    	 */
    	Iterable<T> findAll(OrderSpecifier<?>... orders);
    	/**
    	 * 返回与给定条件匹配的所有对象,并提供分页功能
    	 */
    	Page<T> findAll(Predicate predicate, Pageable pageable);
    	/**
    	 * 返回与给定条件匹配的所有对象的总数
    	 */
    	long count(Predicate predicate);
    	/**
    	 * 判断与给定条件匹配的对象是否存在
    	 */
    	boolean exists(Predicate predicate);
    }
    
实现类
/**
*	对于只实现了接口,并且只定义了XXXRepository接口,而没有具体的实现类XXXRepositoryImpl的时候。
*	Spring Data JPA 的后台通过CGLIB的动态代理,其实@Repository 标注的DAO类,就是使用的这个类
*/
@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID>{
....
/**
*	这个已经被淘汰了....
*/
@Deprecated
public class QuerydslJpaRepository  <T, ID extends Serializable> extends SimpleJpaRepository<T, ID>
		implements QuerydslPredicateExecutor<T> {

也就是说这样:
public class QuerydslJpaRepository

对于接口中一些的方法定义规则,简化各种SQL代码的书写
KeyWordMeaningSampleSQL
And并且findByLastnameAndFirstnamewhere x.lastname = ?1 and x.firstname = ?2
OrfindByLastnameOrFirstnamewhere x.lastname = ?1 or x.firstname = ?2
Is,Equals等于findByFirstnameIs,findByFirstnameEqualswhere x.firstname = ?1
Between两者之间findByStartDateBetweenwhere x.startDate between ?1 and ?2
LessThan小于findByAgeLessThanwhere x.age < ?1
LessThanEqual小于等于findByAgeLessThanEqualwhere x.age <= ?1
GreaterThan大于findByAgeGreaterThanwhere x.age > ?1
GreaterThanEqual大于等于findByAgeGreaterThanEqualwhere x.age >= ?1
After之后(时间)>findByStartDateAfterwhere x.startDate >?1
Before之前(时间)<fingByStartDateBeforewhere x.startDate < ?1
IsNull等于nullfindByAgeIsNullwhere x.age is null
IsNotNull,NotNull不等于nullfindByAge(Is)NotNullwhere x.age not null
Like模糊查询,查询中需要自己加%findByFirstnameLikewhere x.firstname like ?1
NotLike不再模糊范围内,查询中需要自己jia%findByFirstnameNotLikewhere x.firstname not like ?1
StartingWith以某开头findByFirstnameStartingWithwhere x.firstname like ?1(parameter bound with appended %)
EndingWith以某结尾findByFirstnameEndingWithwhere x.firstname like ?1(parameter bound with prepended %)
Containing包含某fingByFirstnameContainingwhere x.firstname like ?1(parameter bound wrapped in %)
OrderBy排序fingByAgeOrderByLastNameDescwhere x.age = ?1 order by x.lastname desc
Not不等于findByLastnameNotwhere x.lastname <> ?1
In某范围内findByAgeIn(Collection ages)where x.age in ?1
NotIn某范围外findByAgeNotIn(Collection age)where x.age not in ?1
TRUEfindByActiveTrue()where x.active = true
FALSEfindByActiveFalse()where x.active = false
IgnoreCase忽略大小写findByFirstnameIgnoreCasewhere UPPER(x.firstname)=UPPER(?1)
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值