本文介绍NoSQL技术:MongoDB用Java来连接数据库,执行常见的数据库操作,使用环境:IntelliJ IDEA、Ubuntu24.04。
配置Maven
我们需要使用“MongoDB Driver”,所以先打开“MongoDB Java Driver”项目,但是提示说这个项目已经不维护了,被“mongodb-driver-sync”这个项目替代了:
我们根据链接,跳转到“mongodb-driver-sync”项目,这个项目的名称显示为“MongoDB Driver”
在maven项目的pom.xml文件中添加依赖:
<!-- https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-sync -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>5.0.1</version>
</dependency>
点击右侧的Maven,展开Dependencies,可以看到新的一个mongodb的依赖包已经导入进来了:
与MongoDB建立连接(Java模式)
首先在项目中建立一个”mongodb”的包
编写一个类,测试一下MongoDB能否连通。
MongoClient mongoClient = new MongoClient("192.168.70.150", 27017); //这种方法已经淘汰
重写写一个类来完成Mongdb的连接测试。但是,MongoDB如果直接连由于安全问题会访问拒绝,我们需要在Ubuntu中配置关闭防火墙,同时还需要配置mongodb允许远程使用(默认为仅本地访问),才能从远程访问。
执行下列代码:
sudo vim /etc/mongod.conf
把bindIp修改为0.0.0.0,然后保存
在nosql这台虚拟机上执行下列代码来重启mongodb服务:
sudo service mongod restart
执行代码
package MongoDB;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
// import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
public class TestMongoDB {
public static void main(String[] args) {
String uri = "mongodb://192.168.179.143:27017"; // 数据库连接uri
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("school1"); // 创建数据库school1
database.createCollection("teacher"); // 创建集合teacher
System.out.println("集合创建成功!");
}
}
}
显示集合创建成功!
在nosql这台虚拟机的shell模式下查看,发现school1数据库和集合teacher都已经创建成功
说明:
(1)在Java 源代码中,Java tryO0用法中,括号(的作用属于Java7的新特性。
经常会用try-catch来捕获有可能抛出异常的代码。如果其中还涉及到资源的使用的话,最后在finally块中显示的释放掉有可能被占用的资源。
但是如果资源类已经实现了AutoCloseable这个接口的话,可以在 tryO括号中可以写操作资源的语句(IO操作),会在程序块结束时自动释放掉占用的资源,不用再在finally块中手动释放了。
原文链接:https://blog.csdn.net/qq_25112523/article/details/124746116
在MongoDB中新增数据
在MongoDB中新增数据有两种方法,第一种是增加一条数据(文档),第二种是增加多条数据(文档)。
方法一:增加一条数据(文档)
package MongoDB;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.result.InsertOneResult;
import com.mongodb.MongoException;
import org.bson.Document;
import org.bson.types.ObjectId;
import java.util.Arrays;
public class InsertOne {
public static void main(String[] args) {
String uri = "mongodb://192.168.179.143:27017"; // 数据库连接uri
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("school1");
MongoCollection<Document> collection = database.getCollection("teacher");
try {
// 在集合teacher中增加一条数据
InsertOneResult result = collection.insertOne(new Document()
.append("_id", new ObjectId())
.append("name", "zhangsan")
.append("course", Arrays.asList("Big Data Technology", "Web Front-end Programming")));
// 输出新增的文档内容
System.out.println("成功! 新增文档的id: " + result.getInsertedId());
// 如果出现异常,则打印该异常
} catch (MongoException me) {
System.err.println("Unable to insert due to an error: " + me);
}
}
}
}
在Shell中查询
方法二:增加多条数据(文档)
package MongoDB;
import java.util.Arrays;
import java.util.List;
import org.bson.Document;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.InsertManyResult;
public class InsertMany {
public static void main(String[] args) {
String uri = "mongodb://192.168.179.143:27017"; // 数据库连接uri
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("school1");
MongoCollection<Document> collection = database.getCollection("teacher");
// 创建两个包含name和age属性的文档,注意这里和InsertOne的格式不同,这并没有什么关系
List<Document> teacherList = Arrays.asList(
new Document().append("name", "Alice").append("age", 30),
new Document().append("name", "Bob").append("age", 40));
try {
// 把文档增加到teacher集合中
InsertManyResult result = collection.insertMany(teacherList);
// 打印返回的id值
System.out.println("新增文档的id值: " + result.getInsertedIds());
// 如果出现异常,则打印该异常
} catch (MongoException me) {
System.err.println("Unable to insert due to an error: " + me);
}
}
}
}
在Shell中查询:
在MongoDB中查询数据
在MongoDB中查询数据有两种方法,第一种是查询一条数据(文档),第二种是查询多条数据(文档)。
方法一:查询一条数据(文档)
package MongoDB;
import static com.mongodb.client.model.Filters.eq;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Projections;
import com.mongodb.client.model.Sorts;
public class FindOne {
public static void main(String[] args) {
String uri = "mongodb://192.168.179.143:27017"; // 数据库连接uri
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("school1");
MongoCollection<Document> collection = database.getCollection("teacher");
// 先把有name属性的文档过滤出来
Bson projectionFields = Projections.fields(
Projections.include("name"),
Projections.excludeId());
// 返回满足条件的第一个文档
Document doc = collection.find(eq("name", "zhangsan"))
.projection(projectionFields)
.sort(Sorts.descending("name"))
.first();
// 没有找到则告之未找到,否则把该文档用JSON格式输出
if (doc == null) {
System.out.println("没有找到文档");
} else {
System.out.println(doc.toJson());
}
}
}
}
方法二:查询多条数据(文档)
package MongoDB;
import static com.mongodb.client.model.Filters.lt;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Projections;
import com.mongodb.client.model.Sorts;
public class Find {
public static void main(String[] args) {
String uri = "mongodb://192.168.179.143:27017"; // 数据库连接uri
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("school1");
MongoCollection<Document> collection = database.getCollection("teacher");
// 先把有name和age属性的文档过滤出来
Bson projectionFields = Projections.fields(
Projections.include("name", "age"),
Projections.excludeId());
// 找到符合条件的文档,这里查询条件为年龄小于50岁,并用name逆序排列
// 把查询结果用JSON格式打印出来
try (MongoCursor<Document> cursor = collection.find(lt("age", 50))
.projection(projectionFields)
.sort(Sorts.descending("name")).iterator()) {
while (cursor.hasNext()) {
System.out.println(cursor.next().toJson());
}
}
}
}
}
在MongoDB中更新数据
在MongoDB中更新数据有两种方法,第一种是更新一条数据(文档),第二种是更新多条数据(文档)。
方法一:更新一条数据(文档)
package MongoDB;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.UpdateOptions;
import com.mongodb.client.model.Updates;
import com.mongodb.client.result.UpdateResult;
public class UpdateOne {
public static void main(String[] args) {
String uri = "mongodb://192.168.179.143:27017"; // 数据库连接uri
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("school1");
MongoCollection<Document> collection = database.getCollection("teacher");
Document query = new Document().append("name", "Alice");
// 更新文档的三个值,age是已经存在的属性,gender是新增的属性,currentTimestamp是新增的更新时间属性
Bson updates = Updates.combine(
Updates.set("age", 31),
Updates.addToSet("gender", "Male"),
Updates.currentTimestamp("lastUpdated"));
// 如何没有找到符合查询条件的记录,则新增该记录
UpdateOptions options = new UpdateOptions().upsert(true);
try {
// 更新符合条件的第一个文档
UpdateResult result = collection.updateOne(query, updates, options);
// 打印文档的属性
System.out.println("修改文档的数据是: " + result.getModifiedCount());
System.out.println("被修改的文档ID是: " + result.getUpsertedId());
// 如果出现异常,则打印该异常
} catch (MongoException me) {
System.err.println("无法更新,异常是: " + me);
}
}
}
}
程序这边有一定问题
在Shell中查询无问题
发现Alice这条数据已经被更新了。
方法二:更新多条数(文档)
package MongoDB;
import static com.mongodb.client.model.Filters.gt;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Updates;
import com.mongodb.client.result.UpdateResult;
public class UpdateMany {
public static void main(String[] args) {
String uri = "mongodb://192.168.179.143:27017"; // 数据库连接uri
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("school1");
MongoCollection<Document> collection = database.getCollection("teacher");
// 查询条件是年龄大于30
Bson query = gt("age", 30);
// 更新文档的属性
Bson updates = Updates.combine(
Updates.addToSet("interests", "programming"),
Updates.currentTimestamp("lastUpdated"));
try {
// 更新文档数据
UpdateResult result = collection.updateMany(query, updates);
// 答应更新结果
System.out.println("更新文档的个数: " + result.getModifiedCount());
// 如果出现异常,则打印该异常
} catch (MongoException me) {
System.err.println("Unable to update due to an error: " + me);
}
}
}
}
在Shell中查询
发现Alice和Bob这两条数据已经被更新了。
在更新操作中,还有一类程序时把一个文档全部替换掉,你可以参考一下官方文档:
https://www.mongodb.com/docs/drivers/java/sync/current/usage-examples/replaceOne/
在MongoDB中删除数据(Java模式)
在MongoDB中删除数据有两种方法,第一种是删除一条数据(文档),第二种是删除多条数据(文档)。
方法一:删除一条数据(文档)
package MongoDB;
import static com.mongodb.client.model.Filters.eq;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.DeleteResult;
public class DeleteOne {
public static void main(String[] args) {
String uri = "mongodb://192.168.179.143:27017"; // 数据库连接uri
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("school1");
MongoCollection<Document> collection = database.getCollection("teacher");
Bson query = eq("name", "zhangsan");
try {
// 删除满足条件的第一个文档
DeleteResult result = collection.deleteOne(query);
System.out.println("删除文档个数: " + result.getDeletedCount());
// 如果出现异常,则打印该异常
} catch (MongoException me) {
System.err.println("Unable to delete due to an error: " + me);
}
}
}
}
在Shell中查询
方法二:删除多条数据(文档)
package MongoDB;
import static com.mongodb.client.model.Filters.lt;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.DeleteResult;
public class DeleteMany {
public static void main(String[] args) {
String uri = "mongodb://192.168.179.143:27017"; // 数据库连接uri
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("school1");
MongoCollection<Document> collection = database.getCollection("teacher");
Bson query = lt("age", 50);
try {
// 删除所有年龄小于50的问句
DeleteResult result = collection.deleteMany(query);
// 打印删除文档的数量
System.out.println("Deleted document count: " + result.getDeletedCount());
// 如果出现异常,则打印该异常
} catch (MongoException me) {
System.err.println("Unable to delete due to an error: " + me);
}
}
}
}
在Shell中查询
teacher集合中已经没有数据了,因为一个三条数据,第一次(删除一条数据(文档)的那个程序)删了1条,第二次删了2条(删除多条数据(文档)的那个程序),所以就全部删光了