1. 程式人生 > >SpringDataJpa基礎篇2:Repository介面及子介面

SpringDataJpa基礎篇2:Repository介面及子介面

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);
}