【杏彩】17.使用NoSQL技术

作者:计算机专家

MongoDB数据库简介

  • Spring Data提供其他项目,用来帮你使用各种各样的NoSQL技术,包括MongoDB, Neo4J, Elasticsearch, Solr, Redis,Gemfire, Couchbase和Cassandra。Spring Boot为Redis, MongoDB, Elasticsearch, Solr和Gemfire提供自动配置。你可以充分利用其他项目,但你需要自己配置它们。具体查看projects.spring.io/spring-data中合适的参考文档。

MongoDB是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多。由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置漏洞被攻击,数据被删,引起了人们的注意,感兴趣的可以看看这篇文章:场屠戮MongoDB的盛宴反思:超33000个数据库遭遇入侵勒索,同时也说明了很多公司生产中大量使用mongodb。

简介

Redis

  • Redis是一个缓存,消息中间件及具有丰富特性的键值存储系统。Spring Boot为Jedis客户端库和由Spring Data Redis提供的基于Jedis客户端的抽象提供自动配置。 spring-boot-starter-redis 'Starter POM'为收集依赖提供一种便利的方式。

mongodb简介

MongoDB是一个高性能,开源,无模式的,基于分布式文件存储的文档型数据库,由C++语言编写,其名称来源取自“humongous”,是一种开源的文档数据库──NoSql数据库的一种。NoSql,全称是 Not Only Sql,指的是非关系型的数据库。

连接Redis

  • 你可以注入一个自动配置的RedisConnectionFactory,StringRedisTemplate或普通的跟其他Spring Bean相同的RedisTemplate实例。默认情况下,这个实例将尝试使用localhost:6379连接Redis服务器。
@Component
public class MyBean {
    private StringRedisTemplate template;
    @Autowired
    public MyBean(StringRedisTemplate template) {
        this.template = template;
    }
// ...
}
  • 如果你添加一个你自己的任何自动配置类型的@Bean,它将替换默认的(除了RedisTemplate的情况,它是根据bean的名称'redisTemplate'而不是它的类型进行排除的)。如果在classpath路径下存在commons-pool2,默认你会获得一个连接池工厂。

MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业、各个行业以及各类应用程序的开源数据库。基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。

特点

MongoDB

  • MongoDB是一个开源的NoSQL文档数据库,它使用一个JSON格式的模式(schema)替换了传统的基于表的关系数据。Spring Boot为使用MongoDB提供了很多便利,包括 spring-boot-starter-data-mongodb 'Starter POM'。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

MongoDB数据库的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

连接MongoDB数据库
  • 你可以注入一个自动配置的 org.springframework.data.mongodb.MongoDbFactory 来访问Mongo数据库。默认情况下,该实例将尝试使用URL: mongodb://localhost/test 连接一个MongoDB服务器。
import org.springframework.data.mongodb.MongoDbFactory;
import com.mongodb.DB;
@Component
public class MyBean {
    private final MongoDbFactory mongo;
    @Autowired
    public MyBean(MongoDbFactory mongo) {
        this.mongo = mongo;
    }
    // ...
    public void example() {
        DB db = mongo.getDb();
// ...
    }
}
  • 你可以通过设置 spring.data.mongodb.uri 来改变该url,或指定一个host/port。比如,你可能会在你的application.properties中设置如下的属性:
 spring.data.mongodb.host=mongoserver
 spring.data.mongodb.port=27017

注:如果没有指定 spring.data.mongodb.port ,那将使用默认的端口27017。你可以简单的从上面的示例中删除这一行。如果不使用Spring Data Mongo,你可以注入com.mongodb.Mongo beans而不是使用MongoDbFactory。

  • 如果想全面控制MongoDB连接的建立,你也可以声明自己的MongoDbFactory或Mongo,@Beans。

传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。

* 面向集合存储,易存储对象类型的数据。 * 模式自由。 * 支持动态查询。 * 支持完全索引,包含内部对象。 * 支持查询。 * 支持复制和故障恢复。 * 使用高效的二进制数据存储,包括大型对象。 * 自动处理碎片,以支持云计算层次的扩展性 * 支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。 * 文件存储格式为BSON * 可通过网络访问

MongoDBTemplate
  • Spring Data Mongo提供了一个MongoTemplate类,它的设计和Spring的JdbcTemplate很相似。正如JdbcTemplate一样,Spring Boot会为你自动配置一个bean,你只需简单的注入它即可:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
    private final MongoTemplate mongoTemplate;
    @Autowired
    public MyBean(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }
