SpringData系列六: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();//删除所有实体,不用或慎用。

测试:
修改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());
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值