Uvod u Spring Data MongoDB
1. Pregled
Ovaj će članak biti brz i praktičan uvod u Spring Data MongoDB.
Ići ćemo preko osnova koristeći oba MongoTemplate kao i MongoRepository koristeći praktične primjere za ilustraciju svake operacije.
2. MongoTemplatei MongoRepository
The MongoTemplateslijedi standardni obrazac predloška u proljeće i pruža osnovni API za pokretanje osnovnog API-ja za upornost.
Spremište slijedi Spring Data-centric pristup i dolazi s fleksibilnijim i složenijim API operacijama, temeljenim na dobro poznatim obrascima pristupa u svim Spring Data projektima.
Za oboje moramo započeti definiranjem ovisnosti - na primjer, u pom.xml, s Mavenom:
org.springframework.data spring-data-mongodb 3.0.3.OBLAŽENJE
Da biste provjerili je li izdana neka nova verzija knjižnice, izdanja pratite ovdje.
3. Konfiguracija za MongoTemplate
3.1. XML konfiguracija
Počnimo s jednostavnom XML konfiguracijom za Mongo predložak:
Prvo, moramo definirati tvornički grah odgovoran za stvaranje instanci Mongo.
Dalje - trebamo zapravo definirati (i konfigurirati) zrno predloška:
I na kraju, moramo definirati postprocesor za prevođenje bilo kojeg MongoExceptions ubačen @ Repozitorij komentirani satovi:
3.2. Java konfiguracija
Stvorimo sada sličnu konfiguraciju pomoću Java konfiguracije proširujući osnovnu klasu za MongoDB konfiguraciju AbstractMongoConfiguration:
@Configuration javna klasa MongoConfig proširuje AbstractMongoClientConfiguration {@Override zaštićeni niz getDatabaseName () {return "test"; } @Override public MongoClient mongoClient () {ConnectionString connectionString = new ConnectionString ("mongodb: // localhost: 27017 / test"); MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); return MongoClients.create (mongoClientSettings); } @Override javna zbirka getMappingBasePackages () {return Collections.singleton ("com.baeldung"); }}
Napomena: Nismo trebali definirati MongoTemplate bean u prethodnoj konfiguraciji, kao što je već definirano u AbstractMongoClientConfiguration.
Također možemo koristiti svoju konfiguraciju ispočetka bez proširenja AbstractMongoClientConfiguration - kako slijedi:
@Configuration javna klasa SimpleMongoConfig {@Bean public MongoClient mongo () {ConnectionString connectionString = new ConnectionString ("mongodb: // localhost: 27017 / test"); MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); return MongoClients.create (mongoClientSettings); } @Bean public MongoTemplate mongoTemplate () baca iznimku {return new MongoTemplate (mongo (), "test"); }}
4. Konfiguracija za MongoRepository
4.1. XML konfiguracija
Da biste koristili prilagođena spremišta (proširujući MongoRepository) - moramo nastaviti konfiguraciju iz odjeljka 3.1 i postaviti spremišta:
4.2. Java konfiguracija
Slično tome, nadogradit ćemo se na konfiguraciju koju smo već stvorili u odjeljku 3.2 i dodati novu napomenu u mix:
@EnableMongoRepositories (basePackages = "com.baeldung.repository")
4.3. Stvorite Spremište
Sada, nakon konfiguracije, moramo stvoriti spremište - proširujući postojeće MongoRepository sučelje:
javno sučelje UserRepository proširuje MongoRepository {//}
Sada to možemo automatski povezati UserRepository i koristite operacije iz MongoRepository ili dodajte prilagođene operacije.
5. Korištenje MongoTemplate
5.1. Umetnuti
Počnimo s operacijom umetanja; započnimo i s praznom bazom podataka:
{ }
Sad ako umetnemo novog korisnika:
Korisnik korisnik = novi korisnik (); user.setName ("Jon"); mongoTemplate.insert (korisnik, "korisnik");
Baza podataka izgledat će ovako:
{"_id": ObjectId ("55b4fda5830b550a8c2ca25a"), "_class": "com.baeldung.model.User", "name": "Jon"}
5.2. Spremi - Umetni
The uštedjeti operacija ima semantiku spremanja ili ažuriranja: ako je prisutan id, izvršava ažuriranje, ako ne - izvršava umetanje.
Pogledajmo prvu semantiku - umetak; evo početnog stanja baze podataka:
{ }
Kad smo sada uštedjeti novi korisnik:
Korisnik korisnik = novi korisnik (); user.setName ("Albert"); mongoTemplate.save (korisnik, "korisnik");
Entitet će biti umetnut u bazu podataka:
{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Albert"}
Dalje ćemo pogledati istu operaciju - uštedjeti - s ažuriranom semantikom.
5.3. Spremi - Ažuriraj
Pogledajmo sada uštedjeti s semantikom ažuriranja, koja radi na postojećem entitetu:
{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jack"}
Sad, kad mi uštedjeti postojeći korisnik - ažurirat ćemo ga:
user = mongoTemplate.findOne (Query.query (Criteria.where ("name"). je ("Jack")), User.class); user.setName ("Jim"); mongoTemplate.save (korisnik, "korisnik");
Baza podataka izgledat će ovako:
{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jim"}
Kao što vidite, u ovom konkretnom primjeru, uštedjeti koristi semantiku ažuriranje, jer koristimo objekt s danim _iskaznica.
5.4. UpdateFirst
updateFirst ažurira prvi dokument koji odgovara upitu.
Počnimo s početnim stanjem baze podataka:
[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Alex"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Alex "}]
Kad sada pokrenemo updateFirst:
Upit upita = novi upit (); query.addCriteria (Criteria.where ("ime"). je ("Alex")); Ažuriranje ažuriranja = novo Ažuriranje (); update.set ("ime", "James"); mongoTemplate.updateFirst (upit, ažuriranje, User.class);
Ažurirat će se samo prvi unos:
[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "James"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Alex "}]
5.5. UpdateMulti
UpdateMultiažurira sav dokument koji se podudara s danim upitom.
Prvo - evo stanja baze podataka prije nego što napravite updateMulti:
[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Eugen"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Eugen "}]
Ajmo sada pokrenuti updateMulti operacija:
Upit upita = novi upit (); query.addCriteria (Criteria.where ("ime"). je ("Eugen")); Ažuriranje ažuriranja = novo Ažuriranje (); update.set ("ime", "Victor"); mongoTemplate.updateMulti (upit, ažuriranje, User.class);
Oba postojeća objekta ažurirat će se u bazi podataka:
[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Victor"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Victor "}]
5.6. FindAndModify
Ova operacija djeluje kao updateMulti, ali to vraća objekt prije nego što je izmijenjen.
Prvo - stanje baze podataka prije poziva findAndModify:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Markus"}
Pogledajmo stvarni operativni kod:
Upit upita = novi upit (); query.addCriteria (Criteria.where ("ime"). je ("Markus")); Ažuriranje ažuriranja = novo Ažuriranje (); update.set ("ime", "Nick"); Korisnik korisnik = mongoTemplate.findAndModify (upit, ažuriranje, User.class);
Povratak objekt korisnika ima iste vrijednosti kao početno stanje u bazi podataka.
Međutim, novo stanje u bazi podataka je:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Nick"}
5.7. Upsert
The upsert radovi operiraju na pronaći i izmijeniti drugo stvoriti semantiku: ako se dokument podudara, ažurirajte ga, inače stvorite novi dokument kombiniranjem upita i objekta ažuriranja.
Počnimo s početnim stanjem baze podataka:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Markus"}
A sada - pokrenimo upsert:
Upit upita = novi upit (); query.addCriteria (Criteria.where ("ime"). je ("Markus")); Ažuriranje ažuriranja = novo Ažuriranje (); update.set ("ime", "Nick"); mongoTemplate.upsert (upit, ažuriranje, User.class);
Evo stanja baze podataka nakon operacije:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Nick"}
5.8. Ukloniti
Stanje baze podataka prije poziva ukloniti:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Benn"}
Ajmo sad trčati ukloniti:
mongoTemplate.remove (korisnik, "korisnik");
Rezultat će biti očekivan:
{ }
6. Korištenje MongoRepository
6.1. Umetnuti
Prvo - stanje baze podataka prije pokretanja umetnuti:
{ }
Sada, kada umetnemo novog korisnika:
Korisnik korisnik = novi korisnik (); user.setName ("Jon"); userRepository.insert (korisnik);
Evo završnog stanja baze podataka:
{"_id": ObjectId ("55b4fda5830b550a8c2ca25a"), "_class": "com.baeldung.model.User", "name": "Jon"}
Imajte na umu kako operacija radi isto kao i umetnuti u MongoTemplate API.
6.2. Uštedjeti – Umetnuti
Slično tome - uštedjeti radi isto kao i uštedjeti operacija u MongoTemplate API.
Krenimo od gledanja semantika umetka operacije; evo početnog stanja baze podataka:
{ }
Sada - izvršavamo uštedjeti operacija:
Korisnik korisnik = novi korisnik (); user.setName ("Aaron"); userRepository.save (korisnik);
To rezultira dodavanjem korisnika u bazu podataka:
{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Aaron"}
Ponovno zabilježite kako u ovom primjeru uštedjeti radi s umetnuti semantike, jer ubacujemo novi objekt.
6.3. Uštedjeti – ažuriranje
Pogledajmo sada istu operaciju, ali s ažurirati semantiku.
Prvo - evo stanja baze podataka prije pokretanja nove uštedjeti:
{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jack" 81 * 6}
Sada - izvršavamo operaciju:
user = mongoTemplate.findOne (Query.query (Criteria.where ("name"). je ("Jack")), User.class); user.setName ("Jim"); userRepository.save (korisnik);
Na kraju, evo stanja baze podataka:
{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jim"}
Ponovno zabilježite kako u ovom primjeru uštedjeti radi s ažuriranje semantiku, jer koristimo postojeći objekt.
6.4. Izbrisati
Stanje baze podataka prije poziva izbrisati:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Benn"}
Trčimo izbrisati:
userRepository.delete (korisnik);
Rezultat će jednostavno biti:
{ }
6.5. FindOne
Stanje baze podataka kada findOne Zove se:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Chris"}
Izvršimo sada findOne:
userRepository.findOne (user.getId ())
Rezultat koji će vratiti postojeće podatke:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Chris"}
6.6. Postoji
Stanje baze podataka prije poziva postoji:
{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Harris"}
A sad, bježimo postoji:
boolean isExists = userRepository.exists (user.getId ());
Što će se naravno vratiti pravi.
6.7. Pronađi sve W i Vrsta
Stanje baze podataka prije poziva pronađi sve:
[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Brendan"}, {"_id": ObjectId ("67b5ffa5511fee0e45ed614b"), "_class ":" com.baeldung.model.User "," name ":" Adam "}]
Ajmo sad trčati pronađi sve s Vrsta:
Popis korisnika = userRepository.findAll (Sort.by (Sort.Direction.ASC, "ime"));
Rezultat će biti poredano po imenu u rastućem redoslijedu:
[{"_id": ObjectId ("67b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Adam"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class ":" com.baeldung.model.User "," name ":" Brendan "}]
6.8. Pronađi sve W i Pageable
Stanje baze podataka prije poziva pronađi sve:
[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Brendan"}, {"_id": ObjectId ("67b5ffa5511fee0e45ed614b"), "_class ":" com.baeldung.model.User "," name ":" Adam "}]
Ajmo sada izvršiti pronađi sve sa zahtjevom za paginaciju:
Pageable pageableRequest = PageRequest.of (0, 1); Stranica stranice = userRepository.findAll (pageableRequest); Popis korisnika = pages.getContent ();
Dobivena korisnika Popis će biti samo jedan korisnik: Na kraju, idemo i na jednostavne napomene koje Spring Data koristi za pogon ovih API operacija. Razina polja @Iskaznica napomena može ukrasiti bilo koju vrstu, uključujući dugo i niz. Ako je vrijednost @Iskaznica polje nije null, pohranjuje se u bazu podataka takvo kakvo jest; u suprotnom, pretvarač će pretpostaviti da želite pohraniti ObjectId u bazi podataka (bilo ObjectId, String ili BigInteger raditi). Sljedeći - @Dokument: Ova napomena jednostavno označava klasu kao objekt domene to treba zadržati u bazi podataka, zajedno s dopuštanjem odabira naziva zbirke koja će se koristiti. Ovaj je članak bio brz, ali sveobuhvatan uvod u upotrebu MongoDB-a s Spring Data, oba putem MongoTemplate API, kao i korištenje MongoRepository. Implementacija svih ovih primjera i isječaka koda može se naći preko na Githubu.{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Brendan"}
7. Bilješke
@Id private String id;
Korisnik javne klase @Document {//}
8. Zaključak