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

mongodb简介

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

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

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

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

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

mongodb的增删改查

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

1、pom包配置

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

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  5. </dependency>
  6. </dependencies>

2、在application.properties中添加配置

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

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

  1. spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database

2、创建数据实体

  1. public class UserEntity implements Serializable {
  2. private static final long serialVersionUID = -3258839839160856613L;
  3. private Long id;
  4. private String userName;
  5. private String passWord;
  6. //getter、setter省略
  7. }

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

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

  1. @Component
  2. public class UserDaoImpl implements UserDao {
  3. @Autowired
  4. private MongoTemplate mongoTemplate;
  5. /**
  6. * 创建对象
  7. * @param user
  8. */
  9. @Override
  10. public void saveUser(UserEntity user) {
  11. mongoTemplate.save(user);
  12. }
  13. /**
  14. * 根据用户名查询对象
  15. * @param userName
  16. * @return
  17. */
  18. @Override
  19. public UserEntity findUserByUserName(String userName) {
  20. Query query=new Query(Criteria.where("userName").is(userName));
  21. UserEntity user = mongoTemplate.findOne(query , UserEntity.class);
  22. return user;
  23. }
  24. /**
  25. * 更新对象
  26. * @param user
  27. */
  28. @Override
  29. public void updateUser(UserEntity user) {
  30. Query query=new Query(Criteria.where("id").is(user.getId()));
  31. Update update= new Update().set("userName", user.getUserName()).set("passWord", user.getPassWord());
  32. //更新查询返回结果集的第一条
  33. mongoTemplate.updateFirst(query,update,UserEntity.class);
  34. //更新查询返回结果集的所有
  35. // mongoTemplate.updateMulti(query,update,UserEntity.class);
  36. }
  37. /**
  38. * 删除对象
  39. * @param id
  40. */
  41. @Override
  42. public void deleteUserById(Long id) {
  43. Query query=new Query(Criteria.where("id").is(id));
  44. mongoTemplate.remove(query,UserEntity.class);
  45. }
  46. }

4、开发对应的测试方法

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class UserDaoTest {
  4. @Autowired
  5. private UserDao userDao;
  6. @Test
  7. public void testSaveUser() throws Exception {
  8. UserEntity user=new UserEntity();
  9. user.setId(2l);
  10. user.setUserName("小明");
  11. user.setPassWord("fffooo123");
  12. userDao.saveUser(user);
  13. }
  14. @Test
  15. public void findUserByUserName(){
  16. UserEntity user= userDao.findUserByUserName("小明");
  17. System.out.println("user is "+user);
  18. }
  19. @Test
  20. public void updateUser(){
  21. UserEntity user=new UserEntity();
  22. user.setId(2l);
  23. user.setUserName("天空");
  24. user.setPassWord("fffxxxx");
  25. userDao.updateUser(user);
  26. }
  27. @Test
  28. public void deleteUserById(){
  29. userDao.deleteUserById(1l);
  30. }
  31. }

5、查看验证结果

可以使用工具mongoVUE工具来连接后直接图形化展示查看,也可以登录服务器用命令来查看

1.登录mongos

bin/mongo -host localhost -port 20000

2、切换到test库

use test

3、查询userEntity集合数据

db.userEntity.find()

根据3查询的结果来观察测试用例的执行是否正确。

到此springboot对应mongodb的增删改查功能已经全部实现。

多数据源mongodb的使用

在多mongodb数据源的情况下,我们换种更优雅的方式来实现

1、pom包配置

添加lombok和spring-boot-autoconfigure包引用

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.projectlombok</groupId>
  7. <artifactId>lombok</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-autoconfigure</artifactId>
  12. <version>RELEASE</version>
  13. </dependency>
  • Lombok - 是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。简单试了以下这个工具还挺好玩的,加上注解我们就不用手动写 getter\setter、构建方式类似的代码了。

  • spring-boot-autoconfigure - 就是spring boot的自动化配置

