前言
MongoDB 和 Redis 一样,都属于 NoSQL 型的数据库,即非关系型的数据库;区别在于 Redis 的读写速度非常快,
一些操作频繁的场景很适合,作为临时缓存;而 MongoDB 善于存储,面对的是百万级甚至千万级的数据。
MongoDB 下载地址:https://www.mongodb.com/download-center/community?jmp=nav
Robo 3T 下载地址:https://robomongo.org/download
源码
GitHub地址:https://github.com/intomylife/SpringBoot
环境
- JDK 1.8.0 +
- Maven 3.0 +
- MongoDB 4.0
- SpringBoot 2.0.3
开发工具
- IntelliJ IDEA
- Robo 3T 1.1.1
正文
commons 工程 – POM 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 1<?xml version="1.0" encoding="UTF-8"?>
2<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4 <modelVersion>4.0.0</modelVersion>
5
6 <!-- 三坐标 -->
7 <groupId>com.zwc</groupId>
8 <artifactId>springboot-mongodb-commons</artifactId>
9 <version>0.0.1-SNAPSHOT</version>
10
11 <!-- 工程名称和描述 -->
12 <name>springboot-mongodb-commons</name>
13 <description>公用工程</description>
14
15 <!-- 在properties下声明相应的版本信息,然后在dependency下引用的时候用${spring-version}就可以引入该版本jar包了 -->
16 <properties>
17 <!-- 编码 -->
18 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
19 <!-- jdk -->
20 <java.version>1.8</java.version>
21
22 <!-- springboot -->
23 <platform-bom.version>Cairo-SR3</platform-bom.version>
24
25 <!-- ali json -->
26 <fastjson.version>1.2.47</fastjson.version>
27
28 <!-- commons 组件 -->
29 <commons-pool2.version>2.6.0</commons-pool2.version>
30 </properties>
31
32 <!-- 加入依赖 -->
33 <dependencies>
34 <!-- mongodb 依赖 -->
35 <dependency>
36 <groupId>org.springframework.boot</groupId>
37 <artifactId>spring-boot-starter-data-mongodb</artifactId>
38 </dependency>
39 <!-- ali json 依赖 -->
40 <dependency>
41 <groupId>com.alibaba</groupId>
42 <artifactId>fastjson</artifactId>
43 <version>${fastjson.version}</version>
44 </dependency>
45 <!-- commons 依赖 -->
46 <dependency>
47 <groupId>org.apache.commons</groupId>
48 <artifactId>commons-pool2</artifactId>
49 <version>${commons-pool2.version}</version>
50 </dependency>
51 </dependencies>
52
53 <!-- 依赖 jar 包版本管理的管理器 -->
54 <!-- 如果 dependencies 里的 dependency 自己没有声明 version 元素,那么 maven 就此处来找版本声明。 -->
55 <!-- 如果有,就会继承它;如果没有就会报错,告诉你没有版本信息 -->
56 <!-- 优先级:如果 dependencies 里的 dependency 已经声明了版本信息,就不会生效此处的版本信息了 -->
57 <dependencyManagement>
58 <dependencies>
59 <!-- SpringBoot -->
60 <dependency>
61 <groupId>io.spring.platform</groupId>
62 <artifactId>platform-bom</artifactId>
63 <version>${platform-bom.version}</version>
64 <type>pom</type>
65 <scope>import</scope>
66 </dependency>
67 </dependencies>
68 </dependencyManagement>
69
70 <!-- 插件依赖 -->
71 <build>
72 <plugins>
73 <plugin>
74 <groupId>org.springframework.boot</groupId>
75 <artifactId>spring-boot-maven-plugin</artifactId>
76 </plugin>
77 </plugins>
78 </build>
79
80</project>
81
82
- 配置一些共用依赖,其中包括 spring-boot-starter-data-mongodb 依赖用来整合 mongodb
commons 工程 – MongoDB 工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 1package com.zwc.utils;
2
3import com.mongodb.client.MongoCollection;
4import com.mongodb.client.result.DeleteResult;
5import org.bson.Document;
6import org.springframework.beans.factory.annotation.Autowired;
7import org.springframework.data.mongodb.core.MongoTemplate;
8import org.springframework.data.mongodb.core.query.Query;
9import org.springframework.data.mongodb.core.query.Update;
10import org.springframework.stereotype.Component;
11
12import java.util.Collection;
13import java.util.List;
14
15/**
16 * @ClassName MongoDBClient
17 * @Desc TODO MongoDB 工具类
18 * @Date 2019/4/1 9:43
19 * @Version 1.0
20 */
21@Component
22public class MongoDBClient {
23
24 @Autowired
25 private MongoTemplate mongoTemplate;
26
27 /*
28 * @ClassName MongoDBClient
29 * @Desc TODO 创建集合,并返回是否创建成功 -2:已存在 / -1:创建失败 / 1:创建成功
30 * @Date 2019/4/1 10:59
31 * @Version 1.0
32 */
33 public Integer createCollection(String collectionName){
34 // 先判断集合是否存在
35 if(mongoTemplate.collectionExists(collectionName)){
36 return -2;
37 }else{
38 // 创建一个集合
39 mongoTemplate.createCollection(collectionName);
40 // 判断集合是否存在
41 if(mongoTemplate.collectionExists(collectionName)){
42 return 1;
43 }else{
44 return -1;
45 }
46 }
47 }
48
49 /*
50 * @ClassName MongoDBClient
51 * @Desc TODO 在指定集合中添加数据
52 * @Date 2019/4/1 11:12
53 * @Version 1.0
54 */
55 public void add(Collection<?> batchToSave , String collectionName){
56 mongoTemplate.insert(batchToSave,collectionName);
57 }
58
59 /*
60 * @ClassName MongoDBClient
61 * @Desc TODO 根据条件和指定集合删除数据
62 * @Date 2019/4/1 14:20
63 * @Version 1.0
64 */
65 public void delete(Query query , Object obj , String collectionName){
66 mongoTemplate.remove(query, obj.getClass(), collectionName);
67 }
68
69 /*
70 * @ClassName MongoDBClient
71 * @Desc TODO 根据条件更新数据
72 * @Date 2019/4/1 14:30
73 * @Version 1.0
74 */
75 public void update(Query query , Update update , Object obj , String collectionName){
76 mongoTemplate.updateMulti(query , update , obj.getClass() , collectionName);
77 }
78
79 /*
80 * @ClassName MongoDBClient
81 * @Desc TODO 获取指定集合下的全部数据
82 * @Date 2019/4/1 11:18
83 * @Version 1.0
84 */
85 public List<?> getAllByCollectionName(Object obj , String collectionName){
86 return mongoTemplate.findAll(obj.getClass(),collectionName);
87 }
88
89 /*
90 * @ClassName MongoDBClient
91 * @Desc TODO 根据条件和集合名称查询数据
92 * @Date 2019/4/1 11:31
93 * @Version 1.0
94 */
95 public List<?> getByConditionAndCollectionName(Query query , Object obj , String collectionName){
96 return mongoTemplate.find(query, obj.getClass() , collectionName);
97 }
98
99}
100
101
- 使用 @Autowired 注解自动装配 mongoTemplate 对象来操作 MongoDB
- mongoTemplate 对象里面含有全面的增删改查操作,这里封装了几个最常用的方法
commons 工程 – 项目结构
service 工程
service 工程是一个父工程,里面可能会包含 基础模块,用户模块,订单模块等等… 每个模块中又会分为 core 和 api
**
此工程中需要注意的就只有下面两个地方**
service 工程 – base-service-core – application.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14 1# 端口
2server.port=8081
3
4# MongoDB 配置
5
6## 无密码配置
7## 如果存在此库就直接连接,如果不存在此库会自动创建
8spring.data.mongodb.uri=mongodb://localhost:27017/springboot_mongodb
9
10## 有密码配置
11## name:用户名 / password:密码
12###spring.data.mongodb.uri=mongodb://name:password@localhost:27017/springboot_mongodb
13
14
- 连接 MongoDB 可以无用户名密码连接
- 如果 MongoDB 设置了用户名密码,就得用第二种连接方式
- 如何配置 Windows 本地 MongoDB 服务器的密码,在本文文末处有提到
service 工程 – base-service-core – service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 1... 省略部分代码
2/**
3 * @ClassName UserService
4 * @Desc TODO springboot整合mongodb 实现服务类
5 * @Date 2019/4/1 11:44
6 * @Version 1.0
7 */
8@Service
9public class UserService {
10
11 @Autowired
12 private MongoDBClient mongoDBClient;
13
14 ... 省略部分代码
15}
16
17
18
- 因为 mongoDBClient 工具类使用了 @Component 注解把其注册到了 spring 中,所以这里 @Autowired 注解自动装配进来
启用项目,调用接口
注:调用接口时需打开 MongoDB 本地服务,要不然会报错
- 端口:8081(具体可以根据自己的喜好,在 application.properties 配置文件中配置 server.port)
- 添加一个集合接口:http://localhost:8081/user/createCollection
- 添加数据接口:http://localhost:8081/user/add
- 删除数据接口:http://localhost:8081/user/delete
- 更新数据接口:http://localhost:8081/user/update
- 查询全部数据接口:http://localhost:8081/user/getAll
- 根据条件查询数据接口:http://localhost:8081/user/get
service 工程 – 项目结构
- 在 service 总工程中创建了一个 base-service 的基础模块
- 每一个模块中都包含 api 和 core
- api:主要包含接口,常量以及实体类的扩展类
- core:带有启动类的工程,此模块的核心代码都在里面
把多工程项目使用 IntelliJ IDEA 打开
- 把项目从 GitHub 中下载到你的本地
- 打开 IntelliJ IDEA
- 点击 File -> Open
- 打开你下载到本地的项目目录
- springboot-mongodb -> springboot-mongodb-service(选择打开此工程)
- 打开 service 工程后
- 再次点击 File -> Project Structrue
- 选择 Modules,点击 '+' 符号
- 点击 Import Module
- 还是打开你下载到本地的项目目录
- springboot-mongodb -> springboot-mongodb-commons -> pom.xml
- 点击 OK
- 点击 Next,Finish
- 点击 Apply,OK
扩展
**本地 MongoDB 如何设置密码 **
在本地开发时,通常会在 Windows 上安装 MongoDB,但是它默认是没有密码的,我们开发时也一般
不会去设置这个。出于好奇,研究了一下如何设置 MongoDB 的密码。
** 注: 下载的 MongoDB 不一样的版本,里面的文件名称可能稍微有点不一样。这里 MongoDB 的版本为 4.0**
1. 打开下载好的 MongoDB 文件夹的 bin 目录
2. 里面文件很多很杂,我们需要关注的有
a) mongo.exe (连接操作 MongoDB)
b) mongod.cfg(MongoDB 配置信息)
3. 打开 mongo.exe
4. 输入指令 show dbs(显示所有库)
5. 输入指令 **use admin **
6. 输入指令 db.createUser({user:"
your name",pwd:"
your pwd",roles:[{role:"root",db:"admin"}]})
** (
your name 和
your pwd 自行更改为你自己的用户名和密码)**
** **7. 出现 Successfully added user 等信息时就证明成功创建了一个用户
8. 输入指令 db.auth("
your name","
your pwd") ,如返回 1,就证明身份验证成功
9. 如果在 SpringBoot 中拿这个用户名和密码连接新建的库,会出现错误(时间原因还没深究)
10. 我们需要给每一个库都配置一个连接的用户名和密码
11. 输入指令 use 库名
** **12. 输入指令 db.createUser({user:"
your name",pwd:"
your pwd",roles:[{role:"root",db:"admin"}]})
** (
your name 和
your pwd 自行更改为你自己的用户名和密码,
注:db 指定的还是 admin )**
13. 如果你下载了 Robo 3T 1.1.1,打开连接到本地,打开 System 文件夹 -> admin 库 -> Collections 文件夹
-> System 文件夹 -> 双击打开 system.users 集合 ,可以看到两条记录,也就是刚刚创建的两个用户
从命名可以轻易看出,是 库名.用户名 形式(第九点也算有点眉目)
14. 打开 mongod.cfg 文件,ctrl + F 查找 #security
15. 回车在下面一行粘贴 security:
** 16. 再回车,两个空格,粘贴 authorization: enabled**
17. 保存文件
18. 管理员身份运行 cmd , 输入指令 net stop "MongoDB Server"
** **19. 回车,服务停止成功后,再输入指令 net start "MongoDB Server"
20. 服务启动成功后,重新打开 mongo.exe
21. 直接输入指令 show dbs(显示所有库),会提示 error 信息,需要身份验证,证明配置成功
22. 如果你紧接着使用指令 **db.auth("
your name","
your pwd") **会发现报 error
23. 别慌,指令 use admin 进入到 admin 库,再使用指令 db.auth("
your name","
your pwd"),正常返回 1
结语
到此 SpringBoot 整合 MongoDB 就结束了,关键的点就这么多,多多尝试,一定会成功的!
希望能够帮助到你
over