spring data 简介(二)

r囧r小猫 2022-05-14 08:18 254阅读 0赞

目录

Spring Data @query 注解

使用@query原因

Spring Data @Modifting 注解和事务

SpringData_CrudRepository接口

SpringData_PagingAndSortingRespository接口


Spring Data @query 注解

使用@query原因

1、使用命名查询,方法简单,含义明确;但是方法名过长,不能实现复杂查询

2、子查询 max 、min 、 avg 、count 等 【自定义JPQL , 语句可以更灵活的查询】

为@query 注解传递参数的方式1:使用占位符

  1. //注解查询 自定义PSQL语句
  2. @Query("select p from person p where p.lastName = ?1 and p.email = ?2")
  3. List<Person> testQueryAnnonationParams1(String lastName ,String email);

这种话方法有一个不好的点是,语句里的lastName和email必须对应 参数

为@query 注解传递参数的方式2:命名参数的方式

  1. @Query("select p from person p where p.lastName= :lastName and p.email= :email")
  2. List<Person> testQueryAnnonationParams2(@Param("email") String email,@Param("lastName") String lastName );

SpringData 允许在占位符上添加%

  1. @Query("select p from person p where p.lastName like %?1% or p.email like %?2%")
  2. List<Person> testQueryAnnonationLikeParams(String lastName, String email);

SpringData 命名参数

  1. @Query("select p from person p where p.lastName like %:lastName% or p.email like %:email%")
  2. List<Person> testQueryAnnonationLikeParams2(@Param("email") String email,@Param("lastName") String lastName );

做测试:

  1. //like 允许在占位符上添加%
  2. @Test
  3. public void testQueryAnnonationLikeParams(){
  4. //List<Person> persons = personRepository.testQueryAnnonationLikeParams("A", "bb");
  5. //System.out.println(persons);
  6. List<Person> persons = personRepository.testQueryAnnonationLikeParams2( "bb","A");
  7. System.out.println(persons);
  8. }

设置nativeQuery=true 既可以使用原生SQL查询

  1. @Query(value="select count(id) from jpa_persons" ,nativeQuery=true)
  2. long getTotalCount();

测试:

  1. //设置nativeQuery=true 既可以使用原生SQL查询
  2. @Test
  3. public void getTotalCount(){
  4. long count = personRepository.getTotalCount();
  5. System.out.println(count);
  6. }

Spring Data @Modifting 注解和事务

①、可以通过自定义的JPQL完成update和delete的操作 ,注意:JPQL不支持使用 insert
②、在 @Query 注解中编写JPQL语句,但必须使用@Modifying 进行修饰,以通知SpringData ,这是一个update或delete 操作
③、update 或delete 操作需要使用事务,此时需要定义service 层,在service层的方法上添加事务操作
④、默认情况下,springdata 的每个方法上有事务,但是都是只读事务,他们不能完成修改操作!需要定义service层

  1. @Modifying
  2. @Query("update person p set p.email =: email where id=: id")
  3. void updatePersonEmail(@Param("id") Integer id,@Param("email") String email);

service层

" class="reference-link">70

测试:

70 1

SpringData_CrudRepository接口

70 2

改 接口

  1. public interface PersonRepository extends CrudRepository<Person, Integer>{
  2. }

service 层

70 3

测试:

70 4

SpringData_PagingAndSortingRespository接口

70 5

改接口:

  1. public interface PersonRepository extends PagingAndSortingRepository<Person, Integer>{
  2. }

测试:

  1. //分页、排序
  2. public void testPagingAndSortingRespository(){
  3. //pageNo 从0开始
  4. int pageNo = 3 -1 ;
  5. int pageSize = 5;
  6. //pageable 接口通常使用的器PageRequest 实现类,其中封装了需要分页的信息
  7. //排序相关的,sort 封装了排序的信息
  8. //Order 是具体针对于某一个属性进行升序还是降序
  9. Order order1 = new Order(Direction.DESC, "id");
  10. Order order2 = new Order(Direction.ASC, "email");
  11. Sort sort = new Sort(order1 , order2);
  12. PageRequest pageable = new PageRequest(pageNo, pageSize,sort);
  13. Page<Person> page = personRepository.findAll(pageable);
  14. System.out.println("总记录数:" + page.getTotalElements());
  15. System.out.println("总页数 :" + page.getTotalPages());
  16. System.out.println("当前页面的List :"+page.getContent());
  17. System.out.println("当前第几页:" +page.getNumber() +1 );
  18. System.out.println("当前页面的记录数:" + page.getNumberOfElements());
  19. }

结果:

70 6

以上是从某视频处所学!

发表评论

表情:
评论列表 (有 0 条评论,254人围观)

还没有评论,来说两句吧...

相关阅读