目录
- 环境准备
- 添加依赖 (Maven)
- 基础连接代码
- 常用操作示例
- 插入文档
- 查询文档
- 更新文档
- 删除文档
- 高级配置
- 连接字符串
- 连接池配置
- 认证
- 最佳实践
- 完整示例代码
环境准备
在开始之前,请确保您已经安装并运行了以下软件:

(图片来源网络,侵删)
- Java Development Kit (JDK): 版本 8 或更高版本。
- Apache Maven: 用于管理项目依赖。
- MongoDB Server: 一个正在运行的 MongoDB 实例,您可以从 MongoDB 官网 下载并安装。
默认情况下,MongoDB 服务运行在 localhost:27017。
添加依赖 (Maven)
推荐使用 Maven 或 Gradle 来管理项目依赖,在您的 pom.xml 文件中,添加最新的 MongoDB Java 驱动依赖。
<dependencies>
<!-- MongoDB Java Driver -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.11.1</version> <!-- 请检查官网获取最新版本 -->
</dependency>
<!-- (可选) 用于 JSON 处理的库,驱动本身已包含,但显式声明更清晰 -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>bson</artifactId>
<version>4.11.1</version>
</dependency>
</dependencies>
注意: 版本号 11.1 是一个示例,请访问 Maven Central Repository 查找并使用最新的稳定版本。
基础连接代码
连接 MongoDB 的核心步骤如下:

