Spring Data 项目是 Spring用来解决数据访问问题的一揽子解决方案, Spring Data是一个伞形项目, 包含了大量关系型数据库及非关系型数据库的数据访问解决方案。 Spring Data使我们可以快速且简单地使用普通的数据访问技术及新的数据访问技术。
Spring Data为我们使用统一的 API来对上述的数据存储技术进行数据访问操作提供了支持。这是 Spring通过提供 Spring Data Commons项目来实现的,它是各种Spring Data项目的依赖。 Spring Data Commons让我们在使用关系型或非关系型数据访问技术时都使用基于Spring的统一标准,该标准包含CRUD(创建、获取、更新、册l理除)、查询、排序和分页的相关的操作 。
介绍下Spring Data Commons的一个重要概念: Spring Data Repository抽象。使用Spring Data Repository 可以极大地减少数据访问层的代码 。 既然是数据访问操作的统一标准,那肯定是定义了各种各样和数据访问相关的接口, Spring Data Repository 抽象的根接Repository 接口:
public interface Repository<T, ID extends Serializable> {
}
从源码中可以看出,它接受领域类(JPA为实体类)和领域类的 id类型作为类型参数。
它的子接口 CrudRepository 定义了和 CRUD操作相关的内容:
@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
<S extends T> S save(S var1);
<S extends T> Iterable<S> save(Iterable<S> var1);
T findOne(ID var1);
boolean exists(ID var1);
Iterable<T> findAll();
Iterable<T> findAll(Iterable<ID> var1);
long count();
void delete(ID var1);
void delete(T var1);
void delete(Iterable<? extends T> var1);
void deleteAll();
}
CrudRepository 的子接口 PagingAndSortingRepositoy定义了与分页和排序操作相关的内容:
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort var1);
Page<T> findAll(Pageable var1);
}
不同的数据访问技术也提供了不同的 Repository, 如 Spring Data JPA有 JpaRePository、spring Data MongoDB有 MongoReposltory。
Spring Boot的支持
1. JDBC的自动配置
spring_boot_starter_data_jpa依赖于 spring-boot-starter-jdbc,而 Spring Boot对 JDBC做了一些自动配置。 源码放置在 org.springframework.boot.autoconfigure.jdbc下, 如图所示
从源码分析可以看出, 我们通过“spring.datasoure” 为前缀的属性自动配置 dataSource;Spring Boot自动开启了注解事务的支持(@EnableTransactionManagement);还配置了一个jdbcTemplate。
Spring Boot还提供了一个初始化数据的功能:放置在类路径下的 schema.sql文件会自动用来初始化表结构; 放置在类路径下的 data.sql文件会自动用来填充表数据 。
2. 对 JPA的自动配置
Spring Boot对 JPA的自动配置放置在 org.sprmgftamework.boot.autoconfigure.ormJpa下, 如图所示
从 HibemateJpaAutoConfiguration可以看出, Spring Boot默认 JpA的实现者是 Hibemate; HlbemateJpaAutoConfiguration依赖于 DataSourceAutoConfiguration。
从 JpaProperties的源码可以看出, 配置 JPA可以使用 springjpa为前缀的属性在application.properties 中配置 。
从 JpaBaseConfiguration的源码中可以看出, Spring Boot为我们配置了 transactionManager、jpaYendorAdapter、 entityManagerFactory 等 Bean。 JpaBaseConfiguration还有一个 getPackagesToScan 方法, 可以自动扫描注解有@Entity的实体类。
在 Web项目中我们经常会遇到在控制器或者页面访问数据的时候出现会话连接已关闭的错误, 这时候我们会配置一个 Open EntityManager(Session) In View这个过滤器。令人惊喜的是, Spring Boot为我们自动配置了 OpenEntityManagerInVlewInterceptor这个 Bean,并注册到 Spring MVC的拦截器中 。
3. 对 Spring Data JPA的自动配置
Spring Boot 对 Spring Data JPA 的自动配置放置在 org.springframework.boot.autoconfigure.data.jpa下, 如图所示:
从 JpaRepositoriesAutoconfiguration和 JpaRepositoriesAutoConfigureRegistrar源码可以看出,JpaRepositoriesAutoConfiguration是依赖于 HibenateJpaAutoConfiguraton配置的,且Spring Boot 自动开启了对Spring Data JPA的支持, 即我们无须在配置类显示声明@EnableJpaRepositories 。