Spring NoSQL
把数据收集到一个非规范化的结构中,按照这种方式优化处理文档的数据库称之为文档数据库。文档数据库不适用于数据具有明显关联关系,因为文档数据库并没有针对存储这样的数据进行优化。
Spring Data MongoDB提供了三种方式在Spring应用中使用MongoDB:
通过注解实现对象-关系映射
使用MongoTemplate实现基于模板的数据库访问
自动化的运行时Repository生成功能
配置MongoDB
配置MongoClinent
配置MongoTeplate bean,实现基于模板的数据库访问
自己创建MongoClient
@Configuration
@EnableMongoRepository("cherry.repository")
public class MongoConfig{ @Bean
public MongoFactoryBean mongo(){
MongoFactoryBean mongo = new MongoFactoryBean();
mongo.setHost("localhost");
return mongo;
} @Bean
public MongoOperations mongoTemplate(Mongo mongo){
return new MongoTemplate(mongo, "databaseName");
} }
通过继承AbstractMongoConfiguration配置MongoDB的连接,在配置中没有直接声明MongoTemplate,但是它会被隐式地创建
@Configuration
//@EnableMongoRepository启动了Spring Data自动化JPA Repository生成功能。
@EnableMongoRepository("cherry.repository")
public class MongoConfig extends AbstractMongoConfiguration{ @Autowired
private Environment env; @Override
protected String getDatabaseName(){
return "databaseName";
} @Override
public Mongo mongo() throws Exception{
MongoCredential credential = MongoCredential.creatrMongoCRCredential(env.getProperty("mongo.username"), "databaseName", env.getProperty("mongo.password").toCharArray());
return new MongoClient(new ServerAddress("localhost", 37017), Arrays.asList(credential));
} }
通过xml配置
<?xml verion="1.0" encoding="UTF-8" ?>
<beans xmln="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/beans
http://www.springframework.ofg/schema/beans/spring-beans.xsd" > <mongo:repositories base-package="cherry.repository" /> <mong:mong /> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongo" />
<constructor-arg value="databaseName" />
</bean> </beans>
用于对象-文档映射的Spring Data Mongo注解
@Document 标示映射到MongoDB文档上的领域对象
@Id 标示某个域为Id
@DbRef 标示某个域要引用其他文档,这个文档可能位于另外一个数据库
@Field 为文档域指定自定义的元数据
@Version 标示某个属性用作版本域
使用Spring Data自动生成Repository
public interface OrderRepository extends MongoRepository<Order, String>{
List<Order> findByCustomer(String customer);
List<Order> findByCustomerLike(String customer);
List<Order> findByCustomerAndType(String customer, String type);
List<Order> findByCustomerLikeAndType(String customer, String type);
}
OrderRepository继承了MongoRepository,为Order文档类提供基本的CRUD操作MongoRepository接口有两个参数,第一个是带有@Document注解的对象类型,第二参数是带有@Id注解的属性类型
通过扩展MongoRepository后Spring Data MongoDB自动实现的方法
long count() 返回指定Repository类型的文档数量
void delete(Iterable<? extends T>) 删除与指定对象关联的所有文档
void delete(T) 删除与指定对象关联的文档
void delelte(ID) 根据ID删除某一文档
void deleteAll() 删除指定Repository类型的所有文档
boolean exists(Object) 如果存在于指定对象相关联的文档,则返回true
boolean exists(ID) 如果存在指定ID的文档,则返回true
List<T> findAll() 返回指定Repository类型的所有文档
List<T> findAll(Iterable<ID>) 返回指定文档ID对应的所有文档
List<T> finalAll(Pageable) 为指定的Repository类型,返回分页且排序的文档列表
List<T> findAll(Sort) 为指定的Repository类型,返回排序后的所有文档列表
T findOne(ID) 为指定的ID返回单个文档
Save(Iterabble<S>) 保存指定Iterable中的所有文档
Save(<S>) 为给定的对象保存一条文档
@Query注解可以为Repository方法指定自定义查询。@Query根据给定的JSON与所有的Order文档进行匹配,并返回匹配的围挡
混合定义Repository
public interface OrderOperations{
List<Order> findOrdersByType(String type);
} public class OrderRepositoryImpl implements OrderOperations{ @Autowired
private MongoOperations mongo; @Override
public List<Order> findOrdersByType(String type){
String type = type.equals("NET") ? "WEB" : type;
Criteria where = Criteria.where("type").is(t);
Query query = Query.query(where);
return mongo.find(query, Order.class);
}
} public interface OrderRepository extends MongoRepository<Order, String>. OrderOperations(){}
将这些关联起来的关键点在于实现类的名称为OrderRepositoryImpl。这个名字的前半部分与OrderRepository相同,只是添加了Impl后缀。当Spring Data MongoDB生成Repository实现时,它会查找这个类并将其混合到自动生成的实现中。如下,可以在MongoConfig中通过配置EnableMongoRepositories查找具备不同后缀的类。
@EnableMongoRepositories(basePackage="cherry.repository", repositoryImplementationPostfix="impl")
文档型数据库会将数据存储到粗粒度的文档中,而图数据库会将数据存储到多个细粒度的节点中,这些节点之间通过关系建立关联。图数据库中的一个节点通常会对应数据库中的一个概念(concept),它会具备描述节点状态的属性。连接两个节点的关联关系节能也会带有属性。图数据库可能会成为关系型数据库的无模式(schemaless)替代方案。
配置Neo4JConfig
@Configuration
@EnableNeo4jReositories(basePackages="cherry.repository")
public class Neo4jConfig extends Neo4jConfiguration{ public Neo4jConfig(){
setBasePackage("cherry.repository");
} @Bean(destroyMethod="shutdown")
public GraphDatabaseService graphDatabaseService(){
return new GraphDatabaseFactory().newEmbeddedDatabase("/tmp/graphdb");
}
// 通过RESTful API连接远程Neo4j服务器
@Bean(destroyMethod="shutdown")
public GraphDatabaseService graphDatabaseService(){
return new SpringRestGraphDatabase("http://graphdbserver:7474/db/data/");
} //配置可验证的Neo4j
public GraphDatabaseService graphDatabaseService(Environment env){
return new SpringRestGraphDatabase("http://graphdbServer:7474/db/data/", env.getProperty("db.username"), env.getProperty("db.password"));
}
}
@EnableNeo4jRepositories注解能让Spring Data Neo4j自动生成Neo4j Repository实现。它会扫描basePackage属性设置repository的包扩展Repository标记接口的其他接口。在Neo4j中,嵌入式指的是数据库引擎与应用运行在同一个JVM中,作为应用的一部分,而不是独立的服务器。数据会持久化到文件系统中。
Spring Data Neo4j领域类型映射为图中的节点和关联关系
@NodeEntity 将Java类型声明为节点实体
@RelationshipEntity 将Java类型声明为关联关系实体
@StartNode 将某个属性声明为关联关系实体的就开始节点
@EndNode 将某个属性声明为关联关系实体的结束节点
@Fetch 将实体的属性声明为立即加载
@GraphId 将某个属性设置为实体的ID域(这个域的类型必须是Long)
@GraphProperty 明确声明某个属性
@GraphTraversal 声明某个属性会自动提供一个iterable元素,这个元素是图遍历所构建的
@Indexed 声明某个属性应该被索引
@Labels 为@NodeEntity声明标签
@Query 声明某个属性会自动提供一个iterable元素,这个元素是执行给定的Cypher查询所构建的
@QueryResult 声明某个Java或接口能够持有查询的结果
@ReletedTo 通过某个属性,声明当前的@NodeEntity与另外一个@NodeEntity之间的关联关系
@RelatedToVia 在@NodeEntity上声明某个属性,指定其引用该节点所属的某一个@RelationshipEntity
@RelationshipType 将某个域声明为关联实体类型
@ResultColumn 在带有@QueryResult注解的类型上,将某个属性声明为获取查询结果集中的某个特定列
Redis
Redis被称为key-value存储。Spring Data Redis包含了很多模板的实现用来完成Redis数据库的数据存取功能。
Redis的连接
Redis连接工厂会生成到Redis数据库服务器的连接。Spring Data Redis为四种Redis客户端实现提供了连接工厂:
JedisConnectionFactory
JredisConnectionFactory
LettuceConnectionFactory
SrpConnectionFactory
将连接工厂配置为Spring中的bean
// connect to the localhost:6379 as default
@Bean
public RedisConnectionFactory redisCF(){
return new JedisConnectionFactory();
} // connect to the remote
@Bean
public RedisConnectionFactory redisCF(){
JedisConnectionFactoru cf = new JedisConnectionFactory();
cf.setHostName("redis-server");
cf.setPort(portNumber);
cf.setPassword("password");
return cf;
}
Spring Data Redis提供了两个模板:
RedisTemplate
StringRedisTemplate
RedisTemplate可以持久化各种类型的key和value,并不局限于字节数组。StringRedisTemplate扩展了RedisTemplate只关注String类型。
RedisConnectionFactory cf = new JedisConnectionFactory();
RedisTemplate<String, Product> redis = new RedisTempalte<String, Product>();
redis.setConnectionFactory(cf);
如果Key和Value都是String类型,可以使用StringRedisTemplate代替RedisTemplate
RedisConnectionFactory cf = new JedisConnectionFactory();
StringRedisTemplate redis = new StringRedisTemplate(cf);
配置RedisTemplate的Bean
@Bean
public RedisTemplate<String, Product> redisTemplate(RedisConnectionFactory cf){
RedisTemplate<String, Product> redis = new RedisTemplate<String, Product>();
redis.setConnectionFactory(cf);
return redis;
} @Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf){
return new StringRedisTemplate(cf);
}
RedisTemplate API
opsForValue() ValueOperations<K, V> 操作具有简单指的条目
opsForList() ListOperations<K, V> 操作具有list值的条目
opsForSet() SerOperations<K, V> 操作具有set值的条目
opsForZSet() ZSetOperations<K, V> 操作具有ZSet值的条目
opsForHash() Hashoperations<K, V> 操作具有hash值的条目
boundValuesOps(K) BoundValueOptions<K, V> 以绑定指定key的方式,操作具有简单值的条目
boundListOps(K) BoundList<K, V> 以绑定指定key的方式,操作具有set值的条目
boundZSet(K) BoundZSetOperations<K, V> 以绑定指定key的方式,操作具有ZSet值的条目
boundHashOps(K) BoundHashOperations<K, V> 以绑定key的方式,操作具有hash的条目
使用key和value的序列化器
当某个条目保存到Redis key-value存储的时候,key和value会使用Redis的序列化器进行序列化。Spring Data Redis提供了几个序列器:
GenericToStringSerializer:使用Spring转换服务进行序列化
JacksonJsonRedisSerializer:使用Jackson1,将对象序列化为JSON
Jackson2JsonRedisSerializer:使用Jackson2,将对象序列化为JSON
JdkSerializationRedisSerializer:使用java序列化
OxmSerializer:使用Spring O/X映射的编排器和解排器(marshaler和unmarshaler)实现序列化,用于XML序列化
StringRedisSerializer:序列化String类型的key和value
RedisTemplate默认使用JdkSerializationRedisSerializer。StringRedisTemplate默认使用StringRedisSerializer。
redis.setValueSerializer(new Jackson2JsonRedisSerializer<Product>)(Product.class);
Spring NoSQL的更多相关文章
- NoSql存储日志数据之Spring+Logback+Hbase深度集成
NoSql存储日志数据之Spring+Logback+Hbase深度集成 关键词:nosql, spring logback, logback hbase appender 技术框架:spring-d ...
- Spring Data Redis 让 NoSQL 快如闪电(2)
[编者按]本文作者为 Xinyu Liu,文章的第一部分重点概述了 Redis 方方面面的特性.在第二部分,将介绍详细的用例.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 把 Redis ...
- Spring Data Redis 让 NoSQL 快如闪电 (1)
[编者按]本文作者为 Xinyu Liu,详细介绍了 Redis 的特性,并辅之以丰富的用例.在本文的第一部分,将重点概述 Redis 的方方面面.文章系国内 ITOM 管理平台 OneAPM 编译呈 ...
- Spring Boot 入门之缓存和 NoSQL 篇(四)
原文地址:Spring Boot 入门之缓存和 NoSQL 篇(四) 博客地址:http://www.extlight.com 一.前言 当系统的访问量增大时,相应的数据库的性能就逐渐下降.但是,大多 ...
- Spring学习之旅(十三)--使用NoSQL数据库
除了关系型数据库之外,现在还有一种 NoSQL 数据库非常流行,而 Spring 自然也没有放过对它的支持. NoSQL 数据库有很多种,如: MongoDBGenericJackson2JsonRe ...
- 【Spring Boot&&Spring Cloud系列】Spring Boot中使用NoSql数据库Redis
github地址:https://github.com/AndyFlower/Spring-Boot-Learn/tree/master/spring-boot-nosql-redis 一.加入依赖到 ...
- spring boot(三):Spring Boot中Redis的使用
spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...
- spring帝国-开篇
spring简介: spring是一个开源框架,spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Dev ...
- 利用spring boot创建java app
利用spring boot创建java app 背景 在使用spring框架开发的过程中,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置和复杂的bean依赖关系,特别是在使用mvc的时候各 ...
随机推荐
- 在spring中,C3P0的一些配置(部分)
<!-- c3p0连接池配置 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPoo ...
- Hadoop---hu-hadoop1: mv: cannot stat `/home/bigdata/hadoop-2.6.0/logs/hadoop-root-datanode-hu-hadoop1.out.4': No such file or directory
hu-hadoop1: mv: cannot stat `/home/bigdata/hadoop-2.6.0/logs/hadoop-root-datanode-hu-hadoop1.out.4': ...
- 使用JQuery 合并两个 json 对象
一,保存object1和2合并后产生新对象,若2中有与1相同的key,默认2将会覆盖1的值 var object = $.extend({}, object1, object2); 二,将2的值合并到 ...
- 微信小程序初见+nodejs服务端 (一个简单的博客)
推荐网址: 腾讯云快速开发(nodejs前后端):https://developers.weixin.qq.com/miniprogram/dev/qcloud/qcloud.html#%E5%AF% ...
- Apache支持TRACE请求漏洞处理方案
trace和get一样是http的一种请求方法,该方法的作用是回显收到的客户端请求,一般用于测试服务器运行状态是否正常. 该方法结合浏览器漏洞可能造成跨站脚本攻击.修复方法如下: 编缉/etc/htt ...
- a标签在编辑器中可以整体删除并且a标签为不可编辑的情况下 标签依然存在(棒棒哒)
a标签在编辑器中可以整体删除并且a标签为不可编辑的情况下 标签依然存在 因为给a标签的后面 添加了一个空元素,如<i></i>(棒棒哒)<div contentEdita ...
- 顺序容器----顺序容器操作,vector对象如何增长,额外的string操作,容器适配器
一.顺序容器操作 1.向顺序容器添加元素 向顺序容器(array除外)添加元素的操作: 操作 说明 c.push_back(t) 在c的尾部创建一个值为t的元素.返回void c.emplace_ba ...
- LY.JAVA面向对象编程.final、多态、抽象类、接口
2018-07-08 13:47:26 final关键字 多态 从右向前念 多态的成员访问特点及转型的理解 多态的问题理解: class 孔子爹 { public int age = 40; p ...
- laravel文件上传(本人使用的ftp驱动配置,本地测试总结)
1.电脑端在:控制面板->程序和功能->打开和关闭Window功能,安装:Internet信息服务的(Ftp服务器,web管理工具的IIS管理服务,万网服务的常见http功能) 2.在电脑 ...
- tomcat vue webpack vue-router 404
社区已经有结局方案了, http://blog.csdn.net/hayre/article/details/70145513