• 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);  

  • 相关阅读:
    出自 HTML4 规范的可用颜色字符串值列表(常用颜色名称及对应的十六进制值)
    HTML5 Canvas 八星聚义动态效果
    HTML5 Canvas 绘制澳大利亚国旗
    HTML5 Canvas 绘制新西兰国旗
    HTML5 Canvas 绘制加拿大枫叶旗
    HTML5 Canvas 绘制英国国旗
    HTML5 Canvas 绘制星条旗
    当类中的方法全部都是 static 关键字修饰时 ,它的构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用,需要调用构造方法。 但 static的方法直接用类名调用就行!
    【Java面试复习经典】传智播客Java就业班入学测试题及答案解析(2014年版)
    【Java面试复习经典】传智播客Java就业班入学测试题及答案解析(2012年版)
  • 原文地址:https://www.cnblogs.com/forerver-elf/p/6555481.html
Copyright © 2020-2023  润新知