spring data 简介(二)
目录
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层
" class="reference-link">
测试:
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());
}
结果:
以上是从某视频处所学!
还没有评论,来说两句吧...