把数据收集到一个非规范化的结构中,按照这种方式优化处理文档的数据库称之为文档数据库。文档数据库不适用于数据具有明显关联关系,因为文档数据库并没有针对存储这样的数据进行优化。

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的更多相关文章

  1. NoSql存储日志数据之Spring+Logback+Hbase深度集成

    NoSql存储日志数据之Spring+Logback+Hbase深度集成 关键词:nosql, spring logback, logback hbase appender 技术框架:spring-d ...

  2. Spring Data Redis 让 NoSQL 快如闪电(2)

    [编者按]本文作者为 Xinyu Liu,文章的第一部分重点概述了 Redis 方方面面的特性.在第二部分,将介绍详细的用例.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 把 Redis ...

  3. Spring Data Redis 让 NoSQL 快如闪电 (1)

    [编者按]本文作者为 Xinyu Liu,详细介绍了 Redis 的特性,并辅之以丰富的用例.在本文的第一部分,将重点概述 Redis 的方方面面.文章系国内 ITOM 管理平台 OneAPM 编译呈 ...

  4. Spring Boot 入门之缓存和 NoSQL 篇(四)

    原文地址:Spring Boot 入门之缓存和 NoSQL 篇(四) 博客地址:http://www.extlight.com 一.前言 当系统的访问量增大时,相应的数据库的性能就逐渐下降.但是,大多 ...

  5. Spring学习之旅(十三)--使用NoSQL数据库

    除了关系型数据库之外,现在还有一种 NoSQL 数据库非常流行,而 Spring 自然也没有放过对它的支持. NoSQL 数据库有很多种,如: MongoDBGenericJackson2JsonRe ...

  6. 【Spring Boot&&Spring Cloud系列】Spring Boot中使用NoSql数据库Redis

    github地址:https://github.com/AndyFlower/Spring-Boot-Learn/tree/master/spring-boot-nosql-redis 一.加入依赖到 ...

  7. spring boot(三):Spring Boot中Redis的使用

    spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...

  8. spring帝国-开篇

    spring简介: spring是一个开源框架,spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Dev ...

  9. 利用spring boot创建java app

    利用spring boot创建java app 背景 在使用spring框架开发的过程中,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置和复杂的bean依赖关系,特别是在使用mvc的时候各 ...

随机推荐

  1. ccf碰撞的小球

    之前的代码有人运行不成功,自己又看了一下是输入变量顺序输入错了,现在是正确答案- #include<stdio.h> struct node{ int x; int dir; }; int ...

  2. 【LeetCode】Anagram

    Anagram 指由颠倒字母顺序而构成的单词. e.g. 给出 ["eat", "tea", "tan", "ate", ...

  3. 二、工作中常用的SQL优化

    除了给table建立索引之外,保持良好的SQL语句编写. 1.通过变量的方式来设置参数 比如动态查询的时候,尽量这样写 好:string strSql=" SELECT * FROM PEO ...

  4. linux服务器磁盘扩容的方法

    1.系统环境如下图: 2.为该系统添加一块新的虚拟硬盘,添加后需重启虚拟机,否则系统不识别:如下图,/dev/sdc 是新添加的硬盘: 3.fdisk /dev/sdc为新硬盘创建分区: 4.Linu ...

  5. 4.Liunx磁盘管理

    1.磁盘管理:df .du 2.磁盘加载:mount. umount 3.磁盘分区:fdisk 1.df -h 查看硬件

  6. SSL证书读取

    证书内容: MIIDhDCCAmygAwIBAgIFAV0Imw0wDQYJKoZIhvcNAQELBQAwXDEnMCUGA1UEAwweczUwLTYyLTEzNS0xNS5zZWN1cmVzZX ...

  7. 使用Swagger2构建强大的RESTful API文档(1)(二十二)

    由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...

  8. Net Core2.0 升级到.Net Core 2.1

    1. 安装新 .Net Core SDK 2.1 2. 升级VS.net 到15.7, 这个版本极其不好用,IIS打中文会自动退出,但现在也没办法降级了.只能等微软打补丁. 3. 对于面向 ASP.N ...

  9. linux git:fatal: HTTP request failed

    问题 问题的出现比较奇怪 我一台电脑 git clone   没问题 另外一台电脑  git  clone  有问题 解决 yum update nss nss-util nspr 参考 https: ...

  10. Javaconfig形式配置Dubbo多注册中心

    多注册中心,一般用不到,但是某些情况下的确能解决不少问题,可以将某些dubbo服务注册到2套dubbo系统中,实现服务在2套系统间的共用. 网上的配置说明很多,但包括dubbo官方说明文档都是以xml ...