spring data 简介(二)

版权声明:如果觉得好的话,不防点个赞,那点你们认为不对或是需要补充,可以留言啊!本人原创,未经允许不得转载!! https://blog.csdn.net/qq_28289405/article/details/82419592

目录

Spring Data @query 注解

使用@query原因

Spring Data @Modifting 注解和事务

SpringData_CrudRepository接口

SpringData_PagingAndSortingRespository接口


Spring Data @query 注解

使用@query原因

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

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

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

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

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

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

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

SpringData 允许在占位符上添加%

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

SpringData 命名参数

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

做测试:

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

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

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

测试:

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

Spring Data @Modifting 注解和事务

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

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

service层

测试:

SpringData_CrudRepository接口

改 接口

public interface PersonRepository extends CrudRepository<Person, Integer>{

}

service 层

测试:

SpringData_PagingAndSortingRespository接口

改接口:

public interface PersonRepository extends PagingAndSortingRepository<Person, Integer>{

}

测试:

    //分页、排序
	public  void testPagingAndSortingRespository(){
		//pageNo 从0开始
		int pageNo = 3 -1 ;
		int pageSize = 5;
		//pageable 接口通常使用的器PageRequest 实现类,其中封装了需要分页的信息
		//排序相关的,sort 封装了排序的信息
		//Order 是具体针对于某一个属性进行升序还是降序
		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 = personRepository.findAll(pageable);
		
		System.out.println("总记录数:" + page.getTotalElements());
		System.out.println("总页数 :" + page.getTotalPages());
		System.out.println("当前页面的List :"+page.getContent());
		System.out.println("当前第几页:" +page.getNumber() +1 );
		System.out.println("当前页面的记录数:" + page.getNumberOfElements());
	}

结果:

      

猜你喜欢

转载自blog.csdn.net/qq_28289405/article/details/82419592