SPRING IN ACTION 第4版笔记-第十一章Persisting data with object-relational mapping-006Spring-Data的运行规则(@EnableJpaRepositories、<jpa:repositories>)

一、JpaRepository

1.要使Spring自动生成实现类的步骤

(1)配置文件xml

1 <?xml version="1.0" encoding="UTF-8"?>
2 <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/data/jpa
3 http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd">
4     <jpa:repositories base-package="com.habuma.spittr.db" /> ...
5 </beans>

或java

1 @Configuration
2 @EnableJpaRepositories(basePackages="com.habuma.spittr.db")
3 public class JpaConfiguration {
4     ...
5 }

 

(2)dao接口继承JpaRepository接口

1 public interface SpitterRepository extends JpaRepository<Spitter, Long> {
2 
3 }

 

2.为什么dao接口继承JpaRepository接口及设置好@EnableJpaRepositories后,Spring就会自动生成实现类

 

继承JpaRepository则会间接继承Repository接口,而@EnableJpaRepositories和<jpa:repositories> scans its base package for any interfaces that extend Spring Data JPA ’s Repository interface.When it finds any interface extending Repository , it automatically (at applicationstartup time) generates an implementation of that interface.

 

二、方法的命名规则

1.Spring是如何决定接口的方法要如何实现?

 

如下命名规则的方法,Spring都可以自动实现

 1 public interface SpitterRepository extends JpaRepository < Spitter, Long > {
 2     Spitter findByUsername(String username);
 3     readSpitterByFirstnameOrLastname() ;
 4     List<Spitter> readByFirstnameOrLastname(String first, String last);
 5     List<Spitter> readByFirstnameIgnoringCaseOrLastnameIgnoresCase(String first, String last);
 6     List<Spitter> readByFirstnameOrLastnameAllIgnoresCase(String first, String last);
 7     List<Spitter> readByFirstnameOrLastnameOrderByLastnameAsc(String first, String last);
 8     List<Spitter> readByFirstnameOrLastnameOrderByLastnameAscFirstnameDesc(String first, String last);
 9     List<Pet> findPetsByBreedIn(List<String> breed)
10int countProductsByDiscontinuedTrue()
11   List<Order> findByShippingDateBetween(Date start, Date end)
12 }

 

三、使用@Query

当自动实现不能满足要求进,考虑用@Query

1 @Query("select s from Spitter s where s.email like '%gmail.com'")
2 List<Spitter> findAllGmailSpitters();

 

四、混合自定义实现方法

1.When Spring Data JPA generates the implementation for a repository interface, it also looks for a class whose name is the same as the interface’s name postfixed with Impl . If the class exists, Spring Data JPA merges its methods with those generated by Spring Data JPA . For the SpitterRepository interface, the class it looks for is named SpitterRepositoryImpl

2.可以改变扫描的后缀

 

1 @EnableJpaRepositories(basePackages="com.habuma.spittr.db",repositoryImplementationPostfix="Helper")

 

或xml方式

<jpa:repositories base-package="com.habuma.spittr.db" repository-impl-postfix="Helper" />

 

posted @ 2016-04-01 18:20  shamgod  阅读(307)  评论(0编辑  收藏  举报
haha