1. 程式人生 > >Spring Data——Repository的子介面

Spring Data——Repository的子介面

1.CrudRepository 介面:

CrudRepository 介面提供了最基本的對實體類的添刪改查操作 

T save(T entity);//儲存單個實體 

Iterable<T> save(Iterable<? extends T> entities);//儲存集合       

T findOne(ID id);//根據id查詢實體        

boolean exists(ID id);//根據id判斷實體是否存在        

Iterable<T> findAll();//查詢所有實體,不用或慎用!        

long count();//查詢實體數量        

void delete(ID id);//根據Id刪除實體        

void delete(T entity);//刪除一個實體 

void delete(Iterable<? extends T> entities);//刪除一個實體的集合        

void deleteAll();//刪除所有實體,不用或慎用! 

@Test
	public void testCrudReposiory(){
		List<Person> persons = new ArrayList<>();
		
		for(int i = 'a'; i <= 'z'; i++){
			Person person = new Person();
			person.setAddressId(i + 1);
			person.setBirth(new Date());
			person.setEmail((char)i + "" + (char)i + "@atguigu.com");
			person.setLastName((char)i + "" + (char)i);
			
			persons.add(person);
		}
		
		personService.savePersons(persons);
	}

2.PagingAndSortingRepository介面:

該介面提供了分頁與排序功能

Iterable<T> findAll(Sort sort); //排序

Page<T> findAll(Pageable pageable); //分頁查詢(含排序功能)

@Test
	public void testPagingAndSortingRespository(){
		int pageNo = 6 - 1;
		int pageSize = 5;
		Order order1 = new Order(Direction.DESC, "id");
		Order order2 = new Order(Direction.ASC, "email");
		Sort sort = new Sort(order1, order2);
		
		PageRequest pageable = new PageRequest(pageNo, pageSize, sort);
		Page<Person> page = personRepsotory.findAll(pageable);
		
		System.out.println(page.getTotalElements());
		System.out.println(page.getNumber());
		System.out.println(page.getTotalPages());
		System.out.println(page.getContent());
		System.out.println(page.getNumberOfElements());
	}

3.JpaRepository介面:

該介面提供了JPA的相關功能

List<T> findAll(); //查詢所有實體

List<T> findAll(Sort sort); //排序、查詢所有實體

List<T> save(Iterable<? extends T> entities);//儲存集合

void flush();//執行快取與資料庫同步

T saveAndFlush(T entity);//強制執行持久化

void deleteInBatch(Iterable<T> entities);//刪除一個實體集合

@Test
	public void testJpaRepository(){
		Person person = new Person();
		person.setBirth(new Date());
		person.setEmail("[email protected]");
		person.setLastName("xyz");
		person.setId(28);
		
        //類似於merge
		Person person2 = personRepsotory.saveAndFlush(person);
		
		System.out.println(person == person2);
	}

4.JpaSpecificationExecutor介面:

不屬於Repository體系,實現一組 JPA Criteria 查詢相關的方法 

 

Specification:封裝  JPA Criteria 查詢條件。通常使用匿名內部類的方式來建立該介面的物件

public interface PersonRepsotory extends 
	JpaRepository<Person, Integer>,
	JpaSpecificationExecutor<Person>{
...
}
/**
* 實現帶查詢條件的的分頁,id>5為條件
* 呼叫JpaSpecificationExecutor的Page<T> findAll(Specification<T> spec, Pageable pageable);
* Specification 封裝了JPA Criteria查詢的查詢條件
* Pageable 封裝了請求分頁的資訊:pageNo,pageSize,Sort
*/
@Test
	public void testJpaSpecificationExecutor(){
		int pageNo = 3 - 1;
		int pageSize = 5;
		PageRequest pageable = new PageRequest(pageNo, pageSize);
		
        //通常使用Specification的匿名內部類
		Specification<Person> specification = new Specification<Person>() {
            /**
            * root 代表查詢的實體
            * query 可以從中得到Root物件,即告訴Criteria查詢要查詢哪個實體類,還可以來新增查詢條件,還可以結合EntityManager物件得到最終查詢的TypeQuery物件
            * cb 用於建立Criteria相關物件的工廠,可以從中獲取到Predicate物件
            */
			@Override
			public Predicate toPredicate(Root<Person> root,
					CriteriaQuery<?> query, CriteriaBuilder cb) {
				Path path = root.get("id");
				Predicate predicate = cb.gt(path, 5);
				return predicate;
			}
		};
		
		Page<Person> page = personRepsotory.findAll(specification, pageable);
		
		System.out.println(page.getTotalElements());
		System.out.println((page.getNumber() + 1));
		System.out.println(page.getTotalPages());
		System.out.println(page.getContent());
}

5.自定義 Repository 方法:

5.1 為某一個 Repository 上新增自定義方法:

步驟:

定義一個介面: 宣告要新增的, 並自實現的方法

提供該介面的實現類: 類名需在要宣告的 Repository 後新增 Impl, 並實現方法

宣告 Repository 介面, 並繼承 1) 宣告的介面

使用.

注意:預設情況下, Spring Data 會在 base-package 中查詢 "介面名Impl" 作為實現類. 也可以通過 repository-impl-postfix 聲明後綴.

package com.atguigu.springdata;

public interface PersonDao {
	
	void test();
	
}
package com.atguigu.springdata;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

public class PersonRepsotoryImpl implements PersonDao {
	
	@PersistenceContext
	private EntityManager entityManager;
	
	@Override
	public void test() {
		Person person = entityManager.find(Person.class, 11);
		System.out.println("-->" + person);
	}

}
public interface PersonRepsotory extends 
	JpaRepository<Person, Integer>,
	JpaSpecificationExecutor<Person>, PersonDao{}
@Test
	public void testCustomRepositoryMethod(){
		personRepsotory.test();
	}

5.2 為所有的 Repository 都新增自實現的方法:

步驟:

宣告一個介面, 在該介面中宣告需要自定義的方法, 且該介面需要繼承 Spring Data 的 Repository.

提供 1) 所宣告的介面的實現類. 且繼承 SimpleJpaRepository, 並提供方法的實現

定義 JpaRepositoryFactoryBean 的實現類, 使其生成 1) 定義的介面實現類的物件

修改 <jpa:repositories /> 節點的 factory-class 屬性指向 3) 的全類名

注意: 全域性的擴充套件實現類不要用 Imp 作為字尾名, 或為全域性擴充套件介面新增 @NoRepositoryBean 註解告知  Spring Data:Spring Data 不把其作為 Repository