MongoDB Java CRUD 範例教程

歡迎來到MongoDB Java示例教程。之前我們學習了如何在Unix系統中安裝MongoDB並從終端執行一些命令。今天我們將介紹MongoDB Java驅動程序的功能,以及如何執行常見的CRUD(創建、讀取、更新、刪除)操作。

MongoDB Java

  1. 下載MongoDB Java驅動程序

  2. 創建MongoDB Java連接

  3. 連接到MongoDB數據庫

  4. MongoDB和集合

  5. MongoDB Java示例

  6. 下載 MongoDB Java 驅動程式

    如果您有 Maven 專案,只需將以下依賴加入以將 MongoDB Java 驅動程式包含到您的應用程序中。

    <dependency>
    	<groupId>org.mongodb</groupId>
    	<artifactId>mongo-java-driver</artifactId>
    	<version>2.12.3</version>
    </dependency>
    

    如果您有獨立項目,您可以從此 連結 下載 MongoDB Java 驅動程式並將其包含在您的項目構建路徑中。現在讓我們瀏覽一些 MongoDB Java 驅動程式的基本用法,然後我們將看看 MongoDB Java 範例 程式進行 CRUD 操作。

  7. 建立 MongoDB Java 連線

    MongoClient是我們的 Java 程式與 MongoDB 伺服器之間的介面。 MongoClient 用於建立連線、連接資料庫、檢索集合名稱以及建立/讀取/更新/刪除資料庫、集合、文件等。我最喜歡的 MongoDB Java 驅動程式功能之一是它是線程安全的,因此我們可以創建一個 MongoClient 實例並重複使用它。即使多個線程同時訪問它,它也會從內部連接池中返回連接。對於對資料庫的每個請求(查找、插入等),Java 線程將從池中獲取連接,執行操作,然後釋放連接。這意味著每次使用的連接(socket)可能都不同。以下是連接到 MongoDB 伺服器的一些常見方法。

    MongoClient mongoClient = new MongoClient(); //連接到默認主機和端口,即 127.0.0.1:27017
    // 或
    MongoClient mongoClient = new MongoClient("localhost"); //連接到默認端口,即 27017
    // 或
    MongoClient mongoClient = new MongoClient("localhost", 27017); //應始終使用此
    
    // 或,連接到一個副本集,自動發現主節點
    MongoClient mongoClient = new MongoClient(Arrays.asList(new ServerAddress("localhost", 27017),
                                          new ServerAddress("localhost", 27018),
                                          new ServerAddress("localhost", 27019)));
    
  8. 連接到 MongoDB 數據庫

    一旦我們連接到 MongoDB 伺服器,下一步是建立與數據庫的連接,如下所示。請注意,如果數據庫不存在,MongoDB 將為您創建它。

    MongoClient mongo = new MongoClient("localhost", 27017);
    DB db = mongo.getDB("journaldev");
    

    MongoClient 提供一個有用的方法來獲取所有數據庫名稱,如下所示。

    MongoClient mongo = new MongoClient("localhost", 27017);
    List<String> dbs = mongo.getDatabaseNames();
    System.out.println(dbs); // [journaldev, local, admin]
    

    對於數據庫,我們可以使用基於用戶名和密碼的身份驗證,此時我們需要提供授權憑據,如下所示。

    MongoCredential journaldevAuth = MongoCredential.createPlainCredential("pankaj", "journaldev", "pankaj123".toCharArray());
    MongoCredential testAuth = MongoCredential.createPlainCredential("pankaj", "test", "pankaj123".toCharArray());
    List<MongoCredential> auths = new ArrayList<MongoCredential>();
    auths.add(journaldevAuth);
    auths.add(testAuth);
    
    ServerAddress serverAddress = new ServerAddress("localhost", 27017);
    MongoClient mongo = new MongoClient(serverAddress, auths);
    

    如果您使用舊版本,您需要在獲取數據庫對象後提供身份驗證詳細信息,如下所示。

    MongoClient mongo = new MongoClient("localhost", 27017);
    DB db = mongo.getDB("journaldev");
    boolean auth = db.authenticate("pankaj", "pankaj123".toCharArray());
    

    您可以輕鬆找出先前方法的缺陷,身份驗證應該在早期階段完成,因為我們無法從中恢復。我們可以通過使用 MongoClientdropDatabase(String db) 方法或 DBdropDatabase() 方法刪除數據庫。由於我們正在刪除數據庫,我更喜歡使用 MongoClient 方法。

  9. MongoDB 和 Collections

    每個數據庫都可以擁有零個或多個集合,它們類似於關聯數據庫服務器中的表,只是您沒有特定的數據格式。可以把它想像成 Java 編程語言中通用列表與字符串列表的區別。我們可以使用以下代碼獲取所有集合的名稱。

    MongoClient mongo = new MongoClient("localhost", 27017);
    DB db = mongo.getDB("journaldev");
    		
    Set<String> collections = db.getCollectionNames();
    System.out.println(collections); // [datas, names, system.indexes, users]
    

    我們可以通過提供集合的名稱來獲取特定集合,如下所示。

    DB db = mongo.getDB("journaldev");	
    DBCollection col = db.getCollection("users");
    

    同樣,如果集合不存在,MongoDB 將為您創建它。MongoDB 中的所有數據都存儲在某個集合中,因此我們現在可以進行插入/更新/刪除操作。我們可以使用 DBCollectiondrop() 方法從數據庫中刪除一個集合。

  10. MongoDB Java示例