// ...
}

MongoDB中的一条记录就是一个文档,是一个数据结构,由字段和值对组成。MongoDB文档与JSON对象类似。字段的值有可能包括其它文档、数组以及文档数组。MongoDB支持OS X、Linux及Windows等操作系统,并提供了Python,PHP,Ruby,Java及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。

MongoDB是一个开源的NoSQL文档数据库,它使用一个JSON格式的模式替换了传统的基于表的关系数据。Spring Boot为使用MongoDB提供了很多便利,包括spring-boot-starter-data-mongodb 'Starter POM'。

Spring Data MongoDB仓库
  • Spring Data的仓库包括对MongoDB的支持。正如上面讨论的JPA仓库,基本的原则是查询会自动基于你的方法名创建。

  • 实际上,不管是Spring Data JPA还是Spring Data MongoDB都共享相同的基础设施。所以你可以使用上面的JPA示例,并假设那个City现在是一个Mongo数据类而不是JPA @Entity,它将以同样的方式工作。

package com.example.myapp.domain;
import org.springframework.data.domain.*;
import org.springframework.data.repository.*;
public interface CityRepository extends Repository<City, Long> {
    Page<City> findAll(Pageable pageable);
    City findByNameAndCountryAllIgnoringCase(String name, String country);
}

MySQL的适合对大量或者无固定格式的数据进行存储,比如:日志、缓存等。对事物支持较弱,不适用复杂的多文档(多表)的级联查询。文中演示mongodb版本为3.4。

引入spring-boot-starter-data-mongodb包,在pom.xml配置文件中增加如下内容(基于之前章节“Spring Boot 构建框架”中的pom.xml文件):

Gemfire

  • Spring Data Gemfire为使用Pivotal Gemfire数据管理平台提供了方便的,Spring友好的工具。Spring Boot提供了一个用于聚集依赖的 spring-boot-starter-data-gemfire 'Starter POM'。目前不支持Gemfire的自动配置,但你可以使用一个单一的注解使Spring Data仓库支持它。(@EnableGemfireRepositories)

mongodb的增删改查

 org.springframework.boot spring-boot-starter-data-mongodb

Solr

  • Apache Solr是一个搜索引擎。Spring Boot为solr客户端库及Spring Data Solr提供的基于solr客户端库的抽象提供了基本的配置。Spring Boot提供了一个用于聚集依赖的 spring-boot-starter-data-solr 'Starter POM'。

spring Boot对各种流行的数据源都进行了封装,当然也包括了mongodb,下面给大家介绍如何在spring boot中使用mongodb:

注入一个自动配置的org.springframework.data.mongodb.MongoDbFactory来访问Mongo数据库。默认情况下,该实例将尝试使用URL: mongodb://localhost/test连接一个MongoDB服务器。

连接Solr
  • 你可以像其他Spring beans一样注入一个自动配置的SolrServer实例。默认情况下,该实例将尝试使用 localhost:8983/solr 连接一个服务器。
@Component
public class MyBean {
    private SolrServer solr;
    @Autowired
    public MyBean(SolrServer solr) {
        this.solr = solr;
    }
// ...
}
  • 如果你添加一个自己的SolrServer类型的@Bean,它将会替换默认的。

1、pom包配置

