SpringDataJpa

西门安民
2023-12-01

1、SpringDataJpa概念

    SpringDataJpa相当于对jpa的再次封装,使开发效率更高

2、JpaRepository 接口

(1) JpaRepository 是 SpringDataJpa里的一个接口
	 dao层继承JpaRepository 接口,里面把基本的crud和分页已经排序都写好了:

		/*
		参数1:crud需要操作的实体类
		参数2:主键类型
		*/
		public interface EmployeeRepository extends JpaRepository<Employee,Long>{
		//注意:基本的增删改查可以通过注入的Repository(dao层)直接调用,框架里面已经封装好了
		保存/修改方法:save()  //有id就是修改,没有就是保存
		删除:delete
		查询全部:findAll
		查询单个:findOne
		}
		
		
(2)@Quyer注解
		 Repository接口里面自定义查询语句(方法):
		
		①/*通过字段查询   findby必须要这样写(不用)
		类型 findBy字段名();*/
		
		②自定义方法,jpql语句
		样例:
					@Query("jpql语句")
					List<Employee> queryAll();  //自定义方法
		
		③原生sql语句
		@Query(nativeQuery = true,value = "sql语句")
			List<Employee> query04();

3、JpaSpecificationExecutor(用的少,他的扩展用的多)

3.1、概念:
Jpa规则执行者,SpringDataJpa提供的接口,主要用来做查询的操做,让jpa以面向对象的形式操做,实现不写sql语句

3.2 、使用

(1) Repository层继承这个接口(一般配合JpaRepository)使用

//里面的参数:需要操作的是哪个实体类
public interface EmployeeRepository extends JpaRepository<Employee,Long>,JpaSpecificationExecutor<Employee> {

}


(2) 分页+排序+高级查询
Sort sort = new Sort(Sort.Direction.DESC,"age");
	//参数1:第几页。 参数2:每页多少条数据
	Pageable pageable = new PageRequest(0,10,sort);

	//使用匿名类部类使用自定义查询规则。这个方法最终的到分页的数据
 	Page<Employee> page = employeeRepository.findAll(new Specification<Employee>() {
    	/*
     	*   root:可以得到需要操做的字段
CriteriaBuilder :得到需要将字段进行什么条件(模糊/大小于/不等于)的查询
     	*/
    	@Override
    	public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
        	Path username = root.get("username");
        	Path age = root.get("age");
        	//根据字段进行模糊查询
        	Predicate p1 = cb.like(username, "%1%");
        	//年龄要大于30岁的
        	Predicate p2 = cb.gt(age, 30);
        	//多个条件进行拼接,用and/or
        	Predicate predicate = cb.and(p1, p2);
        	return predicate;
    	}
	}, pageable);

4、jpa-spec插件(常用)

4.1、概念:
相当于将上面的JpaSpecificationExecutor在他的基础上进行了扩展

官网地址:https://github.com/wenhao/jpa-spec

4.2、使用

 1.导包
<!-- SpringData的擴展包 -->
<dependency>
  <groupId>com.github.wenhao</groupId>
  <artifactId>jpa-spec</artifactId>
  <version>3.1.1</version>
  <!-- 把所有的依賴都去掉 -->
  <exclusions>
    <exclusion>
      <groupId>*</groupId>
      <artifactId>*</artifactId>
    </exclusion>
  </exclusions>
</dependency>


2、根据查询全部的方法,里面使用
   //规定就是这样写
Specification<Employee> specification = Specifications.<Employee>and()
        //判断是否为空,或者是空字符串。如果有值,那么就执行后面的括号里面的代码
		//StringUtils:导lang3/lang包下面的
        .like(StringUtils.isNoneBlank(username),"需要进行模糊查询的字段名", "%模糊查询的值%")
        .gt(age!=null,"age", age)
        .build();  //结尾也是规则这样写

      //查询的规则的到查询出来的数据
List list =employeeRepository.findAll(specification);
 类似资料: