Java-154 深入浅出 MongoDB 用Java访问 MongoDB 数据库 从环境搭建到CRUD完整示例

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI篇持续更新中!(长期更新)

AI炼丹日志-31- 千呼万唤始出来 GPT-5 发布!"快的模型 + 深度思考模型 + 实时路由",持续打造实用AI工具指南!📐🤖

💻 Java篇正式开启!(300篇)

目前2025年10月20日更新到:
Java-153 深入浅出 MongoDB 全面的适用场景分析与选型指南 场景应用指南

MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

Java 访问 MongoDB

Maven

通过 Java + Maven 访问 MongoDB 完整指南

1. 环境准备

1.1 安装 MongoDB

首先确保已在本地或远程服务器安装 MongoDB 数据库服务:

1.2 创建 Maven 项目

使用 IDE 或命令行创建 Maven 项目:

bash 复制代码
mvn archetype:generate -DgroupId=com.example -DartifactId=mongodb-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

2. 添加 MongoDB 依赖

pom.xml 中添加 MongoDB Java 驱动依赖:

xml 复制代码
<dependencies>
    <!-- MongoDB Java Driver -->
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver-sync</artifactId>
        <version>4.9.1</version>
    </dependency>
    
    <!-- 可选:添加日志框架 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.36</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.11</version>
    </dependency>
</dependencies>

3. 连接 MongoDB 数据库

3.1 基本连接方式

java 复制代码
public class MongoDBConnection {
    public static void main(String[] args) {
        // 连接字符串格式:mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
        String connectionString = "mongodb://localhost:27017";
        
        try (MongoClient mongoClient = MongoClients.create(connectionString)) {
            // 获取数据库(不存在时会自动创建)
            MongoDatabase database = mongoClient.getDatabase("testdb");
            
            System.out.println("成功连接到数据库: " + database.getName());
            
            // 列出所有集合(类似关系型数据库的表)
            for (String name : database.listCollectionNames()) {
                System.out.println("集合名称: " + name);
            }
        }
    }
}

3.2 连接池配置

java 复制代码
public class MongoDBPool {
    public static void main(String[] args) {
        ConnectionString connString = new ConnectionString(
            "mongodb://localhost:27017/?maxPoolSize=50&waitQueueTimeoutMS=2000");
        
        MongoClientSettings settings = MongoClientSettings.builder()
            .applyConnectionString(connString)
            .build();
        
        try (MongoClient mongoClient = MongoClients.create(settings)) {
            // 使用连接池进行操作...
        }
    }
}

4. CRUD 操作示例

4.1 创建文档

java 复制代码
public class CreateExample {
    public static void main(String[] args) {
        try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) {
            MongoDatabase database = mongoClient.getDatabase("testdb");
            MongoCollection<Document> collection = database.getCollection("users");
            
            // 创建单个文档
            Document user1 = new Document("name", "张三")
                .append("age", 25)
                .append("email", "zhangsan@example.com")
                .append("hobbies", Arrays.asList("篮球", "阅读", "旅行"));
            
            collection.insertOne(user1);
            System.out.println("文档插入成功");
            
            // 批量插入
            List<Document> users = new ArrayList<>();
            users.add(new Document("name", "李四").append("age", 30));
            users.add(new Document("name", "王五").append("age", 28));
            
            collection.insertMany(users);
            System.out.println("批量插入完成");
        }
    }
}

4.2 查询文档

java 复制代码
public class QueryExample {
    public static void main(String[] args) {
        try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) {
            MongoCollection<Document> collection = mongoClient
                .getDatabase("testdb")
                .getCollection("users");
            
            // 查询所有文档
            System.out.println("所有用户:");
            collection.find().forEach(doc -> System.out.println(doc.toJson()));
            
            // 条件查询
            System.out.println("\n年龄大于25岁的用户:");
            collection.find(gt("age", 25))
                .forEach(doc -> System.out.println(doc.toJson()));
            
            // 组合查询
            System.out.println("\n年龄在25-30之间的用户:");
            collection.find(and(gt("age", 25), lt("age", 30)))
                .forEach(doc -> System.out.println(doc.toJson()));
        }
    }
}

4.3 更新文档

java 复制代码
public class UpdateExample {
    public static void main(String[] args) {
        try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) {
            MongoCollection<Document> collection = mongoClient
                .getDatabase("testdb")
                .getCollection("users");
            
            // 更新单个文档
            collection.updateOne(
                eq("name", "张三"),
                set("email", "newemail@example.com")
            );
            
            // 更新多个文档
            collection.updateMany(
                lt("age", 30),
                inc("age", 1)  // 年龄加1
            );
            
            // 替换整个文档
            Document newUser = new Document("name", "张三")
                .append("age", 26)
                .append("address", "北京市海淀区");
            
            collection.replaceOne(eq("name", "张三"), newUser);
        }
    }
}

