一点睛
Spring Data Commons有一个重要概念:Spring Data Repository抽象。使用Spring Data Repository可以极大地减少数据访问层的代码。既然是数据访问操作的统一标准,那肯定是定义了各种各样和数据访问相关的接口,下面来看看Spring Data Repository抽象的根接口是怎样定义的。
二关键源码解读
1Repository接口
package org.springframework.data.repository;
import java.io.Serializable;
//它接受领域类(JPA为实体类)和领域类的id类型作为类型参数
public interface Repository<T, ID extends Serializable> {
}
2CrudRepository接口
//Repository的子接口CrudRepository定义了和CRUD操作相关的内容。
package org.springframework.data.repository;
import java.io.Serializable;
@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
//关于创建或修改的函数
<S extends T> S save(S entity);
<S extends T> Iterable<S> save(Iterable<S> entities);
//关于获取的函数
T findOne(ID id);
boolean exists(ID id);
Iterable<T> findAll();
Iterable<T> findAll(Iterable<ID> ids);
long count();
//关于删除的函数
void delete(ID id);
void delete(T entity);
void delete(Iterable<? extends T> entities);
void deleteAll();
}
3PagingAndSortingRepository接口
//定义了分页和排序操作相关的内容
package org.springframework.data.repository;
import java.io.Serializable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort sort); //排序
Page<T> findAll(Pageable pageable); //分页
}
4 JpaRepository接口
//继承PagingAndSortingRepository,额外提供了一些其他的API
package org.springframework.data.jpa.repository;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
@NoRepositoryBean
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {
List<T> findAll();
List<T> findAll(Sort sort);
List<T> findAll(Iterable<ID> ids);
<S extends T> List<S> save(Iterable<S> entities);
void flush();
<S extends T> S saveAndFlush(S entity);
void deleteInBatch(Iterable<T> entities);
void deleteAllInBatch();
T getOne(ID id);
}
三SpringData项目其他功能
SpringData项目提供了一个激动人心的功能:根据属性名进行计数、删除、查询方法。
Spring Data项目提供了一个激动人心的功能:根据属性名进行计数、删除、查询方法。
public interface PersonRepositoty extends Repository<Person,Long>{
//按照年龄计数
Long countByAge(Integer age);
//按照名字删除
Long deleteByName(String name);
//按照名字查询
List<Person> findByName(String name);
//按照名字和地址查询
List<Person> findByNameAndAddres(String name,String address);
}