杰瑞科技汇

Java如何连接MongoDB?

目录

  1. 环境准备
  2. 添加依赖 (Maven)
  3. 基础连接代码
  4. 常用操作示例
    • 插入文档
    • 查询文档
    • 更新文档
    • 删除文档
  5. 高级配置
    • 连接字符串
    • 连接池配置
    • 认证
  6. 最佳实践
  7. 完整示例代码

环境准备

在开始之前,请确保您已经安装并运行了以下软件:

Java如何连接MongoDB?-图1
(图片来源网络,侵删)
  • 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 的核心步骤如下:

Java如何连接MongoDB?-图2
(图片来源网络,侵删)
  1. 创建一个 MongoClient 实例,这是与 MongoDB 通信的主要入口点。
  2. 获取一个 MongoDatabase 实例,代表你要操作的数据库,如果数据库不存在,MongoDB 会在第一次插入数据时自动创建。
  3. 获取一个 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);

最佳实践

  1. 单例 MongoClient: 整个应用只创建一个 MongoClient 实例。
  2. 使用 try-with-resources: 如果您创建的是 MongoClient,并且生命周期与请求/方法绑定,请使用 try-with-resources 确保其被关闭,对于全局单例,则在应用关闭时(如 ServletContextListenercontextDestroyed 方法中)关闭它。
  3. 处理异常: 总是使用 try-catch 块来处理 MongoException 或其他可能的异常。
  4. 使用 POJO (Plain Old Java Object): 为了更好的类型安全,您可以使用 MongoCollectionwithDocumentClass() 方法,并配合 CodecBson 注解来直接映射 Java 对象,而不是手动操作 Document,这需要额外的依赖 mongodb-driver-mapper-pojo
  5. 异步操作: 对于高并发应用,考虑使用异步驱动 mongodb-driver-reactivestreamsmongodb-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!

分享:
扫描分享到社交APP
上一篇
下一篇