springdatejpa

1 springdatajpa

什么是springdatajpa:

​ springdata 这个项目 对于jpa进行封装,而形成一个springdatajpa的框架。封装之后,使用更加简单

1.1 SpringdataJpa 的crud(掌握)

用法:

​ (1)定义一个接口 继承 JpaRepository这个接口

public interface EmployeeRepository extends JpaRepository<Employee,Long>

JpaRepository这个接口有实现类来实现crud方法以及分页和排序等方法
新增/修改 save
新增和修改用的是同一个不过修改是要设置id
​ employeeRepository.save(employee)

查询 findOne

​ employeeRepository.findOne(id)

查询所有 findAll

​ employeeRepository.findAll()

删除 delete /deleteInBatch

employeeRepository.delete(id)

1.2 Springdatajpa的分页和排序

分页

//Pageable实现类的子类findAll中本来要求的数据类型是Pageable
        PageRequest pageRequest = new PageRequest(0, 10);
        //分页查询
        Page<Employee> all = employeeRepository.findAll(pageRequest);
        //总条数
        long totalElements = all.getTotalElements();
        //总页数
        int totalPages = all.getTotalPages();
        //当前页的所有数据
        List<Employee> content = all.getContent();
        //当前页数
        int number = all.getNumber();
        //每页条数
        int numberOfElements = all.getNumberOfElements();
        

排序

//前面是排序类型,后面是根据列来排序
        Sort orders = new Sort(Sort.Direction.DESC,"username");
        List<Employee> all = employeeRepository.findAll(orders);

分页和排序可以和用

Sort orders = new Sort(Sort.Direction.DESC,"username");
        PageRequest pageRequest = new PageRequest(0, 10, orders);
        //这里查询出的是的Employee实例
        Page<Employee> all = employeeRepository.findAll(pageRequest);
        for (Employee employee : all) {
            System.out.println(all);
        }

1.3 按照条件规则查询–只适合简单的查询

在接口中添加方法不过方法名有规范会有实现类来自动实现写上字段名用like就会加like,不用就是等于GreaterThan是大于像like这些条件加在字段后面用And拼接

public interface EmployeeRepository extends JpaRepository<Employee,Long> {

    //按照规则条件进行查询 模糊查询
    public List<Employee> findByUsernameLike(String username);

    public List<Employee> findByUsername(String username);

    public List<Employee> findByAgeGreaterThan(Integer age);
}

1.4 写jpql语句–Query注解式jpql //Query注解查询

@Query("select o from Employee o where o.id =(select max(p.id) from Employee p)")
public Employee queryEmployee();
//根据用户名和邮件查询员工 参数名称 建议写来一致
@Query("select o from Employee o where o.username like ?1 and o.email like ?2")
public List<Employee> queryEmployee1(String name ,String email);

//@Param(username) 必须和 :username 一致 建议来都写来一致
@Query("select o from Employee o where o.username like :username and o.email like :email")
public List<Employee> queryEmployee2(@Param("username") String name , @Param("email") String email);
//原生SQL支持
    @Query(value = "select count(*) from employee ",nativeQuery = true)
    public Long queryCount();

1.5 JpaSpecificationExecutor 查询

JpaSpecificationExecutor:jpa提供的规范的执行者,作用可以用来动态的生成jpql语句来查询
dao层多继承一个
JpaSpecificationExecutor

@Test
   public void testJpaSpecificationExecutorAndPage()throws Exception{
       //Specification
       Specification specification = new Specification<Employee>(){
           //设置条件 给哪一列(username)设置条件
           //root
           public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
               Path path1 = root.get("username"); //root 拿到要操作的字段
               //criteriaBuilder  用来构建的查询
               Predicate predicate1 = criteriaBuilder.like(path1, "%1%");

               Path path2 = root.get("age");
               Predicate predicate2 = criteriaBuilder.greaterThan(path2, 30);

               CriteriaQuery cq = criteriaQuery.where(predicate1, predicate2);
               return cq.getRestriction();
           }
       };
       // select o from Employee o where username like '%1%' and age > 30
       Sort sort = new Sort(Sort.Direction.DESC,"age");
       Pageable pageable = new PageRequest(0, 2, sort);

       Page<Employee> page = employeeRepository1.findAll(specification,pageable);
       List<Employee> employees = page.getContent();
       for (Employee employee : employees) {
           System.out.println(employee);
       }

   }

上面麻烦地方:组装条件比较麻烦,所以有人写一个简单的插件 完成内容

1.6 jpa-spe插件

jpa-spec这个插件 对应 JpaSpecificationExecutor 进行封装,封装出来之后,简化上面jpa规则查询的写法,更好用

使用:

​ (1)导入依赖包

(2)测试

@Test
    public void testJpaSpe()throws Exception{
        Specification<Employee> specification = Specifications.<Employee>and()
                .like("username", "%1%")
                .gt("age", 30)
                .build();

        List<Employee> employees = employeeRepository1.findAll(specification);
        for (Employee employee : employees) {
            System.out.println(employee);

        }

    }

1.7完成公共抽取

BaseQuery

//抽取查询条件 由于每一子类查询条件都不一样,所有必须子类来覆写
      public abstract Specification  createSpecification();

      //根据公共BaseQuery排序字段 来组装排序
      public Sort createSort() {
          if (this.getOrderByName() != null) {
              String orderByType = this.getOrderByType();
              Sort.Direction type = "DESC".equals(orderByType) ? Sort.Direction.DESC : Sort.Direction.ASC;
              return new Sort(type, this.getOrderByName());

          }else{
              return null;
          }
      }

1.8 springdatajpa的扩展

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值