目录
<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>
工具类主要实现连接数据库操作以及对集合、文档的增删改查操作。
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("【删除集合】成功");
}
}
@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]
(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.
解决办法:有两种方法,一种是删除集合在创建,另一种是判断集合是否存在,存在则不创建,具体操作可看上面工具类的代码。