Introduksjon til Spring Data MongoDB
1. Oversikt
Denne artikkelen vil være en rask og praktisk introduksjon til Spring Data MongoDB.
Vi vil gå gjennom det grunnleggende ved å bruke begge MongoTemplate i tillegg til MongoRepository ved hjelp av praktiske eksempler for å illustrere hver operasjon.
2. MongoTemplateog MongoRepository
De MongoTemplatefølger standardmalmønsteret om våren og gir en klar, grunnleggende API til den underliggende persistensmotoren.
Datalageret følger vårens datasentriske tilnærming og kommer med mer fleksible og komplekse API-operasjoner, basert på de kjente tilgangsmønstrene i alle Spring Data-prosjekter.
For begge deler må vi begynne med å definere avhengighet - for eksempel i pom.xml, med Maven:
org.springframework.data spring-data-mongodb 3.0.3.RELEASE
For å sjekke om noen ny versjon av biblioteket er utgitt - spor utgivelsene her.
3. Konfigurasjon for MongoTemplate
3.1. XML-konfigurasjon
La oss starte med den enkle XML-konfigurasjonen for Mongo-malen:
Først må vi definere fabrikkbønnen som er ansvarlig for å lage Mongo-forekomster.
Neste - vi må faktisk definere (og konfigurere) malbønnen:
Og til slutt må vi definere en etterbehandler for å oversette hvilken som helst MongoExceptions kastet inn @Oppbevaringssted merkede klasser:
3.2. Java-konfigurasjon
La oss nå opprette en lignende konfigurasjon ved hjelp av Java config ved å utvide basisklassen for MongoDB-konfigurasjon AbstractMongoConfiguration:
@Configuration offentlig klasse MongoConfig utvider AbstractMongoClientConfiguration {@ Override-beskyttet streng getDatabaseName () {return "test"; } @ Override public MongoClient mongoClient () {ConnectionString connectionString = new ConnectionString ("mongodb: // localhost: 27017 / test"); MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); returner MongoClients.create (mongoClientSettings); } @Override offentlig samling getMappingBasePackages () {return Collections.singleton ("com.baeldung"); }}
Merk: Vi trengte ikke definere MongoTemplate bønne i forrige konfigurasjon slik den allerede er definert i AbstractMongoClientConfiguration.
Vi kan også bruke konfigurasjonen vår fra bunnen av uten å utvide den AbstractMongoClientConfiguration - som følger:
@Configuration public class SimpleMongoConfig {@Bean public MongoClient mongo () {ConnectionString connectionString = new ConnectionString ("mongodb: // localhost: 27017 / test"); MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); returner MongoClients.create (mongoClientSettings); } @Bean offentlig MongoTemplate mongoTemplate () kaster Unntak {returner nytt MongoTemplate (mongo (), "test"); }}
4. Konfigurasjon for MongoRepository
4.1. XML-konfigurasjon
For å gjøre bruk av egendefinerte depoter (utvide MongoRepository) - vi må fortsette konfigurasjonen fra avsnitt 3.1 og sette opp repositoriene:
4.2. Java-konfigurasjon
På samme måte vil vi bygge videre på konfigurasjonen vi allerede opprettet i avsnitt 3.2 og legge til en ny kommentar i blandingen:
@EnableMongoRepositories (basePackages = "com.baeldung.repository")
4.3. Opprett depotet
Nå, etter konfigurasjonen, må vi opprette et lager - utvide det eksisterende MongoRepository grensesnitt:
offentlig grensesnitt UserRepository utvider MongoRepository {//}
Nå kan vi koble dette automatisk UserRepository og bruke operasjoner fra MongoRepository eller legg til tilpassede operasjoner.
5. Bruke MongoTemplate
5.1. Sett inn
La oss starte med innsatsoperasjonen; la oss også starte med en tom database:
{ }
Nå hvis vi setter inn en ny bruker:
Brukerbruker = ny bruker (); user.setName ("Jon"); mongoTemplate.insert (bruker, "bruker");
Databasen vil se slik ut:
{"_id": ObjectId ("55b4fda5830b550a8c2ca25a"), "_class": "com.baeldung.model.User", "name": "Jon"}
5.2. Lagre - Sett inn
De lagre operasjonen har lagre eller oppdater semantikk: hvis en id er tilstede, utfører den en oppdatering, hvis ikke - den gjør et innlegg.
La oss se på den første semantikken - innsatsen; her er den opprinnelige tilstanden til databasen:
{ }
Når vi nå lagre en ny bruker:
Brukerbruker = ny bruker (); user.setName ("Albert"); mongoTemplate.save (bruker, "bruker");
Enheten vil bli satt inn i databasen:
{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Albert"}
Deretter ser vi på den samme operasjonen - lagre - med oppdateringssemantikk.
5.3. Lagre - Oppdater
La oss nå se på lagre med oppdateringssemantikk, som opererer på en eksisterende enhet:
{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jack"}
Nå når vi lagre den eksisterende brukeren - vi vil oppdatere den:
bruker = mongoTemplate.findOne (Query.query (Criteria.where ("name"). is ("Jack")), User.class); user.setName ("Jim"); mongoTemplate.save (bruker, "bruker");
Databasen vil se slik ut:
{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jim"}
Som du kan se, i dette spesifikke eksemplet, lagre bruker semantikken til Oppdater, fordi vi bruker et objekt med gitt _id.
5.4. UpdateFirst
updateFirst oppdaterer det aller første dokumentet som samsvarer med spørringen.
La oss starte med den opprinnelige tilstanden til databasen:
[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Alex"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Alex "}]
Når vi nå kjører updateFirst:
Query query = new Query (); query.addCriteria (Criteria.where ("navn"). er ("Alex")); Oppdater oppdatering = ny oppdatering (); update.set ("navn", "James"); mongoTemplate.updateFirst (spørring, oppdatering, User.class);
Bare den første oppføringen blir oppdatert:
[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "James"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Alex "}]
5.5. UpdateMulti
UpdateMultioppdaterer alt dokument som samsvarer med den gitte spørringen.
Først - her er tilstanden til databasen før du gjør updateMulti:
[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Eugen"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Eugen "}]
La oss nå kjøre updateMulti operasjon:
Query query = new Query (); query.addCriteria (Criteria.where ("navn"). er ("Eugen")); Oppdater oppdatering = ny oppdatering (); update.set ("navn", "Victor"); mongoTemplate.updateMulti (spørring, oppdatering, User.class);
Begge eksisterende objektene vil bli oppdatert i databasen:
[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Victor"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Victor "}]
5.6. FindAndModify
Denne operasjonen fungerer som updateMulti, men det returnerer objektet før det ble endret.
Først - tilstanden til databasen før du ringer findAndModify:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Markus"}
La oss se på den faktiske operasjonskoden:
Query query = new Query (); query.addCriteria (Criteria.where ("navn"). er ("Markus")); Oppdater oppdatering = ny oppdatering (); update.set ("navn", "Nick"); Brukerbruker = mongoTemplate.findAndModify (spørring, oppdatering, User.class);
De returnerte brukerobjekt har de samme verdiene som den opprinnelige tilstanden i databasen.
Imidlertid er den nye tilstanden i databasen:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Nick"}
5.7. Oppover
De oppover arbeider på finne og endre annet lage semantikk: Hvis dokumentet samsvarer, oppdater det, ellers oppretter du et nytt dokument ved å kombinere spørringen og oppdateringsobjektet.
La oss starte med den opprinnelige tilstanden til databasen:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Markus"}
Nå - la oss kjøre oppover:
Query query = new Query (); query.addCriteria (Criteria.where ("navn"). er ("Markus")); Oppdater oppdatering = ny oppdatering (); update.set ("navn", "Nick"); mongoTemplate.upsert (spørring, oppdatering, User.class);
Her er tilstanden til databasen etter operasjonen:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Nick"}
5.8. Fjerne
Tilstanden til databasen før du ringer fjerne:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Benn"}
La oss nå løpe fjerne:
mongoTemplate.remove (bruker, "bruker");
Resultatet blir som forventet:
{ }
6. Bruke MongoRepository
6.1. Sett inn
Først - tilstanden til databasen før du kjører sett inn:
{ }
Nå, når vi setter inn en ny bruker:
Brukerbruker = ny bruker (); user.setName ("Jon"); userRepository.insert (bruker);
Her er slutttilstanden til databasen:
{"_id": ObjectId ("55b4fda5830b550a8c2ca25a"), "_class": "com.baeldung.model.User", "name": "Jon"}
Legg merke til hvordan operasjonen fungerer på samme måte som sett inn i MongoTemplate API.
6.2. Lagre – Sett inn
På samme måte - lagre fungerer det samme som lagre drift i MongoTemplate API.
La oss starte med å se på sett inn semantikk av operasjonen; her er den opprinnelige tilstanden til databasen:
{ }
Nå - vi utfører lagre operasjon:
Brukerbruker = ny bruker (); user.setName ("Aaron"); userRepository.save (bruker);
Dette resulterer i at brukeren blir lagt til i databasen:
{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Aaron"}
Legg igjen merke til hvordan, i dette eksemplet, lagre fungerer med sett inn semantikk, fordi vi setter inn et nytt objekt.
6.3. Lagre – Oppdater
La oss nå se på den samme operasjonen, men med oppdater semantikk.
Først - her er databasens tilstand før du kjører den nye lagre:
{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jack" 81 * 6}
Nå - vi utfører operasjonen:
bruker = mongoTemplate.findOne (Query.query (Criteria.where ("name"). is ("Jack")), User.class); user.setName ("Jim"); userRepository.save (bruker);
Til slutt, her er tilstanden til databasen:
{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jim"}
Legg igjen merke til hvordan, i dette eksemplet, lagre fungerer med Oppdater semantikk, fordi vi bruker et eksisterende objekt.
6.4. Slett
Tilstanden til databasen før du ringer slett:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Benn"}
La oss løpe slett:
userRepository.delete (bruker);
Resultatet blir ganske enkelt:
{ }
6.5. Finn én
Tilstanden til databasen når Finn én er kalt:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Chris"}
La oss nå utføre Finn én:
userRepository.findOne (user.getId ())
Resultatet som vil returnere eksisterende data:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Chris"}
6.6. Eksisterer
Tilstanden til databasen før du ringer eksisterer:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Harris"}
La oss løpe eksisterer:
boolsk isExists = userRepository.exists (user.getId ());
Som selvfølgelig vil komme tilbake ekte.
6.7. Finn alle W. ith Sortere
Tilstanden til databasen før du ringer finn alle:
[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Brendan"}, {"_id": ObjectId ("67b5ffa5511fee0e45ed614b"), "_class ":" com.baeldung.model.User "," name ":" Adam "}]
La oss nå løpe finn alle med Sortere:
Liste brukere = userRepository.findAll (Sort.by (Sort.Direction.ASC, "navn"));
Resultatet blir sortert etter navn i stigende rekkefølge:
[{"_id": ObjectId ("67b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Adam"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class ":" com.baeldung.model.User "," name ":" Brendan "}]
6.8. Finn alle W. ith Sidelig
Tilstanden til databasen før du ringer finn alle:
[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Brendan"}, {"_id": ObjectId ("67b5ffa5511fee0e45ed614b"), "_class ":" com.baeldung.model.User "," name ":" Adam "}]
La oss nå utføre finn alle med en paginasjonsforespørsel:
Pageable pageableRequest = PageRequest.of (0, 1); Sideside = userRepository.findAll (pageableRequest); Liste brukere = pages.getContent ();
Resultatet brukere listen vil bare være en bruker: Til slutt, la oss også gå gjennom de enkle merknadene som Spring Data bruker for å drive disse API-operasjonene. Feltnivået @Id merknader kan dekorere alle typer, inkludert lang og streng. Hvis verdien av @Id feltet ikke er null, det er lagret i databasen som det er; Ellers antar omformeren at du vil lagre en ObjectId i databasen (enten ObjectId, streng eller BigInteger arbeid). Neste - @Dokument: Denne kommentaren rett og slett markerer en klasse som et domeneobjekt som må vedvares i databasen, sammen med at vi kan velge navnet på samlingen som skal brukes. Denne artikkelen var en rask, men omfattende introduksjon til bruk av MongoDB med Spring Data, både via MongoTemplate API samt å bruke MongoRepository. Implementeringen av alle disse eksemplene og kodebiter kan bli funnet over på Github.{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Brendan"}
7. Kommentarer
@Id privat streng-id;
@Document Public Class User {//}
8. Konklusjon