通过 Spring Data JPA 操作数据库

Repository

**Repository<T, ID> 接口 **
使用@EnableJpaRepositories注解,会让帮我们自动的的发现有对应的CrudRepository、PagingAndSortingRepository或者JpaRepository这些接口的扩展

  • CrudRepository<T, ID>
  • PagingAndSortingRepository<T, ID>
  • JpaRepository<T, ID>

T为我们要指定的实体对象,ID的类型。
定义查询

  • find…By… / read…By… / query…By… / get…By…
    简单的查找
  • count…By…
    做计数的定义,返回一个count的值
  • …OrderBy…[Asc / Desc]
    查询返回有多个记录的,用OrderBy定义是按照是哪一个字段来做一个顺序或者降序的排列
  • And / Or / IgnoreCase
    多个条件下使用,与find…By… / read…By… / query…By… / get…By搭配
  • Top / First / Distinct

分页查询

  • PagingAndSortingRepository<T, ID>
  • Pageable / Sort
    排序Sort ,记录附页信息Pageable
  • Slice / Page

以一个例子来说明:

@Transactional//方法执行的时候开启一个事务
1.保存实体

Coffee latte = Coffee.builder().name("latte")
				.price(Money.of(CurrencyUnit.of("CNY"), 30.0))
				.build();
		coffeeRepository.save(latte);
		log.info("Coffee: {}", latte);

		Coffee espresso = Coffee.builder().name("espresso")
				.price(Money.of(CurrencyUnit.of("CNY"), 20.0))
				.build();
		coffeeRepository.save(espresso);
		log.info("Coffee: {}", espresso);

		CoffeeOrder order = CoffeeOrder.builder()
				.customer("Li Lei")
				.items(Collections.singletonList(espresso))
				.state(OrderState.INIT)
				.build();
		orderRepository.save(order);
		log.info("Order: {}", order);

		order = CoffeeOrder.builder()
				.customer("Li Lei")
				.items(Arrays.asList(espresso, latte))
				.state(OrderState.INIT)
				.build();
		orderRepository.save(order);
		log.info("Order: {}", order);

2.定义的接口

@NoRepositoryBean
public interface BaseRepository<T, Long> extends PagingAndSortingRepository<T, Long> {
    List<T> findTop3ByOrderByUpdateTimeDescIdAsc(); //按照UpdateTime做了降序的排序,按Id做了个升序的排序。
}

public interface CoffeeOrderRepository extends BaseRepository<CoffeeOrder, Long> {
    List<CoffeeOrder> findByCustomerOrderById(String customer);
    List<CoffeeOrder> findByItems_Name(String name);
}

public interface CoffeeRepository extends BaseRepository<Coffee, Long> {
}

3.查询实体

coffeeRepository
				.findAll(Sort.by(Sort.Direction.DESC, "id"))
				.forEach(c -> log.info("Loading {}", c));

		List<CoffeeOrder> list = orderRepository.findTop3ByOrderByUpdateTimeDescIdAsc();
		log.info("findTop3ByOrderByUpdateTimeDescIdAsc: {}", getJoinedOrderId(list));

		list = orderRepository.findByCustomerOrderById("Li Lei");
		log.info("findByCustomerOrderById: {}", getJoinedOrderId(list));

		// 不开启事务会因为没Session而报LazyInitializationException
		list.forEach(o -> {
			log.info("Order {}", o.getId());
			o.getItems().forEach(i -> log.info("  Item {}", i));
		});

		list = orderRepository.findByItems_Name("latte");
		log.info("findByItems_Name: {}", getJoinedOrderId(list));
发布了59 篇原创文章 · 获赞 6 · 访问量 986

猜你喜欢

转载自blog.csdn.net/weixin_43790623/article/details/102941334