Spring Data:JPA与Querydsl

JPA

JPA是java的一个规范,用于在java对象和数据库之间保存数据,充当面向对象领域模型和数据库之间的桥梁。它使用Hibernate、TopLink、IBatis等ORM框架实现持久性规范。

Spring Data

Spring Data是Spring的一个子项目,用于简化数据库访问,支持NoSql数据和关系数据库。
支持的NoSql数据库包括:Mongodb、redis、Hbase、Neo4j。

Spring Data JPA

Spring Data JPA是构建在ORM框架和JPA规范上的一套JPA应用框架,致力于减少数据访问层代码的编写,使用极简的代码即可完成数据库的访问与操作。
添加依赖


    org.springframework.boot
    spring-boot-starter-data-jpa

创建Dao层(持久层)示例
JpaRepository类提供很多内置的方法,包括增删改查,以及使用默认支持的Pageable对象来进行分页。

import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository {
}

Repository和JpaRepository关系图
Spring Data:JPA与Querydsl_第1张图片
自定义查询方法
除了继承了JPARepository封装的查询方法,还可以按照 Spring Data 的规范,自定义查询方法,查询方法以 find | read | get 开头,涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写。

  • 方法名以find…By, read…By, query…By, count…By和get…By做开头。在By之前可以添加Distinct表示查找不重复数据。By之后是真正的查询条件。
  • 可以查询某个属性,也可以使用条件进行比较复杂的查询,例如Between, LessThan, GreaterThan, Like,And,Or等。
  • 字符串属性后面可以跟IgnoreCase表示不区分大小写,也可以后跟AllIgnoreCase表示所有属性都不区分大小写。
  • 可以使用OrderBy对结果进行升序或降序排序。
  • 可以查询属性的属性,直接将几个属性连着写即可,如果可能出现歧义属性,可以使用下划线分隔多个属性。
UserModel getByUserId(Integer id);
List findByLastnameIgnoreCase(String lastname);  
User findTopByOrderByAgeDesc();  //限制查询结果
Page findByName(String name, Pageable pageable);   //分页
List findByName(String name, Sort sort);    //排序
@Async
Future findByFirstname(String firstname);     //异步查询

Querydsl

QueryDSL是一个通用查询框架,与Hibernate等ORM工具不同的,它只是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查询。
QueryDSL可以通过一组通用的查询api为用户构建出适合不同类型ORM框架或SQL的查询语句。
QueryDSL是基于ORM框架或SQL平台上的一个通用查询框架。借助QueryDSL可以在任何支持的ORM框架或SQL平台上以通用API方式构建查询。
JPA是QueryDSL的主要集成技术,是JPQL和Criteria查询的代替方法。
Querydsl扩展能让我们以流式方式代码编写查询方法。该扩展需要一个接口QueryDslPredicateExecutor,它定义了很多查询方法。
接口继承了该接口,就可以使用该接口提供的各种方法了

public interface QueryDslPredicateExecutor {

    T findOne(Predicate predicate);             

    Iterable findAll(Predicate predicate);   

    long count(Predicate predicate);            

    boolean exists(Predicate predicate);        

    // … more functionality omitted.
}

interface UserRepository extends CrudRepository, QueryDslPredicateExecutor {

}

@NoRepositoryBean //告诉JPA不要创建对应接口的bean对象
public interface BaseReposittory  extends JpaRepository,QueryDslPredicateExecutor {
 }

参考:Go GO GO

你可能感兴趣的:(java)