spring data jpa 学习笔记

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 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指定扫描的包。接下来其他的配置基本上都是数据库的一些配置。

 


    

 

 


    
        
        
        
            
        
        
            
                
                
                
                
            
        
        
            
        
        
            
                
                
                
                
                
                
                
            
        
    

    
        
    

 

 

你可能感兴趣的:(Spring,Data,Jpa)