Even though we can work on any valid JSON document in MongoDB collection, in real life we have POJO classes that are mapped with these data. So I will create a java bean and use it for my examples. `User.java`

```
package com.journaldev.mongodb.model;

public class User {

	private int id;
	private String name;
	private String role;
	private boolean isEmployee;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	public boolean isEmployee() {
		return isEmployee;
	}
	public void setEmployee(boolean isEmployee) {
		this.isEmployee = isEmployee;
	}
}
```

Here is the complete MongoDB java example program showing all the CRUD operations one by one. `MongoDBExample.java`

```
package com.journaldev.mongodb.main;

import java.net.UnknownHostException;

import com.journaldev.mongodb.model.User;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.WriteResult;

public class MongoDBExample {

	public static void main(String[] args) throws UnknownHostException {
	
		User user = createUser();
		DBObject doc = createDBObject(user);
		
		MongoClient mongo = new MongoClient("localhost", 27017);
		DB db = mongo.getDB("journaldev");
		
		DBCollection col = db.getCollection("users");
		
		//創建用戶
		WriteResult result = col.insert(doc);
		System.out.println(result.getUpsertedId());
		System.out.println(result.getN());
		System.out.println(result.isUpdateOfExisting());
		System.out.println(result.getLastConcern());
		
		//讀取示例
		DBObject query = BasicDBObjectBuilder.start().add("_id", user.getId()).get();
		DBCursor cursor = col.find(query);
		while(cursor.hasNext()){
			System.out.println(cursor.next());
		}
		
		//更新示例
		user.setName("Pankaj Kumar");
		doc = createDBObject(user);
		result = col.update(query, doc);
		System.out.println(result.getUpsertedId());
		System.out.println(result.getN());
		System.out.println(result.isUpdateOfExisting());
		System.out.println(result.getLastConcern());
		
		//刪除示例
		result = col.remove(query);
		System.out.println(result.getUpsertedId());
		System.out.println(result.getN());
		System.out.println(result.isUpdateOfExisting());
		System.out.println(result.getLastConcern());
		
		//關閉資源
		mongo.close();
	}

	private static DBObject createDBObject(User user) {
		BasicDBObjectBuilder docBuilder = BasicDBObjectBuilder.start();
								
		docBuilder.append("_id", user.getId());
		docBuilder.append("name", user.getName());
		docBuilder.append("role", user.getRole());
		docBuilder.append("isEmployee", user.isEmployee());
		return docBuilder.get();
	}

	private static User createUser() {
		User u = new User();
		u.setId(2);
		u.setName("Pankaj");
		u.setEmployee(true);
		u.setRole("CEO");
		return u;
	}
	
	

}
```

A sample execution results in following output.

```
null
0
false
WriteConcern { "getlasterror" : 1} / (Continue on error? false)
{ "_id" : 2 , "name" : "Pankaj" , "role" : "CEO" , "isEmployee" : true}
null
1
true
WriteConcern { "getlasterror" : 1} / (Continue on error? false)
null
1
false
WriteConcern { "getlasterror" : 1} / (Continue on error? false)
```

Notice that I am saving User id with **\_id** name, this is a reserved key for the primary key of any record in the collection. If we don't provide one, MongoDB will create one for us. It's like sequencer or auto increment column in relational database tables. Since I am deleting the created record, further execution won't cause any issues. But if there are duplicate record, then we will get below errors.

```
Exception in thread "main" com.mongodb.MongoException$DuplicateKey: { "serverUsed" : "localhost:27017" , "ok" : 1 , "n" : 0 ,
 "err" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: journaldev.users.$_id_  dup key: { : 1 }" , 
"code" : 11000}
	at com.mongodb.CommandResult.getWriteException(CommandResult.java:88)
	at com.mongodb.CommandResult.getException(CommandResult.java:79)
	at com.mongodb.DBCollectionImpl.translateBulkWriteException(DBCollectionImpl.java:314)
	at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:189)
	at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:165)
	at com.mongodb.DBCollection.insert(DBCollection.java:93)
	at com.mongodb.DBCollection.insert(DBCollection.java:78)
	at com.mongodb.DBCollection.insert(DBCollection.java:120)
	at com.journaldev.mongodb.main.MongoDBExample.main(MongoDBExample.java:27)
```

這就是有關使用MongoDB Java驅動程序的入門內容,我們將在下一篇文章中介紹更多功能。

Source:
https://www.digitalocean.com/community/tutorials/mongodb-java-crud-example-tutorial