Spring Data 是Spring 的一个子项目, 旨在统一和简化对各类型持久化存储, 而不拘泥于是关系型数据库还是NoSQL 数据存储。无论是哪种持久化存储, 数据访问对象(或称作为DAO,即Data Access Objects)通常都会提供对单一域对象的CRUD (创建、读取、更新、删除)操作、查询方法、排序和分页方法等.
Spring Data的子项目有:
Commons: 提供共享的基础框架,适合各个子项目使用,支持跨数据库持有化
Hadoop: 基于spring的Hadoop作业配置和一个pojo编程模型的mapreduce作业
key-value: 集成了Redis和Riak, 提供多个常用场景下的简单封装
Document: 集成了文档数据库
Graph: 集成Neo4j提供强大的基于POJO的编程模型
Graph Roo AddOn
JDBC Extensions: 支持oracle RAD,高级队列和高级数据类型
JPA: 简化创建JPA数据访问层和跨存储的持久层功能
Mapping: 基于Grails的提供对象映射框架,支持不同的数据库
Examples: 示例程序,文档和图数据库
Guidance: 高级文档
Spirng Data Repository抽象
一, Docker
Docker是一种轻量级容器技术,类似于虚拟机技术.
是直接运行在当前操作系统之上,也实现了虚拟机技术的资源隔离,性能远远高于虚拟机
Linux安装: sudo yum update
sudo yum install docker
windows下安装: 是通过Boot2Docker软件实现的,安装前要确认BIOS设置中的CPU虚拟化技术已开启.
常用命令: docker search 镜像名
docker pull 镜像名
docker images
docker rmi image-id
docker run --name container-name -d image-name
docker ps
docker stop/start container-name/container-id
docker logs container-id/container-name
二, Spring Data JPA
1, 定义数据访问层
只需定义一个继承JpaRepository的接口即可, JpaRepository源码如下:
@NoRepositoryBean
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {
List<T> findAll();
List<T> findAll(Sort sort);
List<T> findAll(Iterable<ID> ids);
<S extends T> List<S> save(Iterable<S> entities);
void flush();
T saveAndFlush(T entity);
void deleteInBatch(Iterable<T> entities);
void deleteAllInBatch();
T getOne(ID id);
}
2, 配置使用Spring Data JPA
通过注解@EnableJpaRepositories来开启Spring Data JPA支持
3, 定义查询方法
1), 根据属性查询
findBy, And, Or, Like, Between等
2),限制结果集数量: top, first
e.g. findFirst10ByName
3), NameQuery查询
e.g.
@Entity
@NameQuery(name="person.findByName","select * from person where name =?1")
public class Person{}
4), @Query查询
5),更新查询 e.g.
@Modifying
@Transactional
@Query("update person set name=?1")
int setName(String name);
6),排序和分页
sort: findByName(xx,new Sort(Direction.ASC,"age"));
Page: findByName(xx, new PageRequest(0,10));
其中page接口可以获得当前页面的记录,总页数,总记录数是否有上一页下一页.
4, 自定义Repository实现
1), @NoRepositoryBena
2), 继承
3), 方法,dosomething
5, Spring Boot的支持
1), jdbc的自动配置
源码在org.springframework.boot.autoconfigure.jdbc下
2), 对JPA的自动配置
源码在 org.springframework.boot.autoconfigure.orm.jpa
3), Spring Data JPA的自动配置
源码在: org.springframework.boot.autoconfigure.data.jpa
三, Spring Data Rest
1, Spring MVC中配置Spring Data Rest
可通过继承类或加@Import
e.g.
@Configuration
public class xxx extends RepositoryRestMvcConfiguration{}
或
@Configuration
@Import(RepositoryRestMvcConfiguration.class)
public class xxxxx{}
2, application.properties配置
spring boot已自动配置了RepositoryRestConfiguration来支持
只需添加依赖spring-boot-starter-data-rest
在application.properties中以spring.data.rest为前缀的属性来配置
e.g.
spring.data.rest.base-path=
spring.data.rest.default-page-size=
3, Rest测试
安装Chrome插件Postman REST Client来测试REST
服务测试:
1), jquery
e.g. $.ajax({
type:"GET",
datatype:"json",
url:"",
success:function(data){}
});
AngularJS:
$http:get(url); $http.post(url,data); $http.put(url,data); $http.delete(url);
四, 声明式事务
Spring的事务机制是用同一的机制来处理不同的数据访问技术的事务处理.
数据访问技术 | 实 现 |
JDBC | DataSourceTransactionManager |
JPA | JpaTransactionManager |
Hibernate | HibernateTransactionManager |
JDO | JdoTransactionManager |
分布式事务 | JtaTransactionManager |
1, 声明式事务
@Transactional: 来自org.springframework.transaction.annotation
表示该方法需要事务支持
@EnableTransactionManagement
注解在配置类上开启事务支持
2, 注解事务
@Transactional有如下的属性定义事务的行为:
属性 | 含 义 | 默认值 |
propagationtion | 定义事务的生命周期 REQUIRED, REQUIRED_NEW NESTED SUPPORTS NOT_SUPPORTED MANDATORY | REQUIRED |
issolation | | DEFAULT |
timeout | | TIMEOUT_DEFAULT |
readOnly | | false |
rollbackFor | | Throwable的子类 |
noRollbackFor | | Throwable的子类 |
| | |
五, 数据缓存
Spring定义了org.springframework.cache.CacheManagement 和
org.springframework.cache.Cache接口来统一不同的缓存技术.
1, CacheManager
CacheManager 实现
CacheManager | 描 述 |
SimpleCacheManager | 使用简单的Collection来存储缓存, 主要用来测试用途 |
ConcurrentMapCacheManager | 使用XoncurrentMap来存储缓存 |
NoOpCacheManager | 仅测试用途,不会实际存储E缓存 |
EhCacheCacheManager | 使用EhCache |
GuavaCacheManager | |
HazelcastCacheManager | |
JCacheCacheManager | |
RedisCacheManager | |
2, 声明式缓存注解
声明式缓存
注解 | 解释 |
@Cacheable | 在方法执行前先查看是否有缓存,有,则直接返回缓存 |
@CachePut | 无论如何把方法的返回值放到缓存中 |
@CacheEvict | 将一条或多条数据从缓存中删除 |
@Caching | 组合多个注解策略在一个方法上 |
3, 开启事务缓存支持
@EnableCaching即可
六, 非关系型数据库NoSQL
NoSQL是对于与使用关系作为数据管理的数据库系统的统称.
NoSQL有文档存储,图形关系存储,键值对存储.
MongoDB: 基于文档