Beispiel für MongoDB Java CRUD
Willkommen zum MongoDB Java Beispiel-Tutorial. Zuvor haben wir gelernt, wie man MongoDB auf Unix-Maschinen installiert und einige Befehle im Terminal ausgeführt. Heute werden wir uns die Funktionen des MongoDB Java-Treibers ansehen und wie man gängige CRUD (Create, Read, Update, Delete) Operationen durchführt.
1. MongoDB Java-Treiber Herunterladen
Wenn Sie ein Maven-Projekt haben, fügen Sie einfach die folgende Abhängigkeit hinzu, um den MongoDB Java-Treiber in Ihre Anwendung zu integrieren.
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.12.3</version>
</dependency>
Wenn Sie ein eigenständiges Projekt haben, können Sie den MongoDB Java-Treiber von diesem Link herunterladen und ihn in Ihren Projekt-Build-Pfad einbinden. Lassen Sie uns nun einige grundlegende Verwendungen des MongoDB Java-Treibers durchgehen und dann werden wir uns ein MongoDB Java-Beispielprogramm für CRUD-Operationen ansehen.
2. Eine MongoDB Java-Verbindung Erstellen
MongoClient ist die Schnittstelle zwischen unserem Java-Programm und dem MongoDB-Server. MongoClient wird verwendet, um eine Verbindung herzustellen, sich mit der Datenbank zu verbinden, Sammlungsnamen abzurufen und Datenbanken, Sammlungen, Dokumente usw. zu erstellen/lesen/aktualisieren/löschen. Eine Funktion des MongoDB Java-Treibers, die ich am meisten mag, ist, dass er thread-sicher ist, sodass wir eine Instanz von MongoClient einmal erstellen und wiederverwenden können. Selbst wenn mehrere Threads gleichzeitig darauf zugreifen, wird eine Verbindung aus dem internen Verbindungspool zurückgegeben, den er verwaltet. Bei jeder Anfrage an die Datenbank (find, insert usw.) erhält der Java-Thread eine Verbindung aus dem Pool, führt die Operation aus und gibt die Verbindung frei. Das bedeutet, dass die verwendete Verbindung (Socket) jedes Mal unterschiedlich sein kann. Unten sind einige der gängigen Methoden, um eine Verbindung zu einem MongoDB-Server herzustellen.
MongoClient mongoClient = new MongoClient(); //connects to default host and port i.e 127.0.0.1:27017
// or
MongoClient mongoClient = new MongoClient( "localhost" ); //connects to default port i.e 27017
// or
MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); // should use this always
// or, to connect to a replica set, with auto-discovery of the primary
MongoClient mongoClient = new MongoClient(Arrays.asList(new ServerAddress("localhost", 27017),
new ServerAddress("localhost", 27018),
new ServerAddress("localhost", 27019)));
3. Verbindung zur MongoDB-Datenbank
Sobald wir die Verbindung zum MongoDB-Server hergestellt haben, ist der nächste Schritt, die Verbindung zur Datenbank herzustellen, wie unten gezeigt. Beachten Sie, dass MongoDB diese für Sie erstellt, wenn die Datenbank nicht vorhanden ist.
MongoClient mongo = new MongoClient("localhost", 27017);
DB db = mongo.getDB("journaldev");
MongoClient bietet eine nützliche Methode, um alle Datenbanknamen abzurufen, wie unten gezeigt.
MongoClient mongo = new MongoClient("localhost", 27017);
List dbs = mongo.getDatabaseNames();
System.out.println(dbs); // [journaldev, local, admin]
Wir können eine Benutzer-Passwort-basierte Authentifizierung für Datenbanken haben, in diesem Fall müssen wir Autorisierungsdaten wie unten angegeben bereitstellen.
MongoCredential journaldevAuth = MongoCredential.createPlainCredential("pankaj", "journaldev", "pankaj123".toCharArray());
MongoCredential testAuth = MongoCredential.createPlainCredential("pankaj", "test", "pankaj123".toCharArray());
List auths = new ArrayList();
auths.add(journaldevAuth);
auths.add(testAuth);
ServerAddress serverAddress = new ServerAddress("localhost", 27017);
MongoClient mongo = new MongoClient(serverAddress, auths);
Wenn Sie ältere Versionen verwenden, müssen Sie die Authentifizierungsdetails nach dem Abrufen des Datenbankobjekts wie unten angeben.
MongoClient mongo = new MongoClient("localhost", 27017);
DB db = mongo.getDB("journaldev");
boolean auth = db.authenticate("pankaj", "pankaj123".toCharArray());
Man kann leicht Fehler im früheren Ansatz erkennen, die Authentifizierung sollte frühzeitig erfolgen, da wir uns davon nicht erholen können. Wir können eine Datenbank entweder mit der MongoClient-Methode dropDatabase(String db) oder mit der DB-Methode dropDatabase() löschen. Da wir die Datenbank löschen, bevorzuge ich die Verwendung der MongoClient-Methode.
4. MongoDB und Sammlungen
Jede Datenbank kann null oder mehrere Sammlungen haben, sie sind wie Tabellen in relationalen Datenbankservern, außer dass Sie kein spezifisches Datenformat haben. Denken Sie daran wie an eine generische Liste im Vergleich zu einer Liste von Strings in der Java-Programmiersprache. Wir können alle Sammlungsnamen mit dem unten stehenden Code abrufen.
MongoClient mongo = new MongoClient("localhost", 27017);
DB db = mongo.getDB("journaldev");
Set collections = db.getCollectionNames();
System.out.println(collections); // [datas, names, system.indexes, users]
Wir können eine spezifische Sammlung erhalten, indem wir ihren Namen angeben, wie unten gezeigt.
DB db = mongo.getDB("journaldev");
DBCollection col = db.getCollection("users");
Wenn die Sammlung nicht existiert, wird MongoDB sie für Sie erstellen. Alle Daten in MongoDB gehen in irgendeine Sammlung, also sind wir an diesem Punkt bereit, Insert/Update/Delete-Operationen durchzuführen. Wir können die Methode DBCollection drop() verwenden, um eine Sammlung aus der Datenbank zu löschen.
5. MongoDB Java-Beispiel
Auch wenn wir mit jedem gültigen JSON-Dokument in einer MongoDB-Sammlung arbeiten können, haben wir im wirklichen Leben POJO-Klassen, die mit diesen Daten verknüpft sind. Daher werde ich eine Java-Bean erstellen und sie für meine Beispiele verwenden.
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;
}
}
Hier ist das vollständige MongoDB Java-Beispielprogramm, das alle CRUD-Operationen nacheinander zeigt. `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");
//create user
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());
//read example
DBObject query = BasicDBObjectBuilder.start().add("_id", user.getId()).get();
DBCursor cursor = col.find(query);
while(cursor.hasNext()){
System.out.println(cursor.next());
}
//update example
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());
//delete example
result = col.remove(query);
System.out.println(result.getUpsertedId());
System.out.println(result.getN());
System.out.println(result.isUpdateOfExisting());
System.out.println(result.getLastConcern());
//close resources
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;
}
}
Ein Beispiel für die Ausführung ergibt folgendes Ergebnis.
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)
Beachten Sie, dass ich die Benutzer-ID mit dem Namen **\_id** speichere, dies ist ein reservierter Schlüssel für den Primärschlüssel eines jeden Datensatzes in der Sammlung. Wenn wir keinen angeben, wird MongoDB einen für uns erstellen. Es ist wie ein Sequenzer oder eine Autoinkrement-Spalte in relationalen Datenbanktabellen. Da ich den erstellten Datensatz lösche, wird eine weitere Ausführung keine Probleme verursachen. Aber wenn es doppelte Datensätze gibt, dann erhalten wir folgende Fehler.
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)
Das ist alles, um Sie mit dem MongoDB Java-Treiber zu starten, wir werden uns in den nächsten Beiträgen mehr Funktionen ansehen.