Spring Data教程
Spring Data在我们正在使用的持久性存储(JPA,NoSQL,JDBC等)之上提供了抽象,我们可以显着减少实现那些持久性存储的数据访问层所需的样板代码数量。
作为开发人员,我们只需要编写存储库接口,包括自定义finder方法,Spring就会自动为这些数据访问方法提供实现。在本Spring Data教程中,我们将介绍Spring Data中的可用模块,可用存储库以及如何使用Spring Data存储库。
Spring数据模块
Spring Data有许多与支持的持久性存储相对应的模块。 Spring Data Commons是每个Spring Data模块的通用模块。这是CrudRepository和PagingAndSortingRepository接口所在的模块。
其他一些数据模块是
Spring Data JDBC-Spring Data仓库对JDBC的支持。
Spring Data JPA-对JPA的Spring Data存储库支持。
Spring Data LDAP-Spring Data仓库对Spring LDAP的支持。
Spring Data MongoDB-基于Spring的对象文档支持和MongoDB存储库。
Spring Data Redis-轻松配置和从Spring应用程序访问Redis。
Spring Data REST-将Spring Data存储库导出为超媒体驱动的RESTful资源。
用于Apache Cassandra的Spring数据-易于配置并可以访问Apache Cassandra或者大规模,高可用性,面向数据的Spring应用程序。
Spring数据仓库
Spring Data存储库抽象中的中央接口是Repository。
public interface Repository<T, ID> { }
存储库是一个标记接口,它使用域类来管理以及将域类的ID类型作为类型参数。
CrudRepository扩展了Repository,并为正在管理的实体类提供了完善的CRUD功能。
public interface CrudRepository<T, ID> extends Repository<T, ID> { <S extends T> S save(S entity); <S extends T> Iterable<S> saveAll(Iterable<S> entities); Optional<T> findById(ID id); boolean existsById(ID id); Iterable<T> findAll(); Iterable<T> findAllById(Iterable<ID> ids); long count(); void deleteById(ID id); void delete(T entity); void deleteAll(Iterable<? extends T> entities); void deleteAll(); }
在CrudRepository的顶部,有一个PagingAndSortingRepository抽象,它添加了其他方法来简化对实体的分页访问。
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable); }
使用Spring Data的步骤
使用Spring数据存储库的步骤如下,这里引用的存储库是Spring Data JPA存储库。在本文中查看使用Spring Data JAP的完整示例Spring Data JPA示例
1.声明一个扩展Repository的接口或者其子接口之一,然后将其键入要处理的域类和ID类型。例如,如果我们有一个实体类Employee,其雇员ID的类型为int。
public interface EmployeeRepository extends CrudRepository<Employee, Integer> { List<Employee> findByLastName(String lastName); }
除了从CrudRepository继承的查询方法之外,我们还可以编写自己的自定义查询方法。
2.设置Spring来为接口创建代理实例。如果我们使用的是JavaConfig
@Configuration @EnableJpaRepositories("com.theitroad.springproject.dao") @EnableTransactionManagement public class JPAConfig { ... ... }
@EnableJpaRepositories注释启用JPA存储库。带有注释的值提供了用于扫描存储库的软件包。
@EnableTransactionManagement注释启用Spring的注释驱动的事务管理功能。
如果我们使用的是XML配置,则用于启用JPA存储库的配置为
<jpa:repositories base-package="com.theitroad.springproject.dao"/>
3.注入并使用存储库实例。
@Service public class EmployeeService { @Autowired private EmployeeRepository repository; public Employee getEmployeeById(int id) { return repository.findById(id).get(); } public List<Employee> getAllEmployees(){ return (List<Employee>) repository.findAll(); } .. .. }
Spring Data中用于查询创建的选项
1.通过从查询方法名称派生查询,可以自动创建在Repository接口中定义的方法的查询。通用方法是从方法名称中删除一组给定的众所周知的前缀(即,find ... By,query ... By,count ... By等),然后解析该方法的其余部分。这适用于通过扩展存储库(或者子接口)接口而获得的两种方法以及遵循相同命名方法的自定义方法。
2.我们也可以使用注释声明查询。对于Spring Data JPA,我们可以使用@NamedQuery(在XML配置的情况下为元素)在实体类中定义查询,或者在Repository接口中使用@Query注释查询方法。对于Spring Data Mongo和Spring Data Neo4J,@ Query注释也可用于定义查询。