4.4 删除文档

java 复制代码
public class DeleteExample {
    public static void main(String[] args) {
        try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) {
            MongoCollection<Document> collection = mongoClient
                .getDatabase("testdb")
                .getCollection("users");
            
            // 删除单个文档
            collection.deleteOne(eq("name", "王五"));
            
            // 删除多个文档
            collection.deleteMany(lt("age", 25));
            
            // 删除整个集合
            // collection.drop();
        }
    }
}

5. 使用 POJO 映射

5.1 添加依赖

pom.xml 中添加 POJO 映射支持:

xml 复制代码
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.9.1</version>
</dependency>
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>bson</artifactId>
    <version>4.9.1</version>
</dependency>

5.2 创建实体类

java 复制代码
public class User {
    private ObjectId id;
    
    @BsonProperty("name")
    private String name;
    
    @BsonProperty("age")
    private int age;
    
    @BsonProperty("email")
    private String email;
    
    // 构造方法、getter和setter
    // ...
}

5.3 使用 POJO 进行操作

java 复制代码
public class PojoExample {
    public static void main(String[] args) {
        CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();
        CodecRegistry pojoCodecRegistry = fromRegistries(
            getDefaultCodecRegistry(), 
            fromProviders(pojoCodecProvider)
        );
        
        try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) {
            MongoDatabase database = mongoClient
                .getDatabase("testdb")
                .withCodecRegistry(pojoCodecRegistry);
            
            MongoCollection<User> users = database.getCollection("users", User.class);
            
            // 插入POJO
            User newUser = new User();
            newUser.setName("赵六");
            newUser.setAge(35);
            newUser.setEmail("zhaoliu@example.com");
            users.insertOne(newUser);
            
            // 查询POJO
            System.out.println("所有用户:");
            users.find().forEach(user -> System.out.println(user.getName()));
        }
    }
}

6. 高级特性

6.1 索引管理

java 复制代码
import com.mongodb.client.model.Indexes;

public class IndexExample {
    public static void main(String[] args) {
        try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) {
            MongoCollection<Document> collection = mongoClient
                .getDatabase("testdb")
                .getCollection("users");
            
            // 创建单字段索引
            collection.createIndex(Indexes.ascending("name"));
            
            // 创建复合索引
            collection.createIndex(Indexes.compoundIndex(
                Indexes.ascending("name"), 
                Indexes.descending("age")
            ));
            
            // 查看所有索引
            for (Document index : collection.listIndexes()) {
                System.out.println(index.toJson());
            }
        }
    }
}

6.2 聚合查询

java 复制代码
import static com.mongodb.client.model.Aggregates.*;
import static com.mongodb.client.model.Accumulators.*;
import static com.mongodb.client.model.Projections.*;
import static com.mongodb.client.model.Filters.*;

public class AggregationExample {
    public static void main(String[] args) {
        try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) {
            MongoCollection<Document> collection = mongoClient
                .getDatabase("testdb")
                .getCollection("users");
            
            // 按年龄分组统计人数
            collection.aggregate(Arrays.asList(
                group("$age", sum("count", 1)),
                sort(descending("count"))
            )).forEach(doc -> System.out.println(doc.toJson()));
            
            // 更复杂的聚合管道
            collection.aggregate(Arrays.asList(
                match(gt("age", 20)),
                project(fields(
                    include("name"),
                    computed("birthYear", new Document("$subtract", 
                        Arrays.asList(2023, "$age")))
                ))
            )).forEach(doc -> System.out.println(doc.toJson()));
        }
    }
}

7. 事务支持

java 复制代码
import com.mongodb.client.ClientSession;
import com.mongodb.client.TransactionBody;

public class TransactionExample {
    public static void main(String[] args) {
        String connectionString = "mongodb://localhost:27017";
        
        try (MongoClient mongoClient = MongoClients.create(connectionString)) {
            ClientSession session = mongoClient.startSession();
            
            // 事务操作
            TransactionBody<String> txnBody = () -> {
                MongoDatabase database = mongoClient.getDatabase("bank");
                MongoCollection<Document> accounts = database.getCollection("accounts");
                
                // 转账操作
                accounts.updateOne(
                    session, 
                    eq("account_id", "A123"), 
                    new Document("$inc", new Document("balance", -100))
                );
                
                accounts.updateOne(
                    session, 
                    eq("account_id", "B456"), 
                    new Document("$inc", new Document("balance", 100))
                );
                
                return "转账成功";
            };
            
            try {
                // 执行事务
                String result = session.withTransaction(txnBody);
                System.out.println(result);
            } catch (RuntimeException e) {
                System.err.println("事务失败: " + e.getMessage());
            } finally {
                session.close();
            }
        }
    }
}