2、配置文件使用YAML的形式添加两条数据源,如下:

  1. mongodb:
  2. primary:
  3. host: 192.168.9.60
  4. port: 20000
  5. database: test
  6. secondary:
  7. host: 192.168.9.60
  8. port: 20000
  9. database: test1

3、配置两个库的数据源

封装读取以mongodb开头的两个配置文件

  1. @Data
  2. @ConfigurationProperties(prefix = "mongodb")
  3. public class MultipleMongoProperties {
  4. private MongoProperties primary = new MongoProperties();
  5. private MongoProperties secondary = new MongoProperties();
  6. }

配置不同包路径下使用不同的数据源

第一个库的封装

  1. @Configuration
  2. @EnableMongoRepositories(basePackages = "com.neo.model.repository.primary",
  3. mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE)
  4. public class PrimaryMongoConfig {
  5. protected static final String MONGO_TEMPLATE = "primaryMongoTemplate";
  6. }

第二个库的封装

  1. @Configuration
  2. @EnableMongoRepositories(basePackages = "com.neo.model.repository.secondary",
  3. mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)
  4. public class SecondaryMongoConfig {
  5. protected static final String MONGO_TEMPLATE = "secondaryMongoTemplate";
  6. }

读取对应的配置信息并且构造对应的MongoTemplate

  1. @Configuration
  2. public class MultipleMongoConfig {
  3. @Autowired
  4. private MultipleMongoProperties mongoProperties;
  5. @Primary
  6. @Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)
  7. public MongoTemplate primaryMongoTemplate() throws Exception {
  8. return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));
  9. }
  10. @Bean
  11. @Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)
  12. public MongoTemplate secondaryMongoTemplate() throws Exception {
  13. return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));
  14. }
  15. @Bean
  16. @Primary
  17. public MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {
  18. return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
  19. mongo.getDatabase());
  20. }
  21. @Bean
  22. public MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception {
  23. return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
  24. mongo.getDatabase());
  25. }
  26. }

两个库的配置信息已经完成。

4、创建两个库分别对应的对象和Repository

借助lombok来构建对象

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. @Document(collection = "first_mongo")
  5. public class PrimaryMongoObject {
  6. @Id
  7. private String id;
  8. private String value;
  9. @Override
  10. public String toString() {
  11. return "PrimaryMongoObject{" + "id='" + id + '\'' + ", value='" + value + '\''
  12. + '}';
  13. }
  14. }

对应的Repository

  1. public interface PrimaryRepository extends MongoRepository<PrimaryMongoObject, String> {
  2. }

继承了 MongoRepository 会默认实现很多基本的增删改查,省了很多自己写dao层的代码

Secondary和上面的代码类似就不贴出来了

5、最后测试

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class MuliDatabaseTest {
  4. @Autowired
  5. private PrimaryRepository primaryRepository;
  6. @Autowired
  7. private SecondaryRepository secondaryRepository;
  8. @Test
  9. public void TestSave() {
  10. System.out.println("************************************************************");
  11. System.out.println("测试开始");
  12. System.out.println("************************************************************");
  13. this.primaryRepository
  14. .save(new PrimaryMongoObject(null, "第一个库的对象"));
  15. this.secondaryRepository
  16. .save(new SecondaryMongoObject(null, "第二个库的对象"));
  17. List<PrimaryMongoObject> primaries = this.primaryRepository.findAll();
  18. for (PrimaryMongoObject primary : primaries) {
  19. System.out.println(primary.toString());
  20. }
  21. List<SecondaryMongoObject> secondaries = this.secondaryRepository.findAll();
  22. for (SecondaryMongoObject secondary : secondaries) {
  23. System.out.println(secondary.toString());
  24. }
  25. System.out.println("************************************************************");
  26. System.out.println("测试完成");
  27. System.out.println("************************************************************");
  28. }
  29. }

到此,mongodb多数据源的使用已经完成。

示例代码

