SpringBoot集成MongoDB(6.0.12)

发布时间:2024年01月10日

目录

1. 引入pom依赖

2.工具类

3.测试类

4. 集成时候遇到的问题总结


1. 引入pom依赖

<dependencies>
	<dependency>  
		 <groupId>org.mongodb</groupId>  
		 <artifactId>mongodb-driver-legacy</artifactId>  
		 <version>4.4.0</version>  
	</dependency>  
	<dependency>  
		 <groupId>org.slf4j</groupId>  
		 <artifactId>slf4j-log4j12</artifactId>  
		 <version>1.7.30</version>  
	</dependency>  
	<dependency>  
		 <groupId>org.projectlombok</groupId>  
		 <artifactId>lombok</artifactId>  
		 <version>1.18.22</version>  
	</dependency>
	<dependency>  
		 <groupId>cn.hutool</groupId>  
		 <artifactId>hutool-all</artifactId>  
		 <version>5.7.21</version>  
	</dependency>
</dependencies>

2.工具类

工具类主要实现连接数据库操作以及对集合、文档的增删改查操作。

import cn.hutool.core.util.ObjectUtil;

import com.mongodb.ConnectionString;
import com.mongodb.client.*;
import com.mongodb.client.model.Filters;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;

import java.util.*;

@Slf4j
public class MongoDBUtils {

    private MongoDatabase mongoDatabase;

    private MongoCollection<Document> collection;

    public MongoDBUtils(String hostIp, Integer port, String userName, String password, String databaseName) {
        if (mongoDatabase == null) {
            mongoDatabase = connectDB(hostIp, port, userName, password, databaseName);
        }
    }

    /**
     * 连接数据库(如果数据库不存在,则自动创建数据库)
     *
     * @param host         数据库ip
     * @param port         数据库连接端口
     * @param userName     登陆用户名
     * @param password     密码
     * @param databaseName 数据库名称
     */
    public MongoDatabase connectDB(String host, Integer port, String userName, String password, String databaseName) {
        try {
            String addr = "mongodb://";
            if (ObjectUtil.isAllNotEmpty(userName, password)) {
                addr += userName + ":" + password + "@";
            }
            addr += host + ":" + port;
            if (ObjectUtil.isNotEmpty(databaseName)) {
                addr += "/" + databaseName;
            }

            MongoClient mongoClient = MongoClients.create(new ConnectionString(addr));

            //连接数据库
            MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName);
            log.info("【连接数据库】成功");
            return mongoDatabase;
        } catch (Exception e) {
            log.info("【连接数据库】失败");
            log.error(e.getClass().getName() + ": " + e.getMessage());
        }
        return null;
    }
    
    /**
     * 创建集合
     * @param collectionName 集合名称
     */
    public void createCollection(String collectionName) {
        List<String> collectionNames = listCollectionNames();
        if (!collectionNames.contains(collectionName)) {
            mongoDatabase.createCollection(collectionName);
            log.info("【创建集合】成功");
        } else {
            log.info("【创建集合】集合已存在");
        }

    }

    /**
     * 获取集合
     * @param collectionName 集合名称
     */
    public MongoCollection<Document> getCollection(String collectionName) {
        if (collection == null) {
            collection = mongoDatabase.getCollection(collectionName);
        }
        return collection;
    }

    /**
     * 查询所有集合
     */
    public List<String> listCollectionNames() {
        MongoIterable<String> iterable = mongoDatabase.listCollectionNames();
        MongoCursor<String> cursor = iterable.iterator();
        List<String> list = new ArrayList<>();
        while (cursor.hasNext()) {
            list.add(cursor.next());
        }
        log.info("【查询所有集合】" + list.toString());
        return list;
    }

    /**
     * 插入文档
     * @param collectionName 集合名称
     * @param map            插入对象
     */
    public void insertDocument(String collectionName, Map<String, Object> map) {
        //获取集合
        MongoCollection<Document> collection = getCollection(collectionName);

        //插入文档
        Document document = new Document(map);
        List<Document> documents = new ArrayList<Document>();
        documents.add(document);
        collection.insertMany(documents);
        log.info("【插入文档】成功");
    }

    /**
     * 检索所有文档
     * @param collectionName 集合名称
     */
    public void find(String collectionName) {
        //获取集合
        MongoCollection<Document> collection = getCollection(collectionName);

        //检索所有的文档
        FindIterable<Document> findIterable = collection.find();
        MongoCursor<Document> mongoCursor = findIterable.iterator();
        String doc = "";
        while (mongoCursor.hasNext()) {
            doc += mongoCursor.next() + " \n";
        }
        log.info("【检索所有文档】具体内容如下:\n" + doc);
        log.info("【检索所有文档】检索结束--------------------");
    }

    /**
     * 更新文档
     * @param collectionName 集合名称
     * @param fieldName 字段名
     * @param oldValue 旧值
     * @param newValue 新值
     */
    public void updateMany(String collectionName, String fieldName, Object oldValue, Object newValue) {
        //获取集合
        MongoCollection<Document> collection = getCollection(collectionName);

        //更新文档
        collection.updateMany(Filters.eq(fieldName, oldValue), new Document("$set", new Document(fieldName, newValue)));
        log.info("【更新文档】成功");
    }

    /**
     * 删除符合条件的第一个文档
     * @param collectionName 集合名称
     * @param fieldName 字段名
     * @param value 旧值
     */
    public void deleteOne(String collectionName, String fieldName, String value) {
        //获取集合
        MongoCollection<Document> collection = getCollection(collectionName);

        //删除符合条件的第一个文档
        collection.deleteOne(Filters.eq(fieldName, value));
        log.info("【删除第一个文档】成功");
    }

    /**
     * 删除所有符合条件的文档
     * @param collectionName 集合名称
     * @param fieldName 字段名
     * @param value 旧值
     */
    public void deleteMany(String collectionName, String fieldName, Object value) {
        //获取集合
        MongoCollection<Document> collection = getCollection(collectionName);

        //更新文档
        collection.deleteMany(Filters.eq(fieldName, value));
        log.info("【删除所有符合条件文档】成功");
    }

    /**
     * 删除集合
     * @param collectionName 集合名称
     */
    public void dropCollection(String collectionName) {
        //获取集合
        MongoCollection<Document> collection = getCollection(collectionName);

        //删除集合
        collection.drop();
        log.info("【删除集合】成功");
    }
}