8. 最佳实践

  1. 连接管理

    • 使用连接池,避免频繁创建和关闭连接
    • 确保在使用后关闭 MongoClient
  2. 错误处理

    • 捕获并处理 MongoDB 异常
    • 使用重试机制处理网络问题
  3. 性能优化

    • 合理使用索引
    • 批量操作代替单条操作
    • 使用投影减少数据传输量
  4. 安全建议

    • 生产环境使用认证连接
    • 配置适当的用户权限
    • 敏感信息不要硬编码在代码中
  5. 监控与日志

    • 记录重要操作日志
    • 监控 MongoDB 性能指标

通过以上步骤,您已经掌握了使用 Java 和 Maven 访问 MongoDB 数据库的基本和高级操作。根据实际应用场景选择合适的方法,可以构建高效、可靠的 MongoDB 应用程序。

之前本地搭建的数据库操作

文档添加

java 复制代码
package icu.wzk;
public class Mongo01 {

    public static void main(String[] args) {
        MongoClient mongoClient = new MongoClient(
                ServerAddressHelper.createServerAddress("localhost", 27017),
                MongoCredential.createCredential("admin", "admin", "admin123".toCharArray()),
                new MongoClientOptions.Builder().build());
        MongoDatabase mongoDatabase = mongoClient.getDatabase("wzk_test");
        MongoCollection<Document> collection = mongoDatabase.getCollection("wzk_document");
        Document document = new Document("name", "wzk").append("age", 18);
        collection.insertOne(document);
        mongoClient.close();
    }
}

对应内容如下所示:

运行测试结果如下:

文档查询

java 复制代码
package icu.wzk;
public class Mongo02 {

    public static void main(String[] args) {
        MongoClient mongoClient = new MongoClient(
                ServerAddressHelper.createServerAddress("localhost", 27017),
                MongoCredential.createCredential("admin", "admin", "admin123".toCharArray()),
                new MongoClientOptions.Builder().build());
        MongoDatabase mongoDatabase = mongoClient.getDatabase("wzk_test");
        MongoCollection<Document> collection = mongoDatabase.getCollection("wzk_document");
        Document document = new Document();
        document.append("age", -1);
        FindIterable<Document> findIterable = collection.find().sort(document);
        for (Document document1 : findIterable) {
            System.out.println(document1.toJson());
        }
        mongoClient.close();
    }

}

代码如下所示:

执行结果如下所示:

查询过滤

java 复制代码
package icu.wzk;
public class Mongo03 {
    public static void main(String[] args) {
        MongoClient mongoClient = new MongoClient(
                ServerAddressHelper.createServerAddress("localhost", 27017),
                MongoCredential.createCredential("admin", "admin", "admin123".toCharArray()),
                new MongoClientOptions.Builder().build());
        MongoDatabase mongoDatabase = mongoClient.getDatabase("wzk_test");
        MongoCollection<Document> collection = mongoDatabase.getCollection("wzk_document");
        Document document = new Document();
        document.append("age", -1);
        FindIterable<Document> findIterable = collection.find(
                Filters.eq("name", "wzk")
        ).sort(document);
        for (Document document1 : findIterable) {
            System.out.println(document1.toJson());
        }
        mongoClient.close();
    }
}

对应的代码如下所示:

运行结果如下所示:

相关推荐
原来是猿4 小时前
谈谈环境变量
java·开发语言
Austindatabases4 小时前
DBA 从“修电脑的” 到 上演一套 “数据治理” 大戏 --- 维护DBA生存空间,体现个体价值
数据库·dba
LB21125 小时前
Redis黑马点评 day01
数据库·redis·缓存
白小筠5 小时前
创建Django项目
数据库·django·sqlite
-曾牛5 小时前
深入浅出 SQL 注入
网络·sql·安全·网络安全·渗透测试·sql注入·盲注
oioihoii5 小时前
深入理解 C++ 现代类型推导:从 auto 到 decltype 与完美转发
java·开发语言·c++
韩立学长5 小时前
【开题答辩实录分享】以《租房小程序的设计和实现》为例进行答辩实录分享
java·spring boot·小程序
zl9798995 小时前
SpringBoot-数据访问之MyBatis与Redis
java·spring boot·spring