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 数据库服务:
- 下载地址:https://www.mongodb.com/try/download/community
- 安装教程可参考官方文档
- 启动 MongoDB 服务:
mongod --dbpath=/data/db
1.2 创建 Maven 项目
使用 IDE 或命令行创建 Maven 项目:
mvn archetype:generate -DgroupId=com.example -DartifactId=mongodb-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
2. 添加 MongoDB 依赖
在 pom.xml
中添加 MongoDB Java 驱动依赖:
<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 基本连接方式
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 连接池配置
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 创建文档
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 查询文档
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 更新文档
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 删除文档
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 映射支持:
<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 创建实体类
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 进行操作
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);// 插入POJOUser newUser = new User();newUser.setName("赵六");newUser.setAge(35);newUser.setEmail("zhaoliu@example.com");users.insertOne(newUser);// 查询POJOSystem.out.println("所有用户:");users.find().forEach(user -> System.out.println(user.getName()));}}
}
6. 高级特性
6.1 索引管理
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 聚合查询
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. 事务支持
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. 最佳实践
-
连接管理:
- 使用连接池,避免频繁创建和关闭连接
- 确保在使用后关闭 MongoClient
-
错误处理:
- 捕获并处理 MongoDB 异常
- 使用重试机制处理网络问题
-
性能优化:
- 合理使用索引
- 批量操作代替单条操作
- 使用投影减少数据传输量
-
安全建议:
- 生产环境使用认证连接
- 配置适当的用户权限
- 敏感信息不要硬编码在代码中
-
监控与日志:
- 记录重要操作日志
- 监控 MongoDB 性能指标
通过以上步骤,您已经掌握了使用 Java 和 Maven 访问 MongoDB 数据库的基本和高级操作。根据实际应用场景选择合适的方法,可以构建高效、可靠的 MongoDB 应用程序。
之前本地搭建的数据库操作
文档添加
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();}
}
对应内容如下所示:
运行测试结果如下:
文档查询
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();}}
代码如下所示:
执行结果如下所示:
查询过滤
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();}
}
对应的代码如下所示:
运行结果如下所示: