SpringBoot访问MongoDB数据库

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有丰富的功能)之间架起一座桥梁,它集两者的优势于一身。传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。

MongoDB简介


MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有丰富的功能)之间架起一座桥梁,它集两者的优势于一身。

传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。

MongoDB中的一条记录就是一个文档,是一个数据结构,由字段和值对组成。MongoDB文档与JSON对象类似。字段的值有可能包括其它文档、数组以及文档数组。

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

MongoDB的CRUD


  • 添加pom.xml依赖

Spring Boot中可以通过在pom.xml中加入spring-boot-starter-data-mongodb引入对mongodb的访问支持依赖。

1. <dependency>
2.     <groupId>org.springframework.boot</groupId>
3.     <artifactId>spring-boot-starter-data-mongodb</artifactId>
4. </dependency>
• 创建Entity对象
5. package com.gemantic.entity;
6. 
7. import java.io.Serializable;
8. 
9. 
10. public class UserEntity implements Serializable {
11. 
12.     private static final long serialVersionUID = -3258839839160856613L;
13.     private Long id;
14.     private String userName;
15.     private String passWord;
16. 
17. 
18.     // 省略getter和setter
19. }
• CRUD
20. package com.gemantic.dao.impl;
21. 
22. import com.mongodb.WriteResult;
23. import com.gemantic.entity.UserEntity;
24. import org.springframework.beans.factory.annotation.Autowired;
25. import org.springframework.boot.autoconfigure.security.SecurityProperties;
26. import org.springframework.data.mongodb.core.MongoTemplate;
27. import org.springframework.data.mongodb.core.query.Criteria;
28. import org.springframework.data.mongodb.core.query.Query;
29. import org.springframework.data.mongodb.core.query.Update;
30. import org.springframework.stereotype.Service;
31. 
32. 
33. @Service
34. public class UserDaoImpl implements UserDao {
35. 
36.     @Autowired
37.     private MongoTemplate mongoTemplate;
38. 
39.     /**
40.      * 创建对象
41.      * @param user
42.      */
43.     @Override
44.     public void saveUser(UserEntity user) {
45.         mongoTemplate.save(user);
46.     }
47. 
48.     /**
49.      * 根据用户名查询对象
50.      * @param userName
51.      * @return
52.      */
53.     @Override
54.     public UserEntity findUserByUserName(String userName) {
55.         Query query = new Query(Criteria.where("userName").is(userName));
56.         UserEntity user = mongoTemplate.findOne(query , UserEntity.class);
57.         return user;
58.     }
59. 
60.     /**
61.      * 更新对象
62.      * @param user
63.      */
64.     @Override
65.     public int updateUser(UserEntity user) {
66.         Query query = new Query(Criteria.where("id").is(user.getId()));
67.         Update update = new Update().set("userName", user.getUserName()).set("passWord", user.getPassWord());
68.         //更新查询返回结果集的第一条
69.         WriteResult result = mongoTemplate.updateFirst(query, update, UserEntity.class);
70.         //更新查询返回结果集的所有
71.         // mongoTemplate.updateMulti(query, update, UserEntity.class);
72.         if(result != null) {
73.             return result.getN();
74.         } else {
75.             return 0;
76.         }
77.     }
78. 
79.     /**
80.      * 删除对象
81.      * @param id
82.      */
83.     @Override
84.     public void deleteUserById(Long id) {
85.         Query query = new Query(Criteria.where("id").is(id));
86.         mongoTemplate.remove(query, UserEntity.class);
87.     }
88. }

多数据源MongoDB的使用

  • 配置多数据源,这里配置两个数据源

application.yml

  1. 注意事项