import org.springframework.data.mongodb.MongoDbFactory;import com.mongodb.DB;@Componentpublic class MyBean { private final MongoDbFactory mongo; @Autowired public MyBean { this.mongo = mongo; } // ... public void example() { DB db = mongo.getDb(); // ... }}
Spring Data Solr仓库
  • Spring Data的仓库包括了对Apache Solr的支持。正如上面讨论的JPA仓库,基本的原则是查询会自动基于你的方法名创建。

  • 实际上,不管是Spring Data JPA还是Spring Data Solr都共享相同的基础设施。所以你可以使用上面的JPA示例,并假设那个City现在是一个@SolrDocument类而不是JPA @Entity,它将以同样的方式工作。

pom包里面添加spring-boot-starter-data-mongodb包引用

可以通过设置spring.data.mongodb.uri来改变该url,或指定一个host/port。在application.properties中设置如下的属性:

Elasticsearch

  • Elastic Search是一个开源的,分布式,实时搜索和分析引擎。Spring Boot为Elasticsearch及Spring Data Elasticsearch提供的基于它的抽象提供了基本的配置。Spring Boot提供了一个用于聚集依赖的 spring-boot-starter-data-elasticsearch 'Starter POM'。
<dependencies>
  <dependency> 
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
  </dependency> 
</dependencies>
spring.data.mongodb.host=mongoserverspring.data.mongodb.port=27017
连接Elasticsearch
  • 你可以像其他Spring beans那样注入一个自动配置的ElasticsearchTemplate或Elasticsearch客户端实例。默认情况下,该实例将尝试连接到一个本地内存服务器(在Elasticsearch项目中的一个NodeClient),但你可以通过设置 spring.data.elasticsearch.clusterNodes 为一个以逗号分割的host:port列表来将其切换到一个远程服务器(比如,TransportClient)
@Component
public class MyBean {
    private ElasticsearchTemplate template;
    @Autowired
    public MyBean(ElasticsearchTemplate template) {
        this.template = template;
    }
// ...
}
  • 如果你添加一个你自己的ElasticsearchTemplate类型的@Bean,它将替换默认的。

2、在application.properties中添加配置

注意:如果没有指定spring.data.mongodb.port,那将使用默认的端口27017。可以简单的从上面的示例中删除这一行。如果不使用Spring Data Mongo,可以注入com.mongodb.Mongo beans而不是使用MongoDbFactory。如果想全面控制MongoDB连接的建立,也可以声明自己的MongoDbFactory或Mongo,@Beans。

Spring Data Elasticseach仓库
  • Spring Data的仓库包括了对Elasticsearch的支持。正如上面讨论的JPA仓库,基本的原则是查询会自动基于你的方法名创建。

  • 实际上,不管是Spring Data JPA还是Spring Data Elasticsearch都共享相同的基础设施。所以你可以使用上面的JPA示例,并假设那个City现在是一个Elasticsearch @Document类而不是JPA @Entity,它将以同样的方式工作。

spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test

MongoDBTemplate

多个IP集群可以采用以下配置:

Spring Data Mongo提供了一个MongoTemplate类,它的设计和Spring的JdbcTemplate很相似。正如JdbcTemplate一样,Spring Boot会自动配置一个bean,你只需简单的注入它即可:

spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.mongodb.core.MongoTemplate;import org.springframework.stereotype.Component;@Componentpublic class MyBean { private final MongoTemplate mongoTemplate; @Autowired public MyBean(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } // ...}

2、创建数据实体

应用集成MongoDB案例

public class UserEntity implements Serializable {
  private static final long serialVersionUID = -3258839839160856613L;
  private Long id;
  private String userName;
  private String passWord;
  //getter、setter省略
}

在application.properties配置文件中添加内容如下:

3、创建实体dao的增删改查操作

spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test

dao层实现了UserEntity对象的增删改查

多个IP集群采用以下配置:

@Component
public class UserDaoImpl implements UserDao {
 @Autowired
 private MongoTemplate mongoTemplate;
 /**
  * 创建对象
  * @param user
  */
 @Override
 public void saveUser(UserEntity user) {
  mongoTemplate.save(user);
 }
 /**
  * 根据用户名查询对象
  * @param userName
  * @return
  */
 @Override
 public UserEntity findUserByUserName(String userName) {
  Query query=new Query(Criteria.where("userName").is(userName));
  UserEntity user = mongoTemplate.findOne(query , UserEntity.class);
  return user;
 }
 /**
  * 更新对象
  * @param user
  */
 @Override
 public void updateUser(UserEntity user) {
  Query query=new Query(Criteria.where("id").is(user.getId()));
  Update update= new Update().set("userName", user.getUserName()).set("passWord", user.getPassWord());
  //更新查询返回结果集的第一条
  mongoTemplate.updateFirst(query,update,UserEntity.class);
  //更新查询返回结果集的所有
  // mongoTemplate.updateMulti(query,update,UserEntity.class);
 }
 /**
  * 删除对象
  * @param id
  */
 @Override
 public void deleteUserById(Long id) {
  Query query=new Query(Criteria.where("id").is(id));
  mongoTemplate.remove(query,UserEntity.class);
 }
}
spring.data.mongodb.uri=mongodb://user:pass@ip1:port1,ip2:port2/database

4、开发对应的测试方法

本文由杏彩发布,转载请注明来源

关键词: