Spring Data

开心一笑

你捂错地方了

某日,体育课中途,洗手间解决个人问题。结果着急误进男厕。
看到一男生正在小便池嘘嘘,俺当时就蒙了,一秒过后正准备悄悄撤退,
结果被发现,晕死。只见那男生大叫一声“流氓,非礼”,然后双手捂胸。
后来,后来俺说了一句自己都觉得不可思议的话:“同学,你捂错地方了……”

提出问题

我是Sping Data,是程序员的春天,因为我提供很多接口给开发人员,
减少程序员重复的写CRUD和分页等方法,你们也可以叫我春D,或者春帝,因为我很酷

解决问题

在Spring Data模块中定义依赖:


  
    org.springframework.data
    spring-data-jpa
  

春D(Spring Data)帮我们封装了基本的增删改查,而且还提供很多便利的查询方法,继续看吧!

春D提供的最重要的接口是Repository,CrudRepository实现这接口,先看看CrudRepository这鬼东西:

//T表示实体类,ID则是实体中id的类型
public interface CrudRepository
    extends Repository {

     S save(S var1);

     Iterable save(Iterable var1);

    T findOne(ID var1);

    boolean exists(ID var1);

    Iterable findAll();

    Iterable findAll(Iterable var1);

    long count();

    void delete(ID var1);

    void delete(T var1);

    void delete(Iterable var1);

    void deleteAll();
}

CrudRepository如其名,封装了基本的增删改查接口

再看看PagingAndSortingRepository,他是CrudRepository的儿子,具体源码如下:

public interface PagingAndSortingRepository extends CrudRepository {
    Iterable findAll(Sort var1);

    Page findAll(Pageable var1);
}

eg:访问第二页,每页20条数据,可以这样:

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

另外对于查询方法,删除和级数查询可以用如下的:

eg:

public interface UserRepository extends CrudRepository {
    //查询lastname为某某的数量
    Long countByLastname(String lastname);
}

eg:

public interface UserRepository extends CrudRepository {
  //删除lastname为某某的记录
  Long deleteByLastname(String lastname);
  //删除lastname为某某的记录,返回删除的所有记录
  List removeByLastname(String lastname);

}

定义自己的repository,需要下面4个步骤:

1.声明自己的一个接口,继承Repository 或者其他一个继承Repository的子类:

interface PersonRepository extends Repository { … }

2.在接口上定义查询方法:

interface PersonRepository extends Repository {
  List findByLastname(String lastname);
}

3.设置spring去为这些自定义的Repository创建代理类:

import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@EnableJpaRepositories
class Config {}

或者XML配置:




   


4.获得自定义的repository实例:

public class SomeClient {

  @Autowired
  private PersonRepository repository;

  public void doSomething() {
    List persons = repository.findByLastname("Matthews");
  }
}

根据方法名创建查询:
public interface PersonRepository extends Repository {
//根据addres和lastname查询person列表
List findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

  //(增强唯一标示查询)Enables the distinct flag for the query
  List findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
  List findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);

  //(查询lastname忽略大小写)Enabling ignoring case for an individual property
  List findByLastnameIgnoreCase(String lastname);
  //(查询属性都忽略大小写)Enabling ignoring case for all suitable properties
  List findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

  //(排序,简单明了)Enabling static ORDER BY for a query
  List findByLastnameOrderByFirstnameAsc(String lastname);
  List findByLastnameOrderByFirstnameDesc(String lastname);
}
  • 注意:
  • 除了可以用And 和Or 连接属性外,你还可以用Between, LessThan, GreaterThan, Like等

带有分页和排序的查询:

Page findByLastname(String lastname, Pageable pageable);

Slice findByLastname(String lastname, Pageable pageable);
//获得排序后的列表
List findByLastname(String lastname, Sort sort);
//按照分页的条件获得列表
List findByLastname(String lastname, Pageable pageable);

先看看Page的源码,可以知道,page可以获得总页数(totalPages)和总的元素个数:

public interface Page extends Slice {
    int getTotalPages();

    long getTotalElements();

     Page map(Converter var1);
}

再看看Slice的源码,可以知道,Slice是个Iterable迭代器,可以获得上一页,下一页,判断是否是第一个,最后一个等等。

public interface Slice extends Iterable {
int getNumber();

int getSize();

int getNumberOfElements();

List getContent();

boolean hasContent();

Sort getSort();

boolean isFirst();

boolean isLast();

boolean hasNext();

boolean hasPrevious();

Pageable nextPageable();

Pageable previousPageable();

 Slice map(Converter var1);

好了,先写这么多吧!!!累了

原文

http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/#dependencies.train-names

Spring Data_第1张图片
美图

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