[Spring Data Repositories]学习笔记--使用现有的repository
以下内容是在学习Spring-Data-mongoDB中的Spring Data Repositories时做的一些笔记。备忘!
感觉学习还是看官方的资料比较透彻一些。
Spring Data Repositories目的:减少重复的持久化代码。
常用的几个repository interface,
Repository <-- CurdRepository <-- PagingAndSortingRepository
最后一个主要是用来做分页和排序用的。
Repository使用步骤
1. 定义接口
public Interface PersonRepository extends Repository<User,Long>{...}
如果我们不想暴漏从Repository继承来的所有方法,可以用@NoRepositoryBean来进行标记。
@NoRepositoryBean Interface MyBaseRepository<T,ID extends Serializable> extends Repository<T,ID>{ T findOne(ID id); T save(T entity); } Interface UserRepository extends MyBaseRepository<User,Long>{ User findByEmailAddress(EmailAddress emailAddress); }
这样UserRepository里面就只有3个方法。
2. 为上面定义的接口定义方法
List<Person> findByLastname(String lastname);
Spring可以根据方法的名字来进行查找
public interface PersonRepository extends Repository<User,Long>{ List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname); List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname); List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname); List<Person> findByLastnameOrderByFirstnameAsc(String lastname); }
- AND, OR, Between, LessThan, GreaterThan, 哪些操作符可用与所用的数据库有关。
- IgnoreCase and AllIgnoreCase
- OrderBy (Asc or Desc)
支持多级属性,比如根据x.address.zipCode进行搜索, 可用
List<Person> findByAddressZipCode(ZipCode zipCode);
或者
List<Person> findByAddress_ZipCode(ZipCode zipCode);
注意:如果你的属性名称中包含_,比如first_name,需要用两个_来代表是下划线。
3. 为接口配置Spring(只列出xml, base-package是接口所在的包名)
<jpa:repositories base-package="com.acme.repositories"/>
可以用include-filter/exclude-filter来对接口进行过滤
<repositories base-package="com.acme.repositories">
<context:exclude-filter type="regex" expression=".*SomeRepository"/>
</repositories>
4. 通过注入方式获得repository的实例,进行使用
public class SomeClient { @Autowired private PersonRepository repository; public void doSomething(){ List<Person> persons = repository.findByLastname("Matthews"); } }