Using POJO as a centric data model for interacting with mongodb, can be achieved with Spring Data.
Objectives:
- Building simple mongodb java application using Spring Data.
Environment:
- Windows
- Eclipse
- Maven “optional”
- mongodb 2.2 Installing MongoDB on Windows 7
Libraries:
for complete list of jar files check .classpath file with the source code
- Spring Framework spring-framework-3.2.2.RELEASE-dist.zip
- Spring Data Mongodb spring-data-mongodb-1.2.0.RELEASE.zip
- mongo-java-driver
for complete pom.xml file check source code
<dependencies> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.1.1.RELEASE</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> <scope>runtime</scope> </dependency> </dependencies>
( 1 ) Project Structure
( 2 ) Spring Configuration (xml configuration)
Note: you can configure Spring Data Mongodb using annotation “Java based bean metadata” 5.3.1 Registering a Mongo instance using Java based metadata.
- spring.xml
for complete spring.xml file check the source code
<?xml version="1.0" encoding="UTF-8"?> <beans ..... <!-- Default bean name is 'mongo' --> <mongo:mongo host="localhost" port="27017"/> <!-- Default bean name is 'mongoDbFactory' --> <mongo:db-factory dbname="test" /> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> </bean> <!-- Alternative way to instantiate mongoTemplate <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg ref="mongo"/> <constructor-arg name="databaseName" value="test"/> </bean> --> </beans>
( 3 ) POJO
We have two java model “POJO” that will be stored in mongodb as documents.
- Person.java: main data model to be stored as “document”.
- Address.java: will be stored as sub document of Person.
- @Document(collection=”people”) : if collection is declared here no need to specify it when applying CRUD to Person.
- Person.java
package com.hmkcode.vo; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Document(collection="people") public class Person { //Field annotated with "@Id" or named "id" will be mapped to document _id which is a required field. //so here we can add @Id or leave it. @Id private int id; private String name; private String[] friends; private Address address; public Person(int id,String name,String[] friends,Address address){ this.id = id; this.name = name; this.friends = friends; this.address = address; } //instantiate Person with default friends and address public Person(int id,String name){ this.id = id; this.name = name; String f[] = {"John","Brit","Tim"}; this.friends = f; this.address = new Address("US","NY","New York"); } public Person(){} //setters and getters... public String toString(){ String friendsArray = ""; for(int f = 0 ; f < friends.length;f++) friendsArray += friends[f]+( (f+1) < friends.length?" , ":""); return "{id: "+this.id+", name: "+this.name+", friends: [ "+friendsArray+" ] , address: "+this.address+"}"; } }
- Address.java
package com.hmkcode.vo; public class Address { private String country; private String state; private String city; public Address(String country,String state,String city){ this.country = country; this.state = state; this.city = city; } public Address(){} //setters & getters... public String toString(){ return "{country: "+this.country+" , state: "+this.state+" , city: "+this.city+"}"; } }
( 4 ) Interacting with Mongodb (Main.java)
- save(Person) “only one”
- insert(Collection<Person>) “many person”
- find(Person where name =”Scott”)
- findAll(Person.class)
- updateMulti(Person set address ={country: US , state: CA , city: San Diego} where name = “Scott”)
- find(Person where name =”Scott”)
- remove(Query,Person.class)
- Main.java
package com.hmkcode.spring.data.mongodb; import java.util.Collection; import java.util.LinkedList; import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import com.hmkcode.vo.Address; import com.hmkcode.vo.Person; public class Main { public static void main(String args[]){ ApplicationContext ctx = new ClassPathXmlApplicationContext("com/hmkcode/spring/spring.xml"); MongoOperations mongoOperation = (MongoOperations)ctx.getBean("mongoTemplate"); Collection<Person> persons = new LinkedList<Person>(); persons.add(new Person(2,"Scott")); persons.add(new Person(3,"Tim")); persons.add(new Person(4,"Lora")); //( 1 ) save one person // if collection is not specified in @Document(collection="people"), we need to specify collection name // in save(document, collection); mongoOperation.save(new Person(1,"Brit")); //------------------------------------------------------- //( 2 ) insert many persons //if we have a list of different type of documents to be inserted, their collection will be //specified by @Document(collection="collectionName") mongoOperation.insert(persons, Person.class); //------------------------------------------------------- //( 3 ) find inserted person Person savedPerson = mongoOperation.findOne( new Query(Criteria.where("name").is("Scott")), Person.class ); System.out.println("saved Person: " + savedPerson); //------------------------------------------------------- //( 4 ) find all persons List<Person> allPersons = mongoOperation.findAll(Person.class); System.out.println("Number of persons = " + allPersons.size()); //------------------------------------------------------- //( 5 ) updateMulti // update mongoOperation.updateMulti( new Query(Criteria.where("name").is("Scott")), Update.update("address", new Address("US","CA","San Diego")), Person.class ); //------------------------------------------------------- //( 6 ) find updated person Person updatedPerson = mongoOperation.findOne( new Query(Criteria.where("name").is("Scott")), Person.class ); System.out.println("Updated Person: " + updatedPerson); //------------------------------------------------------- //( 7 ) remove person mongoOperation.remove(new Query(),Person.class); System.out.println("Numober persons: " + mongoOperation.findAll(Person.class).size()); } }
( 5 ) Run
- Run mongodb
- Run Main.java
You should get the following results
Source Code github