在Spring Data模块中定义依赖:
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
<dependencies>
春D(Spring Data)帮我们封装了基本的增删改查,而且还提供很多便利的查询方法,继续看吧!
春D提供的最重要的接口是Repository,CrudRepository实现这接口,先看看CrudRepository这鬼东西:
//T表示实体类,ID则是实体中id的类型
public interface CrudRepository<T, ID extends Serializable>
extends Repository<T, ID> { <S extends T> S save(S var1); <S extends T> Iterable<S> save(Iterable<S> var1); T findOne(ID var1); boolean exists(ID var1); Iterable<T> findAll(); Iterable<T> findAll(Iterable<ID> 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<T, ID extends Serializable> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort var1); Page<T> findAll(Pageable var1);
}
eg:访问第二页,每页20条数据,可以这样:
PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(new PageRequest(1, 20));
另外对于查询方法,删除和级数查询可以用如下的:
eg: public interface UserRepository extends CrudRepository<User, Long> {
//查询lastname为某某的数量
Long countByLastname(String lastname);
}
eg: public interface UserRepository extends CrudRepository<User, Long> {
//删除lastname为某某的记录
Long deleteByLastname(String lastname);
//删除lastname为某某的记录,返回删除的所有记录
List<User> removeByLastname(String lastname); }
定义自己的repository,需要下面4个步骤:
1.声明自己的一个接口,继承Repository 或者其他一个继承Repository的子类:
interface PersonRepository extends Repository<Person, Long> { … }
2.在接口上定义查询方法:
interface PersonRepository extends Repository<Person, Long> {
List<Person> findByLastname(String lastname);
}
3.设置spring去为这些自定义的Repository创建代理类:
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @EnableJpaRepositories
class Config {}
或者XML配置: <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> <jpa:repositories base-package="com.acme.repositories"/> </beans>
4.获得自定义的repository实例:
public class SomeClient { @Autowired
private PersonRepository repository; public void doSomething() {
List<Person> persons = repository.findByLastname("Matthews");
}
}
根据方法名创建查询:
public interface PersonRepository extends Repository<User, Long> {
//根据addres和lastname查询person列表
List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname); //(增强唯一标示查询)Enables the distinct flag for the query
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname); //(查询lastname忽略大小写)Enabling ignoring case for an individual property
List<Person> findByLastnameIgnoreCase(String lastname);
//(查询属性都忽略大小写)Enabling ignoring case for all suitable properties
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname); //(排序,简单明了)Enabling static ORDER BY for a query
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}
- 注意:
- 除了可以用And 和Or 连接属性外,你还可以用Between, LessThan, GreaterThan, Like等
带有分页和排序的查询:
Page<User> findByLastname(String lastname, Pageable pageable); Slice<User> findByLastname(String lastname, Pageable pageable);
//获得排序后的列表
List<User> findByLastname(String lastname, Sort sort);
//按照分页的条件获得列表
List<User> findByLastname(String lastname, Pageable pageable);
先看看Page的源码,可以知道,page可以获得总页数(totalPages)和总的元素个数:
public interface Page<T> extends Slice<T> {
int getTotalPages(); long getTotalElements(); <S> Page<S> map(Converter<? super T, ? extends S> var1);
}
再看看Slice的源码,可以知道,Slice是个Iterable迭代器,可以获得上一页,下一页,判断是否是第一个,最后一个等等。
public interface Slice<T> extends Iterable<T> {
int getNumber(); int getSize(); int getNumberOfElements(); List<T> getContent(); boolean hasContent(); Sort getSort(); boolean isFirst(); boolean isLast(); boolean hasNext(); boolean hasPrevious(); Pageable nextPageable(); Pageable previousPageable(); <S> Slice<S> map(Converter<? super T, ? extends S> var1);