开心一笑
你捂错地方了
某日,体育课中途,洗手间解决个人问题。结果着急误进男厕。
看到一男生正在小便池嘘嘘,俺当时就蒙了,一秒过后正准备悄悄撤退,
结果被发现,晕死。只见那男生大叫一声“流氓,非礼”,然后双手捂胸。
后来,后来俺说了一句自己都觉得不可思议的话:“同学,你捂错地方了……”
提出问题
我是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 extends T> 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
//(增强唯一标示查询)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 super T, ? extends S> 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 super T, ? extends S> var1);
好了,先写这么多吧!!!累了
原文
http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/#dependencies.train-names