SpringDataJpa相当于对jpa的再次封装,使开发效率更高
(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.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.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);