Пример учебника по CRUD в MongoDB на Java

Добро пожаловать в учебник по примерам использования MongoDB Java. Ранее мы узнали, как установить MongoDB на Unix-машинах и выполнили некоторые команды из терминала. Сегодня мы рассмотрим особенности драйвера MongoDB для Java и как выполнять общие операции CRUD (Create, Read, Update, Delete).

Драйвер 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, а затем мы рассмотрим программу Пример Java для MongoDB для операций CRUD.

  7. Создание подключения MongoDB Java

    MongoClient – это интерфейс между нашей программой на Java и сервером MongoDB. MongoClient используется для создания подключения, подключения к базе данных, извлечения имен коллекций и создания/чтения/обновления/удаления базы данных, коллекций, документов и т. д. Одна из особенностей драйвера MongoDB для Java, которая мне нравится больше всего, заключается в том, что он потокобезопасен, поэтому мы можем создать экземпляр MongoClient один раз и повторно использовать его. Даже если несколько потоков обращаются к нему одновременно, соединение возвращается из внутреннего пула подключений, поддерживаемого им. Для каждого запроса к базе данных (поиск, вставка и т. д.) Java-поток получает соединение из пула, выполняет операцию и освобождает соединение. Это означает, что каждый раз может использоваться разное соединение (сокет). Ниже приведены некоторые общие методы подключения к серверу 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());
    

    Вы легко можете выявить недостатки в предыдущем подходе, аутентификация должна выполняться на раннем этапе, потому что мы не можем восстановиться от неё. Мы можем удалить базу данных либо с помощью метода dropDatabase(String db) класса MongoClient, либо с помощью метода dropDatabase() класса DB. Поскольку мы удаляем базу данных, я предпочитаю использовать метод MongoClient.

  9. MongoDB и Коллекции

    У каждой базы данных может быть ноль или несколько коллекций, они похожи на таблицы в серверах реляционных баз данных, за исключением того, что у вас нет конкретного формата данных. Подумайте об этом как о обычном списке против списка строк в терминах языка программирования 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 попадают в какую-то коллекцию, поэтому на этом этапе мы готовы выполнять операции вставки/обновления/удаления. Мы можем использовать метод drop() класса DBCollection для удаления коллекции из базы данных.

  10. Пример Java для MongoDB

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