SpringBoot整合MongoDB

释放双眼,带上耳机,听听看~!

前言

  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 工程 – 项目结构

SpringBoot整合MongoDB

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 本地服务,要不然会报错 

  1. 端口:8081(具体可以根据自己的喜好,在 application.properties 配置文件中配置 server.port) 
  2. 添加一个集合接口:http://localhost:8081/user/createCollection
  3. 添加数据接口:http://localhost:8081/user/add
  4. 删除数据接口:http://localhost:8081/user/delete
  5. 更新数据接口:http://localhost:8081/user/update
  6. 查询全部数据接口:http://localhost:8081/user/getAll
  7. 根据条件查询数据接口:http://localhost:8081/user/get

service 工程 – 项目结构 

SpringBoot整合MongoDB

  • 在 service 总工程中创建了一个 base-service 的基础模块
  • 每一个模块中都包含 api 和 core

SpringBoot整合MongoDB

  • api:主要包含接口,常量以及实体类的扩展类

SpringBoot整合MongoDB

  • core:带有启动类的工程,此模块的核心代码都在里面

把多工程项目使用 IntelliJ IDEA  打开

  1. 把项目从 GitHub 中下载到你的本地
  2. 打开 IntelliJ IDEA 
  3. 点击 File -> Open
  4. 打开你下载到本地的项目目录
  5. springboot-mongodb -> springboot-mongodb-service(选择打开此工程)
  6. 打开 service 工程后
  7. 再次点击 File -> Project Structrue
  8. 选择 Modules,点击 '+' 符号
  9. 点击 Import  Module
  10. 还是打开你下载到本地的项目目录
  11. springboot-mongodb -> springboot-mongodb-commons -> pom.xml
  12. 点击 OK
  13. 点击 Next,Finish
  14. 点击 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**

      SpringBoot整合MongoDB

 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

 

 

 

 

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索