3.测试类

@Slf4j
public class Test {
    public static void main(String[] args) {
        String host = "localhost";          //数据库ip/域名
        Integer port = 27017;               //数据库服务器访问端口
        String userName = "stu";            //登录用户
        String password= "123456";          //密码
        String databaseName= "student";     //数据库名
        String collectionName = "account";  //集合名
        //log.info("--------------数据库连接(无需认证)--------------");
        //MongoDBUtils utils = new MongoDBUtils(host, port , null, null, databaseName);
        log.info("--------------数据库连接(认证)--------------");
        MongoDBUtils utils = new MongoDBUtils(host, port , userName, password, databaseName);
        log.info("--------------创建集合account--------------");
        utils.createCollection(collectionName);
        log.info("--------------插入文档--------------");
        Map<String, Object> map = new HashMap<>();
        map.put("name", "张三");
        map.put("age", 20);
        map.put("sex", "男");
        map.put("爱好", Arrays.asList(new String[]{"打篮球", "看电影", "打游戏"}));
        utils.insertDocument(collectionName, map);
        map = new HashMap<>();
        map.put("name", "李四");
        map.put("age", 25);
        map.put("sex", "女");
        map.put("爱好", Arrays.asList(new String[]{"弹琴", "逛街"}));
        utils.insertDocument(collectionName, map);
        log.info("--------------插入后检索所有文档--------------");
        utils.find(collectionName);
        log.info("--------------更新文档--------------");
        utils.updateMany(collectionName, "age", 20, 18);
        log.info("--------------更新后检索所有文档--------------");
        utils.find(collectionName);
        log.info("--------------删除所有符合条件的文档--------------");
        utils.deleteMany(collectionName, "age", 18);
        log.info("--------------删除后检索所有文档--------------");
        utils.find(collectionName);
        log.info("--------------删除集合--------------");
        utils.dropCollection(collectionName);
        log.info("--------------查询所有集合account--------------");
        utils.listCollectionNames();
    }
}

以下是控制台打印的日志:

