核心概念

Spring Data repository抽象中最核心的接口就是Repository(显而易见的哈)。该接口使用了泛型,需要提供两个类型参数,第一个是接口处理的域对象类型,第二个是域对象的主键类型。这个接口常被看做是一个标记型接口,用来获取要操作的域对象类型和帮助开发者识别继承这个类的接口。在Repository的基础上,CrudRepository接口提供了针对实体类的复杂的CRUD(增删改查)操作。

Example 1.CrudRepository interface(CrudRepository接口)


public interface CrudRepository<T, ID extends Serializable>
    extends Repository<T, ID> {

    <S extends T> S save(S entity); //1

    T findOne(ID primaryKey);       //2

    Iterable<T> findAll();          //3

    Long count();                   //4

    void delete(T entity);          //5

    boolean exists(ID primaryKey);  //6

    // … more functionality omitted.
}

1.保存实体类
2.返回指定id的实体类
3.返回所有实体类
4.返回实体类的数量
5.删除指定实体类
6.判断指定id的实体类是否存在

Spring Data也提供了一些针对特定持久化技术的抽象,例如JpaRepositoryMongoRepository。这些接口均继承了CrudRepository

PagingAndSortingRepository接口在CrudRepository的基础上增加了一些方法,使开发者可以方便的对实体类进行分页和排序。

Example 2.PagingAndSortingRepository

public interface PagingAndSortingRepository<T, ID extends Serializable>
  extends CrudRepository<T, ID> {

  Iterable<T> findAll(Sort sort);

  Page<T> findAll(Pageable pageable);
}

在分页长度为20的基础上,想要获取第二页的User数据,代码如下

PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(new PageRequest(1, 20));

除了查询方法,还可以使用在查询基础上衍生出的count(获取数量)和delete(删除)方法。

Example 3.Derived Count Query(获取数量)

public interface UserRepository extends CrudRepository<User, Long> {

  Long countByLastname(String lastname);
}

Example 3.Derived Delete Query(删除)

public interface UserRepository extends CrudRepository<User, Long> {

  Long deleteByLastname(String lastname);

  List<User> removeByLastname(String lastname);

}