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();
//删除所有实体,不用或慎用。
测试:
修改PersonRepsotory去继承CrudRepository接口
public interface PersonRepsotory extends CrudRepository<Person, Integer> {
}
@Test
public void testCrudReposiory(){
List<Person> persons = new ArrayList<>();
Person person = new Person();
person.setBirth(new Date());
person.setEmail("lizq@atguigu.com");
person.setLastName("lizq");
persons.add(person);
personService.savePersons(persons);
}
2、PagingAndSortingRepository接口
该接口提供了分页与排序功能。
Iterable<T> findAll(Sort sort);
//排序。
Page<T> findAll(Pageable pageable);
//分页查询。(含排序功能)
测试:
修改PersonRepsotory去继承PagingAndSortingRepository接口
public interface PersonRepsotory extends PagingAndSortingRepository<Person, Integer> {
}
@Test
public void testPagingAndSortingRespository(){
//pageNo 从 0 开始.
int pageNo = 6 - 1;
int pageSize = 5;
//Pageable 接口通常使用的其 PageRequest 实现类. 其中封装了需要分页的信息
//排序相关的. Sort 封装了排序的信息
//Order 是具体针对于某一个属性进行升序还是降序.
Sort.Order order1 = new Sort.Order(Sort.Direction.DESC, "id");
Sort.Order order2 = new Sort.Order(Sort.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() + 1));
System.out.println("总页数: " + page.getTotalPages());
System.out.println("当前页面的 List: " + 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);
//删除一个实体集合。
测试:
修改PersonRepsotory去继承PagingAndSortingRepository接口
public interface PersonRepsotory extends JpaRepository<Person, Integer> {
}
@Test
public void testJpaRepository(){
Person person = new Person();
person.setBirth(new Date());
person.setEmail("xy@atguigu.com");
person.setLastName("xyz");
person.setId(28);
Person person2 = personRepsotory.saveAndFlush(person);
System.out.println(person == person2);
}
4、JpaSpecificationExecutor接口
不属于Repository体系,实现了一组 JPA Criteria 查询相关的方法。
Specification:封装 JPA Criteria 查询条件。通常使用匿名内部类的方式来创建该接口的对象。
测试:
修改PersonRepsotory去继承JpaSpecificationExecutor接口
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>() {
/**
* @param *root: 代表查询的实体类.
* @param query: 可以从中可到 Root 对象, 即告知 JPA Criteria 查询要查询哪一个实体类. 还可以
* 来添加查询条件, 还可以结合 EntityManager 对象得到最终查询的 TypedQuery 对象.
* @param *cb: CriteriaBuilder 对象. 用于创建 Criteria 相关对象的工厂. 当然可以从中获取到 Predicate 对象
* @return: *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("当前页面的 List: " + page.getContent());
System.out.println("当前页面的记录数: " + page.getNumberOfElements());
}