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