1. mongodb:
2.   primary:
3.     host: 192.168.1.50
4.     port: 27017
5.     database: test
6.   secondary:
7.     host: 192.168.1.60
8.     port: 27017
9.     database: test1
• 封装读取以mongodb开头的两个配置文件
10. package com.gemantic.config;
11. 
12. import lombok.Data;
13. import org.springframework.boot.autoconfigure.mongo.MongoProperties;
14. import org.springframework.boot.context.properties.ConfigurationProperties;
15. 
16. 
17. @Data
18. @ConfigurationProperties(prefix = "mongodb")
19. public class MultipleMongoProperties {
20. 
21.     private MongoProperties primary = new MongoProperties();
22.     private MongoProperties secondary = new MongoProperties();
23. }
• 配置不同包路径下使用不同的数据源
PrimaryMongoConfig
1. package com.gemantic.config;
2. 
3. import org.springframework.context.annotation.Configuration;
4. import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
5. 
6. 
7. @Configuration
8. @EnableMongoRepositories(basePackages = "com.gemantic.model.primary",
9.         mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE)
10. public class PrimaryMongoConfig {
11. 
12.     protected static final String MONGO_TEMPLATE = "primaryMongoTemplate";
13. }
SecondaryMongoConfig
1. package com.gemantic.config;
2. 
3. import org.springframework.context.annotation.Configuration;
4. import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
5. 
6. 
7. @Configuration
8. @EnableMongoRepositories(basePackages = "com.gemantic.model.secondary",
9.         mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)
10. public class SecondaryMongoConfig {
11. 
12.     protected static final String MONGO_TEMPLATE = "secondaryMongoTemplate";
13. }
• 读取对应的配置信息并且构造对应的MongoTemplate,以下代码对两个库的配置信息已经完成。
14. package com.gemantic.config;
15. 
16. import com.mongodb.MongoClient;
17. import com.gemantic.config.MultipleMongoProperties;
18. import org.springframework.beans.factory.annotation.Autowired;
19. import org.springframework.beans.factory.annotation.Qualifier;
20. import org.springframework.boot.autoconfigure.mongo.MongoProperties;
21. import org.springframework.context.annotation.Bean;
22. import org.springframework.context.annotation.Configuration;
23. import org.springframework.context.annotation.Primary;
24. import org.springframework.data.mongodb.MongoDbFactory;
25. import org.springframework.data.mongodb.core.MongoTemplate;
26. import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
27. 
28. 
29. @Configuration
30. public class MultipleMongoConfig {
31. 
32.     @Autowired
33.     private MultipleMongoProperties mongoProperties;
34. 
35.     @Primary
36.     @Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)
37.     public MongoTemplate primaryMongoTemplate() throws Exception {
38.         return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));
39.     }
40. 
41.     @Bean
42.     @Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)
43.     public MongoTemplate secondaryMongoTemplate() throws Exception {
44.         return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));
45.     }
46. 
47.     @Bean
48.     @Primary
49.     public MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {
50.         return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
51.                 mongo.getDatabase());
52.     }
53. 
54.     @Bean
55.     public MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception {
56.         return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
57.                 mongo.getDatabase());
58.     }
59. }
• 创建两个库分别对应的对象和Repository
对应的Mongo的对象
1. package com.gemantic.model.primary;
2. 
3. import lombok.AllArgsConstructor;
4. import lombok.Data;
5. import lombok.NoArgsConstructor;
6. import org.springframework.data.annotation.Id;
7. import org.springframework.data.mongodb.core.mapping.Document;
8. 
9. @Data
10. @AllArgsConstructor
11. @NoArgsConstructor
12. @Document(collection = "first_mongo")
13. public class PrimaryMongoObject {
14. 
15.     @Id
16.     private String id;
17. 
18.     private String value;
19. 
20. }
对应的Repository,继承了 MongoRepository 会默认实现很多基本的增删改查,省了很多自己写dao层的代码
1. public interface PrimaryRepository extends MongoRepository<PrimaryMongoObject, String> {
2. }
• 主类,注意上面的注解
3. package com.gemantic;
4. 
5. import com.gemantic.config.props.MultipleMongoProperties;
6. import org.springframework.boot.SpringApplication;
7. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
8. import org.springframework.boot.autoconfigure.SpringBootApplication;
9. import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
10. import org.springframework.boot.context.properties.EnableConfigurationProperties;
11. import org.springframework.scheduling.annotation.EnableScheduling;
12. 
13. @EnableConfigurationProperties(MultipleMongoProperties.class)
14. @SpringBootApplication(exclude = MongoAutoConfiguration.class)
15. public class Application {
16. 
17.     public static void main(String[] args) {
18.         SpringApplication.run(Application.class, args);
19.     }
20. }
• 测试
21. @RunWith(SpringRunner.class)
22. @SpringBootTest
23. public class MuliDatabaseTest {
24. 
25.     @Autowired
26.     private PrimaryRepository primaryRepository;
27. 
28.     @Autowired
29.     private SecondaryRepository secondaryRepository;
30. 
31.     @Test
32.     public void TestSave() {
33. 
34.         this.primaryRepository.save(new PrimaryMongoObject(null, "第一个库的对象"));
35. 
36.         this.secondaryRepository.save(new SecondaryMongoObject(null, "第二个库的对象"));
37. 
38.     }
39. 
40.     @Test
41.     public void TestFindAll() {
42. 
43.         List<PrimaryMongoObject> primaries = this.primaryRepository.findAll();
44.         for (PrimaryMongoObject primary : primaries) {
45.             System.out.println(primary.toString());
46.         }
47. 
48.         List<SecondaryMongoObject> secondaries = this.secondaryRepository.findAll();
49. 
50.         for (SecondaryMongoObject secondary : secondaries) {
51.             System.out.println(secondary.toString());
52.         }
53.     }
54. 
55. }
  • springboot 依赖版本,1.5.3.RELEASE及以上
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
  • 启动类上的注解