spring boot(十一)MongoDB的使用的更多相关文章

  1. springboot(十一):Spring boot中mongodb的使用

    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...

  2. (转)Spring Boot(十一):Spring Boot 中 MongoDB 的使用

    http://www.ityouknow.com/springboot/2017/05/08/spring-boot-mongodb.html MongoDB 是最早热门非关系数据库的之一,使用也比较 ...

  3. Spring Boot(十一):Spring Boot 中 MongoDB 的使用

    MongoDB 是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配 ...

  4. 使用spring boot访问mongodb数据库

    一. spring boot中传参的方法 1.自动化配置 spring Boot 对于开发人员最大的好处在于可以对 Spring 应用进行自动配置.Spring Boot 会根据应用中声明的第三方依赖 ...

  5. MongoDB最简单的入门教程之四:使用Spring Boot操作MongoDB

    Spring Boot 是一个轻量级框架,可以完成基于 Spring 的应用程序的大部分配置工作.Spring Boot的目的是提供一组工具,以便快速构建容易配置的Spring应用程序,省去大量传统S ...

  6. SpringBoot(十一):Spring boot 中 mongodb 的使用

    原文出处: 纯洁的微笑 mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 ...

  7. Spring Boot开发MongoDB应用实践

    本文继续上一篇定时任务中提到的邮件服务,简单讲解Spring Boot中如何使用MongoDB进行应用开发. 上文中提到的这个简易邮件系统大致设计思路如下: 1.发送邮件支持同步和异步发送两种 2.邮 ...

  8. 记一次spring boot中MongoDB Prematurely reached end of stream的异常解决

    在spring boot项目中使用了mongodb,当一段时间没有操作mongodb,下次操作mongodb时就会出现异常.异常如下: org.springframework.data.mongodb ...

  9. Spring boot整合Mongodb

    最近的项目用了Mongodb,网上的用法大多都是七零八落的没有一个统一性,自己大概整理了下,项目中的相关配置就不叙述了,由于spring boot的快捷开发方式,所以spring boot项目中要使用 ...

随机推荐

  1. 【入门】Gradle的基本使用、在IDEA中的配置、常用命令

    一.介绍 java的源码构建工具,大致经历了 ant -> maven -> gradle 这个过程,每一次进步,都是在解决之前的工具所带来的问题,简单来说: 1. ant 功能虽然也很强 ...

  2. 1.2成员变量+类变量+static关键字

    成员变量和类变量的区别 由static修饰的变量称为静态变量,其实质上就是一个全局变量.如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰:没有被静态修饰的内容,其实是属于对象的特殊描述. 不 ...

  3. [POJ 2386] Lake Counting(DFS)

    Lake Counting Description Due to recent rains, water has pooled in various places in Farmer John's f ...

  4. Linux---centos 配置网络

    Linux配置网络,有两种方式,一种是通过图像化的界面来配置网络IP,另一种方式是通过命令行来配置IP 1.第一种方式通过图形化的界面来配置IP 1.0修改之前的IP地址 1.1点击图片中的那个 网络 ...

  5. ngnix简介以及如何实现负载均衡原理

    1 负载均衡 先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可以解释N台服务器平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况.那么负载均衡的前提就是要有多台服务器才能实现, ...

  6. POJ 3126 Prime Path(素数路径)

    POJ 3126 Prime Path(素数路径) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 The minister ...

  7. 【译】第23节---Fluent API - 实体映射

    原文:http://www.entityframeworktutorial.net/code-first/configure-entity-mappings-using-fluent-api.aspx ...

  8. 解决Geoserver请求跨域的几种思路,第二种思路用过

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景描述 跨域问题是浏览器同源安全制引起的特别常见的问题.不同前端语 ...

  9. MySQL数据库自动备份

    1.vi /home/wangcn/auto_log.sh#!/bin/bash #Shell Command For Backup MySQL Database Everyday Automatic ...

  10. VC.文件时间

    1. #include <stdio.h> #include <windows.h> void GetFileTimeZ(char *_pcFullFileName, FILE ...