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应用框架,致力于减少数据访问层代码的编写,使用极简的代码即可完成数据库的访问与操作。
添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
创建Dao层(持久层)示例:
JpaRepository类提供很多内置的方法,包括增删改查,以及使用默认支持的Pageable对象来进行分页。
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
Repository和JpaRepository关系图:
自定义查询方法:
除了继承了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<Person> findByLastnameIgnoreCase(String lastname);
User findTopByOrderByAgeDesc(); //限制查询结果
Page<UserModel> findByName(String name, Pageable pageable); //分页
List<UserModel> findByName(String name, Sort sort); //排序
@Async
Future<User> 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> {
T findOne(Predicate predicate);
Iterable<T> findAll(Predicate predicate);
long count(Predicate predicate);
boolean exists(Predicate predicate);
// … more functionality omitted.
}
interface UserRepository extends CrudRepository<User, Long>, QueryDslPredicateExecutor<User> {
}
@NoRepositoryBean //告诉JPA不要创建对应接口的bean对象
public interface BaseReposittory <T,ID extends Serializable> extends JpaRepository<T,ID>,QueryDslPredicateExecutor<T> {
}