15:05:16.598 [main] INFO com.example.mytestproject.MongoDB.Test - --------------数据库连接(认证)--------------
15:05:17.436 [main] INFO com.example.mytestproject.MongoDB.MongoDBUtils - 【连接数据库】成功
15:05:17.436 [main] INFO com.example.mytestproject.MongoDB.Test - --------------创建集合account--------------
15:05:18.168 [main] INFO com.example.mytestproject.MongoDB.MongoDBUtils - 【创建集合】成功
15:05:18.168 [main] INFO com.example.mytestproject.MongoDB.Test - --------------插入文档--------------
15:05:18.205 [main] INFO com.example.mytestproject.MongoDB.MongoDBUtils - 【插入文档】成功
15:05:18.205 [main] INFO com.example.mytestproject.MongoDB.Test - --------------插入后检索所有文档--------------

15:05:18.214 [main] INFO com.example.mytestproject.MongoDB.MongoDBUtils - 【检索所有文档】具体内容如下:
Document{{_id=659e41ae94a1ff3389b91e6d, 爱好=[打篮球, 看电影, 打游戏], sex=男, name=张三, age=20}} 
Document{{_id=659e41ae94a1ff3389b91e6e, 爱好=[弹琴, 逛街], sex=女, name=李四, age=25}} 

15:05:18.214 [main] INFO com.example.mytestproject.MongoDB.MongoDBUtils - 【检索所有文档】检索结束--------------------
15:05:18.214 [main] INFO com.example.mytestproject.MongoDB.Test - --------------更新文档--------------
15:05:18.227 [main] INFO com.example.mytestproject.MongoDB.MongoDBUtils - 【更新文档】成功
15:05:18.227 [main] INFO com.example.mytestproject.MongoDB.Test - --------------更新后检索所有文档--------------
15:05:18.228 [main] INFO com.example.mytestproject.MongoDB.MongoDBUtils - 【检索所有文档】具体内容如下:
Document{{_id=659e41ae94a1ff3389b91e6d, 爱好=[打篮球, 看电影, 打游戏], sex=男, name=张三, age=18}} 
Document{{_id=659e41ae94a1ff3389b91e6e, 爱好=[弹琴, 逛街], sex=女, name=李四, age=25}} 

15:05:18.228 [main] INFO com.example.mytestproject.MongoDB.MongoDBUtils - 【检索所有文档】检索结束--------------------
15:05:18.228 [main] INFO com.example.mytestproject.MongoDB.Test - --------------删除所有符合条件的文档--------------

15:05:18.233 [main] INFO com.example.mytestproject.MongoDB.MongoDBUtils - 【删除所有符合条件文档】成功
15:05:18.233 [main] INFO com.example.mytestproject.MongoDB.Test - --------------删除后检索所有文档--------------
15:05:18.234 [main] INFO com.example.mytestproject.MongoDB.MongoDBUtils - 【检索所有文档】具体内容如下:
Document{{_id=659e41ae94a1ff3389b91e6e, 爱好=[弹琴, 逛街], sex=女, name=李四, age=25}} 

15:05:18.234 [main] INFO com.example.mytestproject.MongoDB.MongoDBUtils - 【检索所有文档】检索结束--------------------
15:05:18.234 [main] INFO com.example.mytestproject.MongoDB.Test - --------------删除集合--------------
15:05:18.238 [main] INFO com.example.mytestproject.MongoDB.MongoDBUtils - 【删除集合】成功
15:05:18.238 [main] INFO com.example.mytestproject.MongoDB.Test - --------------查询所有集合account--------------
15:05:18.239 [main] INFO com.example.mytestproject.MongoDB.MongoDBUtils - 【查询所有集合】[users]

4. 集成时候遇到的问题总结

(1)报错:Command failed with error 13 (Unauthorized): 'command listCollections requires authentication' on server localhost:27017.

解决办法:数据库需要用账号密码进行身份认证。

(2)报错:Command failed with error 48 (NamespaceExists): 'Collection student.account already exists.' on server localhost:27017.

解决办法:有两种方法,一种是删除集合在创建,另一种是判断集合是否存在,存在则不创建,具体操作可看上面工具类的代码。

文章来源:https://blog.csdn.net/qq_39512532/article/details/135503675
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。