(图片来源网络,侵删)
- 创建一个
MongoClient实例,这是与 MongoDB 通信的主要入口点。 - 获取一个
MongoDatabase实例,代表你要操作的数据库,如果数据库不存在,MongoDB 会在第一次插入数据时自动创建。 - 获取一个
MongoCollection实例,代表你要操作的集合(相当于关系型数据库中的表),如果集合不存在,它也会在第一次插入数据时自动创建。
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
public class MongoConnectionExample {
public static void main(String[] args) {
// 1. 定义连接字符串
// 格式: mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
String connectionString = "mongodb://localhost:27017";
// 2. 创建 MongoClient 实例
// 从 MongoDB 4.x 开始,推荐使用 MongoClients.create() 方法
try (MongoClient mongoClient = MongoClients.create(connectionString)) {
// 3. 获取数据库
// "mydb" 数据库不存在,MongoDB 会在首次使用时创建它
MongoDatabase database = mongoClient.getDatabase("mydb");
// 4. 获取集合
// "users" 集合不存在,它也会在首次使用时创建
MongoCollection<Document> collection = database.getCollection("users");
System.out.println("成功连接到 MongoDB 数据库 'mydb' 和集合 'users'");
// 5. (可选) 执行一个简单的操作来验证连接
// 插入一个文档
Document doc = new Document("name", "张三")
.append("age", 30)
.append("city", "北京");
collection.insertOne(doc);
System.out.println("成功插入文档: " + doc.toJson());
} catch (Exception e) {
System.err.println("连接 MongoDB 失败: " + e.getMessage());
e.printStackTrace();
}
}
}
重要提示: MongoClient 是一个重量级对象,它内部维护了连接池,最佳实践是在整个应用程序生命周期中只创建一个 MongoClient 实例,上面的 try-with-resources 语句是为了在示例中确保资源被正确关闭,但在实际应用中,您应该创建一次并复用它。
常用操作示例
假设我们已经连接到了 mydb 数据库的 users 集合。
插入文档
// 创建一个文档
Document user1 = new Document("name", "李四")
.append("email", "lisi@example.com")
.append("age", 25);
Document user2 = new Document("name", "王五")
.append("email", "wangwu@example.com")
.append("age", 28);
// 插入单个文档
collection.insertOne(user1);
// 插入多个文档
List<Document> users = Arrays.asList(user1, user2);
collection.insertMany(users);
查询文档
// 1. 查询所有文档
// find() 返回一个 FindIterable<Document>,需要遍历
System.out.println("--- 查询所有用户 ---");
collection.find().forEach(doc -> System.out.println(doc.toJson()));
// 2. 按条件查询 (查找年龄大于25的用户)
// 创建查询过滤器
Document queryFilter = new Document("age", new Document("$gt", 25));
System.out.println("--- 查找年龄大于25的用户 ---");
collection.find(queryFilter).forEach(doc -> System.out.println(doc.toJson()));
// 3. 查询特定字段 (只查找name和city)
// 创建投影器
Document projection = new Document("name", 1).append("city", 1).append("_id", 0); // _id默认包含,设置为0不包含
System.out.println("--- 只查找name和city ---");
collection.find().projection(projection).forEach(doc -> System.out.println(doc.toJson()));
更新文档
// 1. 更新单个文档
// 将 name 为 "张三" 的用户的年龄更新为 31
Document updateFilter = new Document("name", "张三");
Document updateOperation = new Document("$set", new Document("age", 31));
collection.updateOne(updateFilter, updateOperation);
// 2. 更新多个文档
// 将所有年龄小于30的用户的 city 设置为 "上海"
Document multiUpdateFilter = new Document("age", new Document("$lt", 30));
Document multiUpdateOperation = new Document("$set", new Document("city", "上海"));
UpdateResult result = collection.updateMany(multiUpdateFilter, multiUpdateOperation);
System.out.println("更新了 " + result.getModifiedCount() + " 个文档");
删除文档
// 1. 删除单个文档
// 删除 name 为 "李四" 的用户
Document deleteFilter = new Document("name", "李四");
collection.deleteOne(deleteFilter);
// 2. 删除多个文档
// 删除所有 city 为 "北京" 的用户
Document multiDeleteFilter = new Document("city", "北京");
DeleteResult deleteResult = collection.deleteMany(multiDeleteFilter);
System.out.println("删除了 " + deleteResult.getDeletedCount() + " 个文档");
高级配置
连接字符串
连接字符串是配置连接最灵活的方式,以下是一些常见选项:
String connectionString = "mongodb://localhost:27017"; // 带用户名和密码 // String connectionString = "mongodb://myUser:myPassword@localhost:27017"; // 指定数据库名 // String connectionString = "mongodb://localhost:27017/mydb"; // 连接多个服务器 (副本集) // String connectionString = "mongodb://host1:27017,host2:27017,host3:27017"; // 带连接池选项 // String connectionString = "mongodb://localhost:27017/?maxPoolSize=100&minPoolSize=5";
连接池配置
可以通过 MongoClientSettings 进行更精细的配置,例如连接池大小、超时时间等。
import com.mongodb.MongoClientSettings;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
// ... 其他 import ...
MongoClientSettings settings = MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("localhost", 27017))))
.applyToSocketSettings(builder ->
builder.connectTimeout(5, TimeUnit.SECONDS)) // 连接超时
.applyToConnectionPoolSettings(builder ->
builder.maxSize(100) // 最大连接数
.minSize(5) // 最小连接数
.maxWaitTime(30, TimeUnit.SECONDS)) // 获取连接最大等待时间
.build();
MongoClient mongoClient = MongoClients.create(settings);
认证 (用户名和密码)
如果您的 MongoDB 启用了认证,需要提供凭据。
// 方式一:在连接字符串中指定
String connectionString = "mongodb://myUser:myPassword@localhost:27017/mydb?authSource=admin";
// 方式二:使用 MongoClientSettings
MongoCredential credential = MongoCredential.createCredential(
"myUser",
"admin", // 认证数据库,通常是 "admin"
"myPassword".toCharArray()
);
MongoClientSettings settings = MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("localhost", 27017))))
.credential(credential)
.build();
MongoClient mongoClient = MongoClients.create(settings);
最佳实践
- 单例
MongoClient: 整个应用只创建一个MongoClient实例。 - 使用
try-with-resources: 如果您创建的是MongoClient,并且生命周期与请求/方法绑定,请使用try-with-resources确保其被关闭,对于全局单例,则在应用关闭时(如ServletContextListener的contextDestroyed方法中)关闭它。 - 处理异常: 总是使用
try-catch块来处理MongoException或其他可能的异常。 - 使用 POJO (Plain Old Java Object): 为了更好的类型安全,您可以使用
MongoCollection的withDocumentClass()方法,并配合Codec或Bson注解来直接映射 Java 对象,而不是手动操作Document,这需要额外的依赖mongodb-driver-mapper-pojo。 - 异步操作: 对于高并发应用,考虑使用异步驱动
mongodb-driver-reactivestreams或mongodb-driver-async,它们能更好地利用非阻塞 I/O。
完整示例代码
这是一个结合了连接、插入、查询、更新和删除的完整示例。
import com.mongodb.client.*;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import org.bson.Document;
import java.util.Arrays;
public class MongoFullExample {
public static void main(String[] args) {
// 连接字符串
String uri = "mongodb://localhost:27017";
try (MongoClient mongoClient = MongoClients.create(uri)) {
// 获取数据库和集合
MongoDatabase database = mongoClient.getDatabase("testdb");
MongoCollection<Document> collection = database.getCollection("employees");
// 清空集合,确保每次运行结果一致
collection.deleteMany(new Document());
// --- 1. 插入数据 ---
System.out.println("--- 插入数据 ---");
Document emp1 = new Document("name", "Alice").append("department", "Engineering").append("age", 30);
Document emp2 = new Document("name", "Bob").append("department", "Marketing").append("age", 25);
Document emp3 = new Document("name", "Charlie").append("department", "Engineering").append("age", 35);
collection.insertMany(Arrays.asList(emp1, emp2, emp3));
System.out.println("插入了3个员工文档。");
// --- 2. 查询所有数据 ---
System.out.println("\n--- 查询所有员工 ---");
collection.find().forEach(doc -> System.out.println(doc.toJson()));
// --- 3. 条件查询 ---
System.out.println("\n--- 查询Engineering部门的员工 ---");
collection.find(Filters.eq("department", "Engineering"))
.forEach(doc -> System.out.println(doc.toJson()));
// --- 4. 更新数据 ---
System.out.println("\n--- 将Alice的年龄更新为31 ---");
collection.updateOne(Filters.eq("name", "Alice"), Updates.set("age", 31));
System.out.println("更新完成。");
System.out.println("\n--- 查询更新后的Alice ---");
collection.find(Filters.eq("name", "Alice")).forEach(doc -> System.out.println(doc.toJson()));
// --- 5. 删除数据 ---
System.out.println("\n--- 删除Marketing部门的员工 ---");
DeleteResult deleteResult = collection.deleteMany(Filters.eq("department", "Marketing"));
System.out.println("删除了 " + deleteResult.getDeletedCount() + " 个文档。");
// --- 6. 最终查询 ---
System.out.println("\n--- 最终所有员工列表 ---");
collection.find().forEach(doc -> System.out.println(doc.toJson()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
希望这份指南能帮助您顺利地在 Java 项目中使用 MongoDB!
