概述
Spring Data是Spring用来解决数据访问的解决方案,它包含了大量关系型数据库以及NoSQL数据库的数据持久层访问解决方案.
|
Spring Data Commons
Spring Data提供了统一的API来对各种数据存储技术进行数据访问操作,这是通过Spring Data Commons来实现的,它是所有Spring Data子项目的依赖.
Spring Data Repository
Spring Data Repository是数据访问的统一标准,它是抽象的,不同的数据访问技术有不同的Repository,它的顶级接口为Repository接口.
Repository用一个实体类型与ID类型作为泛型.
Repository的子接口CrudRepository定义了CRUD操作的相关内容:
CrudRepository的子接口PagingAndSortingRepository定义了分页与排序的相关内容:
Spring Data JPA
JPA规范
JPA是Java Persistence API的缩写,它是一个基于O/R(Object-Relational Mapping)映射的标准规范.例如Hibernate就是JPA规范的实现.
数据访问层
- 在Spring Data JPA中定义数据访问层首先需要继承JpaRepository接口.
- 之后可以通过@EnableJpaRepository注解开启Spring Data JPA的支持,@EnableJpaRepository接收的value参数用于扫描数据访问层所在包下的接口定义.
查询方法
Spring Data JPA支持通过定义在Repository接口中的方法名来定义查询,方法名是根据实体类的属性名来确定的.
其中findBy关键字可以用find、read、readBy、query、queryBy、get、getBy替代.
Spring Data JPA可以使用top和first关键字查询指定数量的数据.
查询关键字
关键字 | 示例 | 同功能JPQL |
---|---|---|
And | findByNameAndAge | where x.name = ?1 and x.age = ?2 |
Or | findByNameOrAge | where x.name = ?1 or x.age = ?2 |
Is | findByNameIs | where x.name = ?1 |
Equals | findByNameEquals | where x.name = ?1 |
Between | findByAgeBetween | where x.age between ?1 and ?2 |
LessThan | findByAgeLessThan | where x.age < ?1 |
LessThanEqual | findByAgeLessThanEqual | where x.age <= ?1 |
GreaterThan | findByAgeGreaterThan | where x.age > ?1 |
GreaterThanEqual | findByAgeGreaterThanEqual | where x.age >= ?1 |
After | findByStartDateAfter | where x.startDate > ?1 |
Before | findByStartDateBefore | where x.startDate < ?1 |
IsNull | findByNameIsNull | where x.name is null |
IsNotNull&NotNull | findByName(Is)NotNull | where x.name not null |
Like | findByNameLike | where x.name like ?1 |
NotLike | findByNameNotLike | where x.name not like ?1 |
StartingWith | findByNameStartingWith | where x.name like ?1(参数前面加%) |
EndingWith | findByNameEndingWith | where x.name like ?1(参数后面加%) |
Containing | findByNameContaining | where x.name like ?1(参数前后都加%) |
OrderBy | findByNameOrderByAgeDesc | where x.name = ?1 order by x.age desc |
Not | findByNameNot | where x.name <> ?1 |
In | findByAgeIn(Collection |
where x.age in ?1 |
NotIn | findByAgeNotIn(Collection |
where x.age not in ?1 |
True | findByActiveTrue() | where x.active = true |
False | findByActiveFalse() | where x.active = false |
IgnoreCase | findByNameIgnoreCase | where UPPER(x.name) = UPPER(?1) |
@Query&@NamedQuery查询
Spring Data JPA支持使用@Query注解在接口的方法上实现查询.
Spring Data JPA支持使用@NamedQuery定义查询方法,一个名称映射一条查询语句.
更新查询
Spring Data JPA支持使用@Modifying注解和@Query注解组合进行数据更新操作.
Specification
Spring Data JPA提供了一个Specification接口可以让我们快速地构造基于准则的查询.通过重写Specification接口的toPredicate方法用来构造查询条件.
- 数据访问接口需继承JpaSpecificationExecutor接口.
构造查询条件类
调用条件查询
排序&分页
Spring Data JPA提供了Sort类和Page接口及Pageable接口完成排序和分页.
自定义Repository
如果我们想自定义Repository,可以继承Repository的子接口PagingAndSortingRepository.
定义自定义的Repository接口.
定义自定义的Repository接口实现.
定义RepositoryFactoryBean
开启自定义支持需要使用@EnableJpaRepositories注解的repositoryFactoryBeanClass指定FactoryBean.
Spring Boot支持
Spring Boot使用
spring.datasource
前缀用来配置dataSource.Spring Boot自动开启了注解事务支持(@EnableTransactionManagement),并配置了jdbcTemplate.
Spring Boot提供了初始化数据的功能,在类路径下的schema.sql文件会自动初始化表结构;在类路径下的data.sql文件会自动插入表数据.
Spring Boot为我们自动配置了transactionManager、jpaVendorAdapter、entityManagerFactory等Bean.JpaBaseConfiguration还有一个getPackagesToScan方法用于自动扫描带有注解@Entity的实体类
Spring Boot自动配置了OpenEntityManagerInViewInterceptor拦截器,并注册到了Spring MVC的拦截器中.解决了页面访问数据时会话连接已关闭的错误.
Spring Boot自动开启了对Spring Data JPA的支持,无需再配置类中显式声明@EnableJpaRepositories.
在Spring Boot下使用Spring Data JPA,只需要添加依赖spring-boot-stater-data-jpa,然后定义DataSource、实体类、数据访问层即可,无需其他配置.
Spring Data REST
Spring Data REST支持将Spring Data JPA,Spring Data MongoDB,Spring Data Neo4j,Spring Data GernFile,Spring Data Cassandra的Repository自动转换成REST服务.
Spring Data REST的配置是定义在RepositoryRestMvcConfiguration配置类中的,我们可以通过继承这个配置类或者使用@Import注解导入此配置类来使用Spring Data REST.
Spring Boot支持
Spring Boot已经自动配置了RepositoryRestMvcConfiguration,所以只需要引入依赖spring-boot-starter-data-rest,不需要任何其他配置.
Spring Boot使用
spring.data.rest
前缀用来配置RepositoryRestMvcConfiguration的属性.如果想在自定义的领域类Repository中将方法暴露为REST资源,则需要使用@RestResource注解.
如需要分页,则可以使用参数page=?&size=?来实现分页.
例:http://localhost:8080/persons/?page=1&size=10.如需要排序,则可以使用参数sort来实现排序.
例:http://localhost:8080/persons/?sort=age,desc.自定义根路径需要在application.properties中设置
spring.data.rest.base-path
属性.Spring Data REST的节点路径是默认在实体类之后加s,如果需要自定义节点路径则要在领域类Repository上使用@RepositoryRestResource注解的path属性进行设置.
Spring Data MongoDB
MongoDB是一个基于Document文档的NoSQL数据库,它使用面向对象的思想,每一条记录都是一个文档对象.
Spring Data MongoDB提供了以下的注解用来定义领域类:
注解 | 描述 |
---|---|
@Document | 映射领域对象与MongoDB的一个文档 |
@Id | 映射当前属性为ID |
@DbRef | 当前属性将参考其他文档 |
@Field | 为文档的属性定义名称 |
@Version | 将当前属性作为版本 |
Spring Data MongoDB还提供了一个MongoTemplate封装了数据访问的方法,我们还需要为MongoClient和MongoDbFactory来配置数据库连接属性.开启MongoDB的Repository需要在配置类上使用注解@EnableMongoRepositories.
定义Spring Data MongoDB的Repository只需要继承MongoRepository接口即可.
Spring Boot支持
使用Spirng Boot主要配置数据库连接、MongoTemplate.可以使用spring.data.mongodb
配置MongoDB相关的属性.
- Spring Boot自动开启了@EnableMongoRepositories注解.
- Spring Boot提供了一些默认配置:默认MongoDB端口为27017,服务器为localhost,数据库为test.
- 在Spring Boot下使用MongoDB只需要引入依赖spring-boot-starter-data-mongodb,不需要其他配置.
Spring Data Redis
Spring Data Redis提供了ConnectionFactory和RedisTemplate.
根据Redis不同的JavaClient,Spring Data Redis提供了不同的ConnectionFactory.
- JedisConnectionFactory:使用Jedis作为客户端.
- JredisConnectionFactory:使用Jredis作为客户端.
- LettuceConnectionFactory:使用Lettuce作为客户端.
- SrpConnectionFactory:使用Spullara/redis-protoccol作为客户端.
配置ConnectionFactory和RedisTemplate如下:
Spring Data Redis提供了RedisTemplate和StringRedisTemplate两个模板对象进行数据操作.StringRedisTemplate只针对键值都是字符类型的数据进行操作.
数据操作方法 | 描述 |
---|---|
opsForValue() | 操作简单属性的数据 |
opsForList() | 操作list数据 |
opsForSet() | 操作set数据 |
opsForZSet() | 操作ZSet(有序的set)数据 |
opsForHash() | 操作hash散列的数据 |
Serializer
当我们进行存储操作的时候,键值对都是通过Spring提供的Serializer序列化到数据库的.
- RedisTemplate默认使用的是JdkSerializationRedisSerizlizer.
- StringRedisTemplate默认使用的是StringRedisSerializer.
Spring Boot支持
Spring Boot默认配置了JedisConnectionFactory、RedisTemplate和StringRedisTemplate.
Spring Boot使用spring.redis
为前缀在application.properties中配置Redis相关的属性.
end
资料参考于 JavaEE开发的颠覆者: Spring Boot实战