Spring Data Jpa是Spring中为简化数据库操作,基于JPA封装的一套框架。这个框架的主要作用是为了把我们从反复,复杂的数据库操作中解放出来。
首先,Spring Data Jpa的官方学习地址:http://docs.spring.io/spring-data/jpa/docs/current/reference/html/
其次,该项目测试代码地址:https://github.com/mj3018/7-4test/tree/master/springjpaTest 这个项目上面测试了CRUDRepository接口,JpaRepository接口,JpaSpecificationExecutor接口中的
CRUD操作,多条件分页查询,自定义接口,自定义接口实现根据EntityManager进行数据库操作等
1.1 核心概念
- Spring Data Jpa的核心接口是Repository,这个接口是一个空接口,在使用的时候需要只需要指定该接口的Entity类(对应泛型T)及id类型(对应ID)即可。
public interface Repository {
}
- CRUDRepository接口,这个接口继承Repository接口,添加CRUD方法。
@NoRepositoryBean
public interface CrudRepository extends Repository {
S save(S entity);
Iterable save(Iterable entities);
T findOne(ID id);
boolean exists(ID id);
Iterable findAll();
Iterable findAll(Iterable ids);
long count();
void delete(ID id);
void delete(T entity);
void delete(Iterable extends T> entities);
void deleteAll();
}
- PagingAndSortingRepository 继承CRUDRepository接口,新增分页与排序的功能。
public interface PagingAndSortingRepository extends CrudRepository {
Iterable findAll(Sort sort);
Page findAll(Pageable pageable);
}
- JpaRepository 继承PagingAndSortingRepository接口,在PagingAndSortingRepository接口基础上新增了一些比较常用的数据库操作,比如:多条件查询。
@Override
List findAll(Example example);
- 另外在SpringDataJpa中一个比较重要的接口:JpaSpecificationExecutor。通过这个接口可以实现多条件分页查询。
//多条件查询某一个具体的entity
T findOne(Specification spec);
//多条件查询满足条件的所有的entity
List findAll(Specification spec);
//多条件分页查询
Page findAll(Specification spec, Pageable pageable);
//多条件排序查询
List findAll(Specification spec, Sort sort);
//多条件统计满足条件的总数
long count(Specification spec);
Specification这个是查询的条件,构造这个查询条件的方式为:User对应的是Entity类,UserDto是查询条件。
private Specification buildSpecification(final UserDto userDto) {
return new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cb) {
Predicate predicate = cb.conjunction();
if(userDto.getName() != null) {
predicate.getExpressions().add(
cb.like(root.get("name"),userDto.getName()+"%")
);
}
if(userDto.getAddress() != null) {
predicate.getExpressions().add(
cb.like(root.get("address"),userDto.getAddress()+"%")
);
}
if(userDto.getPhone() != null) {
predicate.getExpressions().add(
cb.like(root.get("phone"),userDto.getPhone()+"%")
);
}
return predicate;
}
};
}
这里也把一个多条件分页查询的使用代码贴在这里吧:UserDto是查询的条件,Specification是根据UserDto封装出来的查询条件,Pageable对应的是分页条件。
@Test
public void testMultiQueryPage(){
UserDto userDto = new UserDto();
userDto.setName("name");
Specification specs = buildSpecification(userDto);
Pageable pageable = new PageRequest(1,2);
Page page = this.userService.findAdd(specs,pageable);
Iterator iterator = page.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
System.out.println("************************************************");
}
System.out.println(page.getContent());
}
- spring Data Jpa配置文件:
在上面这个配置文件中几个比较重要的配置有:
- 支持SpringDataJpa数据库操作的包采用base-package、配置自定义实现Dao操作的类采用repository-impl-postfix、指定EntityManagerFactory采用entity-manager-factory-ref、事物的指定采用transaction-manager-ref
- 接下来是实体管理器,这里需要指定persistenceProvider(就是使用SpringDataJpa的时候需要指定实现这个数据库操作的具体的实现ORM框架,这里采用Hibernate)的值为org.hibernate.ejb.HibernatePersistence。指定一个packageToScan指定扫描的包。接下来其他的配置基本上都是数据库的一些配置。