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 文件



    4.0.0

    
    com.zwc
    springboot-mongodb-commons
    0.0.1-SNAPSHOT

    
    springboot-mongodb-commons
    公用工程

    
    
        
        UTF-8
        
        1.8

        
        Cairo-SR3

        
        1.2.47

        
        2.6.0
    

    
    
        
        
            org.springframework.boot
            spring-boot-starter-data-mongodb
        
        
        
            com.alibaba
            fastjson
            ${fastjson.version}
        
        
        
            org.apache.commons
            commons-pool2
            ${commons-pool2.version}
        
    

    
    
    
    
    
        
            
            
                io.spring.platform
                platform-bom
                ${platform-bom.version}
                pom
                import
            
        
    

    
    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    


  •  配置一些共用依赖,其中包括 spring-boot-starter-data-mongodb 依赖用来整合 mongodb

commons 工程 - MongoDB 工具类

package com.zwc.utils;

import com.mongodb.client.MongoCollection;
import com.mongodb.client.result.DeleteResult;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.List;

/**
 * @ClassName MongoDBClient
 * @Desc TODO   MongoDB 工具类
 * @Date 2019/4/1 9:43
 * @Version 1.0
 */
@Component
public class MongoDBClient {

    @Autowired
    private MongoTemplate mongoTemplate;

    /*
     * @ClassName MongoDBClient
     * @Desc TODO   创建集合,并返回是否创建成功  -2:已存在 / -1:创建失败 / 1:创建成功
     * @Date 2019/4/1 10:59
     * @Version 1.0
     */
    public Integer createCollection(String collectionName){
        // 先判断集合是否存在
        if(mongoTemplate.collectionExists(collectionName)){
            return -2;
        }else{
            // 创建一个集合
            mongoTemplate.createCollection(collectionName);
            // 判断集合是否存在
            if(mongoTemplate.collectionExists(collectionName)){
                return 1;
            }else{
                return -1;
            }
        }
    }

    /*
     * @ClassName MongoDBClient
     * @Desc TODO   在指定集合中添加数据
     * @Date 2019/4/1 11:12
     * @Version 1.0
     */
    public void add(Collection batchToSave , String collectionName){
        mongoTemplate.insert(batchToSave,collectionName);
    }

    /*
     * @ClassName MongoDBClient
     * @Desc TODO   根据条件和指定集合删除数据
     * @Date 2019/4/1 14:20
     * @Version 1.0
     */
    public void delete(Query query , Object obj , String collectionName){
        mongoTemplate.remove(query, obj.getClass(), collectionName);
    }

    /*
     * @ClassName MongoDBClient
     * @Desc TODO   根据条件更新数据
     * @Date 2019/4/1 14:30
     * @Version 1.0
     */
    public void update(Query query , Update update , Object obj , String collectionName){
        mongoTemplate.updateMulti(query , update , obj.getClass() , collectionName);
    }

    /*
     * @ClassName MongoDBClient
     * @Desc TODO   获取指定集合下的全部数据
     * @Date 2019/4/1 11:18
     * @Version 1.0
     */
    public List getAllByCollectionName(Object obj , String collectionName){
        return mongoTemplate.findAll(obj.getClass(),collectionName);
    }

    /*
     * @ClassName MongoDBClient
     * @Desc TODO   根据条件和集合名称查询数据
     * @Date 2019/4/1 11:31
     * @Version 1.0
     */
    public List getByConditionAndCollectionName(Query query , Object obj , String collectionName){
        return mongoTemplate.find(query, obj.getClass() , collectionName);
    }

}
  • 使用 @Autowired 注解自动装配 mongoTemplate 对象来操作 MongoDB
  • mongoTemplate 对象里面含有全面的增删改查操作,这里封装了几个最常用的方法

commons 工程 - 项目结构

SpringBoot整合MongoDB_第1张图片

service 工程 

service 工程是一个父工程,里面可能会包含 基础模块,用户模块,订单模块等等... 每个模块中又会分为 core 和 api

  此工程中需要注意的就只有下面两个地方

service 工程 - base-service-core - application.properties

# 端口
server.port=8081

# MongoDB 配置

## 无密码配置
## 如果存在此库就直接连接,如果不存在此库会自动创建
spring.data.mongodb.uri=mongodb://localhost:27017/springboot_mongodb

## 有密码配置
## name:用户名 / password:密码
###spring.data.mongodb.uri=mongodb://name:password@localhost:27017/springboot_mongodb
  • 连接 MongoDB 可以无用户名密码连接
  • 如果 MongoDB 设置了用户名密码,就得用第二种连接方式
  • 如何配置 Windows 本地 MongoDB 服务器的密码,在本文文末处有提到

 service 工程 - base-service-core - service

... 省略部分代码
/**
 * @ClassName UserService
 * @Desc TODO   springboot整合mongodb 实现服务类
 * @Date 2019/4/1 11:44
 * @Version 1.0
 */
@Service
public class UserService {

    @Autowired
    private MongoDBClient mongoDBClient;

    ... 省略部分代码
}

  • 因为 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_第2张图片

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

SpringBoot整合MongoDB_第3张图片

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

SpringBoot整合MongoDB_第4张图片

  • 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

      

 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

 

 

 

 

你可能感兴趣的:(SpringBoot)