Jeżeli od jakiegoś czasu zajmujesz się jakąkolwiek formą systemu zarządzania relacyjnymi bazami danych, prawdopodobnie spotkałeś się z nazwą MongoDB. Wprowadzony po raz pierwszy w 2009 roku, dziś mongoDb jest jednym z najpopularniejszych systemów zarządzania relacyjnymi bazami danych w branży. Głównym powodem jego szalonej popularności pomimo obecności na rynku starszych menedżerów oprogramowania relacyjnych baz danych, takich jak MySql, jest duża liczba i duża wszechstronność, jaką wnosi do tabeli. Wykorzystanie MongoDB eliminuje wiele potrzeb, jedną z nich jest konieczność tworzenia bazy danych i definiowania typu danych przy każdym uruchomieniu nowego projektu. Agenda artykułu klienta MongoDB:
- Wymagania wstępne dla klienta MongoDB
- Tworzenie projektu na Maven
- Dodanie swojej pierwszej usługi spoczynkowej JSON
- Konfigurowanie bazy danych MongoDB
- Uruchamianie skonfigurowanej bazy danych MongoDB
- Tworzenie frontonu
- Uproszczenie klienta MongoDB przy użyciu kodeka BSON
- Kod końcowy
Ale aby osiągnąć maksymalną funkcjonalność z MongoDB, trzeba znać klienta MongoDB i w tym artykule właśnie to omówimy.
Wymagania wstępne klienta MongoDB
Aby ten artykuł był pełny, musisz najpierw spełnić następujące wymagania wstępne.
Miej już IDE w swoim systemie.
Java Development Kit lub JDK w wersji 1.8 i nowsze zainstalowane z poprawnie skonfigurowanym JAVA_HOME.
Zainstalowany Docker lub MongoDB.
Apache Maven w wersji 3.5.3 i nowszych.
Architektura, którą stworzyliśmy i wykorzystaliśmy w tym przewodniku, jest jedną z najprostszych. Po uruchomieniu użytkownik może łatwo dodać dane i elementy do listy, po czym zostaną one automatycznie zaktualizowane w bazie danych.
Wraz z tym upewniliśmy się, że cała komunikacja między danymi a serwerem odbywa się w formacie JSON, a wszystkie dane są przechowywane w MongoDB.
Pierwsze kroki
Aby rozpocząć ten projekt, wykonaj czynności opisane poniżej.
Krok 1:tworzenie projektu w Maven
Pierwszym krokiem jest zawsze utworzenie nowego projektu i w tym celu skorzystaj z następującego kodu.
mvn io.quarkus:quarkus-maven-plugin:0.22.0:create -DprojectGroupId=org.acme -DprojectArtifactId=using-mongodb-client -DclassName="org.acme.rest.json.FruitResource" -Dpath="/fruits" -Dextensions="resteasy-jsonb,mongodb-client"
Po uruchomieniu powyższego polecenia IDE zaimportuje do systemu klientów JSON-B, MongoDb oraz RESTEasy/JAX-RS.
Kontynuuj krok 2.
Krok 2:Dodaj swoją pierwszą usługę spoczynkową JSON
In order to do this, use the code below. package org.acme.rest.json; import java.util.Objects; public class Fruit { private String name; private String description; public Fruit() { } public Fruit(String name, String description) { this.name = name; this.description = description; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public boolean equals(Object obj) { if (!(obj instanceof Fruit)) { return false; } Fruit other = (Fruit) obj; return Objects.equals(other.name, this.name); } @Override public int hashCode() { return Objects.hash(this.name); } }
W powyższym przykładzie najpierw stworzyliśmy owoc, który będzie później używany w programie.
Następnie musimy stworzyć plik org.acme.rest.json.FruitService, który będzie warstwą użytkownika naszej aplikacji. W tym celu użyj poniższego kodu.
package org.acme.rest.json; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import org.bson.Document; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; @ApplicationScoped public class FruitService { @Inject MongoClient mongoClient; public List list(){ List list = new ArrayList<>(); MongoCursor cursor = getCollection().find().iterator(); try { while (cursor.hasNext()) { Document document = cursor.next(); Fruit fruit = new Fruit(); fruit.setName(document.getString("name")); fruit.setDescription(document.getString("description")); list.add(fruit); } } finally { cursor.close(); } return list; } public void add(Fruit fruit){ Document document = new Document() .append("name", fruit.getName()) .append("description", fruit.getDescription()); getCollection().insertOne(document); } private MongoCollection getCollection(){ return mongoClient.getDatabase("fruit").getCollection("fruit"); } } Now we need to edit the org.acme.rest.json.FruitResource class to suit our needs. In order to do this, use the code below. @Path("/fruits") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public class FruitResource { @Inject FruitService fruitService; @GET public List list() { return fruitService.list(); } @POST public List add(Fruit fruit) { fruitService.add(fruit); return list(); } }
Kontynuuj krok 3.
Krok 3:Konfiguracja bazy danych mongoDb
Składnia oraz standardowy kod do konfiguracji bazy danych mongoDb są podane poniżej.
# configure the mongoDB client for a replica set of two nodes quarkus.mongodb.connection-string = mongodb://mongo1:27017,mongo2:27017
W naszym przypadku użyjemy następującego kodu do konfiguracji bazy danych.
# configure the mongoDB client for a replica set of two nodes quarkus.mongodb.connection-string = mongodb://localhost:27017
Kontynuuj krok 4.
Krok 4:Uruchamianie skonfigurowanej bazy danych MongoDB
Następnym krokiem jest uruchomienie właśnie utworzonej bazy danych MongoDB. Aby to zrobić, użyj poniższego kodu.
docker run -ti --rm -p 27017:27017 mongo:4.0
Kontynuuj krok 5.
Krok 5:Tworzenie frontendu
Teraz, gdy cała praca na zapleczu aplikacji została zakończona, przyjrzyjmy się kodowi używanemu do kodowania frontonu naszej aplikacji.
package org.acme.rest.json; import io.quarkus.mongodb.ReactiveMongoClient; import io.quarkus.mongodb.ReactiveMongoCollection; import org.bson.Document; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import java.util.List; import java.util.concurrent.CompletionStage; @ApplicationScoped public class ReactiveFruitService { @Inject ReactiveMongoClient mongoClient; public CompletionStage<List> list(){ return getCollection().find().map(doc -> { Fruit fruit = new Fruit(); fruit.setName(doc.getString("name")); fruit.setDescription(doc.getString("description")); return fruit; }).toList().run(); } public CompletionStage add(Fruit fruit){ Document document = new Document() .append("name", fruit.getName()) .append("description", fruit.getDescription()); return getCollection().insertOne(document); } private ReactiveMongoCollection getCollection(){ return mongoClient.getDatabase("fruit").getCollection("fruit"); } } package org.acme.rest.json; import javax.inject.Inject; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import java.util.List; import java.util.concurrent.CompletionStage; @Path("/reactive_fruits") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public class ReactiveFruitResource { @Inject ReactiveFruitService fruitService; @GET public CompletionStage<List> list() { return fruitService.list(); } @POST public CompletionStage<List> add(Fruit fruit) { fruitService.add(fruit); return list(); } }
W powyższym przykładzie korzystamy z reaktywnego klienta mongoDb, aby ułatwić tworzenie interfejsu.
Przejdź do kroku 6.
Krok 6:Uproszczenie klienta mongoDb przy użyciu kodeka BSON
Aby to zrobić, użyj poniższego kodu.
package org.acme.rest.json.codec; import com.mongodb.MongoClient; import org.acme.rest.json.Fruit; import org.bson.*; import org.bson.codecs.Codec; import org.bson.codecs.CollectibleCodec; import org.bson.codecs.DecoderContext; import org.bson.codecs.EncoderContext; import java.util.UUID; public class FruitCodec implements CollectibleCodec { private final Codec documentCodec; public FruitCodec() { this.documentCodec = MongoClient.getDefaultCodecRegistry().get(Document.class); } @Override public void encode(BsonWriter writer, Fruit fruit, EncoderContext encoderContext) { Document doc = new Document(); doc.put("name", fruit.getName()); doc.put("description", fruit.getDescription()); documentCodec.encode(writer, doc, encoderContext); } @Override public Class getEncoderClass() { return Fruit.class; } @Override public Fruit generateIdIfAbsentFromDocument(Fruit document) { if (!documentHasId(document)) { document.setId(UUID.randomUUID().toString()); } return document; } @Override public boolean documentHasId(Fruit document) { return document.getId() != null; } @Override public BsonValue getDocumentId(Fruit document) { return new BsonString(document.getId()); } @Override public Fruit decode(BsonReader reader, DecoderContext decoderContext) { Document document = documentCodec.decode(reader, decoderContext); Fruit fruit = new Fruit(); if (document.getString("id") != null) { fruit.setId(document.getString("id")); } fruit.setName(document.getString("name")); fruit.setDescription(document.getString("description")); return fruit; } }
Teraz użyjemy CodecProvider, aby połączyć to z już obecną klasą Fruit.
package org.acme.rest.json.codec; import org.acme.rest.json.Fruit; import org.bson.codecs.Codec; import org.bson.codecs.configuration.CodecProvider; import org.bson.codecs.configuration.CodecRegistry; public class FruitCodecProvider implements CodecProvider { @Override public Codec get(Class clazz, CodecRegistry registry) { if (clazz == Fruit.class) { return (Codec) new FruitCodec(); } return null; } }
Przejdź do kroku 7.
Krok 7:Kod końcowy
Ostateczny kod tej aplikacji będzie wyglądał mniej więcej tak.
package org.acme.rest.json; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; @ApplicationScoped public class CodecFruitService { @Inject MongoClient mongoClient; public List list(){ List list = new ArrayList<>(); MongoCursor cursor = getCollection().find().iterator(); try { while (cursor.hasNext()) { list.add(cursor.next()); } } finally { cursor.close(); } return list; } public void add(Fruit fruit){ getCollection().insertOne(fruit); } private MongoCollection getCollection(){ return mongoClient.getDatabase("fruit").getCollection("fruit", Fruit.class); } }
Wniosek
Teraz wiesz, jak skonfigurować i używać klienta MongoDB w swoim systemie. Śmiało wypróbuj te kody w swoim systemie i daj nam znać o swoich doświadczeniach.
Podsumowanie artykułu
Dowiedz się wszystkiego o kliencie MongoDB i o tym, jak możesz go skonfigurować w swoim systemie do różnych zastosowań. Czytaj dalej, aby dowiedzieć się więcej.
W ten sposób dochodzimy do końca „ Klient MongoDB” artykuł.
Nadchodzące partie szkolenia certyfikacyjnego MongoDBNazwa kursu | Data | |
---|---|---|
Szkolenie certyfikacyjne MongoDB | Zajęcia zaczynają się 4 czerwca 2022 4 czerwca SAT&SUN (partia weekendowa) | Wyświetl szczegóły |
Szkolenie certyfikacyjne MongoDB | Zajęcia zaczynają się 6 sierpnia 2022 6 sierpnia SAT&SUN (partia weekendowa) | Wyświetl szczegóły |