Spring Data JPA

1、Spring Data 概述

Spring Data提供一整套数据访问方案,简化了数据操做层(Dao)的开发,它使用Repository做为基础接口。Repository做为全部数据访问层的超级接口,具体功能由子接口定义。Repository做为识别接口,全部继承此接口的类由spring 自动管理。spring Data 容许咱们之定义接口 ,只要符合Spring Data 规范无需实现。java

public interface Repository<T, ID extends Serializable> {//ID 类型必须继承序列化,也就是基本类型须要使用包装类型
}

2、repository 结构

数据访问层相似Dao,这里既为repositoryspring

Spring Data 提供了几个Repository,基础的Repository提供了基本的访问功能,其子接口进行扩展,继承功能以下:spa

repository:提供基本的访问功能code

CrudRepository:继承repository增长数据增删改等功能blog

PagingAndSortingRepository:继承CrudRepository并实现排序和分页功能排序

JpaRepository:继承PagingAndSortingRepository并实现一组jpa规范功能继承

JpaSpecificationExecutor:不属于Repository实现一组JPA criteria相关方法索引

咱们本身定义的XxxxRepository须要继承JpaRepository,这样咱们的XxxxRepository接口就具有了通用的数据访问控制层的能力。接口

3、Spring Data 查询

1.简单的查询

按照Spring data 定义的规则,查询方法以find|read|get开头 
涉及条件查询时,条件的属性用条件关键字链接,要注意的是:条件属性以首字母大写其他字母小写为规定。 
例如:定义一个Entity实体类 
ci

class User{ 
private String firstname; 
private String lastname; 
}

使用And条件链接时,应这样写: 

findByLastnameAndFirstname(String lastname,String firstname);

条件的属性名称与个数要与参数的位置与个数一一对应 

2.使用JPA NamedQueries(标准规范实现)

这种查询是标准的JPA规范所定义的,直接声明在Entity实体类上,调用时采用在接口中定义与命名查询对应的method,由Spring Data根据方法名自动完成命名查询的寻找。 
(1)在Entity实体类上使用@NamedQuery注解直接声明命名查询。 

@Entity 
@NamedQuery(name = "User.findByEmailAddress", 
  query = "select u from User u where u.emailAddress = ?1") 
public class User { 

}

注:定义多个时使用下面的注解 

@NamedQueries(value = { 
                @NamedQuery(name = User.QUERY_FIND_BY_LOGIN, 
                                        query = "select u from User u where u." + User.PROP_LOGIN 
                                                + " = :username"), 
        @NamedQuery(name = "getUsernamePasswordToken", 
                        query = "select new com.aceona.weibo.vo.TokenBO(u.username,u.password) from User u where u." + User.PROP_LOGIN 
                            + " = :username")})

(2)在interface中定义与(1)对应的方法 

public interface UserRepository extends JpaRepository<User, Long> { 

  List<User> findByLastname(String lastname); 

  User findByEmailAddress(String emailAddress); 
}

3.使用@Query自定义查询(Spring Data提供)

这种查询能够声明在Repository方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring data的特有实现。 
例如: 

public interface UserRepository extends JpaRepository<User, Long> { 

  @Query("select u from User u where u.emailAddress = ?1") 
  User findByEmailAddress(String emailAddress); 
}

4.@Query与@Modifying执行更新操做

这两个annotation一块儿声明,可定义个性化更新操做,例如只涉及某些字段更新时最为经常使用,示例以下: 

@Modifying 
@Query("update User u set u.firstname = ?1 where u.lastname = ?2") 
int setFixedFirstnameFor(String firstname, String lastname);

5.索引参数和命名参数

(1)索引参数以下所示,索引值从1开始,查询中 ”?X” 个数须要与方法定义的参数个数相一致,而且顺序也要一致 

@Modifying 
@Query("update User u set u.firstname = ?1 where u.lastname = ?2") 
int setFixedFirstnameFor(String firstname, String lastname);

(2)命名参数(推荐使用这种方式) 
能够定义好参数名,赋值时采用@Param("参数名"),而不用管顺序。以下所示: 

public interface UserRepository extends JpaRepository<User, Long> { 

  @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname") 
  User findByLastnameOrFirstname(@Param("lastname") String lastname, 
                                 @Param("firstname") String firstname); 
}

定义XxxxRepository 接口并继承JpaRepository接口,若是Spring data所提供的默认接口方法不够用,可使用@Query在其中定义个性化的接口方法。

http://jishiweili.iteye.com/blog/2088265 

相关文章
相关标签/搜索