Spring Data提供一整套数据访问方案,简化了数据操做层(Dao)的开发,它使用Repository做为基础接口。Repository做为全部数据访问层的超级接口,具体功能由子接口定义。Repository做为识别接口,全部继承此接口的类由spring 自动管理。spring Data 容许咱们之定义接口 ,只要符合Spring Data 规范无需实现。java
public interface Repository<T, ID extends Serializable> {//ID 类型必须继承序列化,也就是基本类型须要使用包装类型 }
数据访问层相似Dao,这里既为repositoryspring
Spring Data 提供了几个Repository,基础的Repository提供了基本的访问功能,其子接口进行扩展,继承功能以下:spa
repository:提供基本的访问功能code
CrudRepository:继承repository增长数据增删改等功能blog
PagingAndSortingRepository:继承CrudRepository并实现排序和分页功能排序
JpaRepository:继承PagingAndSortingRepository并实现一组jpa规范功能继承
JpaSpecificationExecutor:不属于Repository实现一组JPA criteria相关方法索引
咱们本身定义的XxxxRepository须要继承JpaRepository,这样咱们的XxxxRepository接口就具有了通用的数据访问控制层的能力。接口
按照Spring data 定义的规则,查询方法以find|read|get开头
涉及条件查询时,条件的属性用条件关键字链接,要注意的是:条件属性以首字母大写其他字母小写为规定。
例如:定义一个Entity实体类
ci
class User{ private String firstname; private String lastname; }
使用And条件链接时,应这样写:
findByLastnameAndFirstname(String lastname,String firstname);
条件的属性名称与个数要与参数的位置与个数一一对应
这种查询是标准的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); }
这种查询能够声明在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);
(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