@EnableConfigurationProperties(MultipleMongoProperties.class)
@SpringBootApplication(exclude = MongoAutoConfiguration.class)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
4天前
|
存储 NoSQL MongoDB
基于阿里云数据库MongoDB版,微财数科“又快又稳”服务超7000万客户
选择MongoDB主要基于其灵活的数据模型、高性能、高可用性、可扩展性、安全性和强大的分析能力。
|
2天前
|
存储 NoSQL MongoDB
mongodb的数据库表怎么创建
在此过程中,理解并掌握这些基本操作,是深入探索MongoDB魅力,乃至构建高效数据解决方案的关键所在。通过实践,您将更加深刻地体会到这种随需应变的数据管理模式带来的便利与效率提升。
7 0
|
4天前
|
存储 NoSQL MongoDB
小川科技携手阿里云数据库MongoDB:数据赋能企业构建年轻娱乐生态
基于MongoDB灵活模式的特性,小川实现了功能的快速迭代和上线,而数据库侧无需任何更改
|
4天前
|
运维 NoSQL BI
简道云搭载阿里云MongoDB数据库,帮助数以万计企业重构业务系统
通过与MongoDB和阿里云团队的合作,让简道云少走了弯路,保障了线上服务的长期稳定运行,提高了吞吐效率,并相应降低了线上运行成本
|
5天前
|
SQL NoSQL MongoDB
一款基于分布式文件存储的数据库MongoDB的介绍及基本使用教程
一款基于分布式文件存储的数据库MongoDB的介绍及基本使用教程
18 0
|
JSON NoSQL Java
mongoDB导出数据库所有集合内容到json文件
网上搜了一圈,官方并有提供批量导出所有集合到json文件的方法。有不少脚本可以实现,但是我还是习惯用java,如下 package starcLL.
2207 0
|
1月前
|
存储 NoSQL 关系型数据库
非关系型数据库-MongoDB技术(二)
非关系型数据库-MongoDB技术(二)
|
1月前
|
NoSQL 关系型数据库 MongoDB
非关系型数据库-MongoDB技术(一)
非关系型数据库-MongoDB技术(一)
|
18天前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
2月前
|
运维 监控 NoSQL
【MongoDB 复制集秘籍】Secondary 同步慢怎么办?深度解析与实战指南,让你的数据库飞速同步!
【8月更文挑战第24天】本文通过一个具体案例探讨了MongoDB复制集中Secondary成员同步缓慢的问题。现象表现为数据延迟增加,影响业务运行。经分析,可能的原因包括硬件资源不足、网络状况不佳、复制日志错误等。解决策略涵盖优化硬件(如增加内存、升级CPU)、调整网络配置以减少延迟以及优化MongoDB配置(例如调整`oplogSize`、启用压缩)。通过这些方法可有效提升同步效率,保证系统的稳定性和性能。
66 4