Spring Data, Jongo & Co.

  • 987 views
Uploaded on

I present the MongoDB Java driver and the most popular object/document mappers for MongoDB: Spring Data, Jongo, Morphia, EclipseLink.

I present the MongoDB Java driver and the most popular object/document mappers for MongoDB: Spring Data, Jongo, Morphia, EclipseLink.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
987
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
12
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. codecentric AG 1 Spring Data, Jongo & Co. Java Persistenz-Frameworks für MongoDB Tobias.Trelle@codecentric.de @tobiastrelle
  • 2. codecentric AG 2 Tobias Trelle - Senior IT Consultant @ codecentric AG (Düsseldorf) - Organisator MongoDB Usergruppe Düsseldorf - Autor MongoDB-Buch (dpunkt-Verlag)
  • 3. codecentric AG 3 Where have all my tables gone … ORM is dead long live ODM
  • 4. codecentric AG 4 MongoDB?  NoSQL-Datenbank / Open Source  Dokumentenorientiert  Hochperformant, horizontal skalierbar (scale-out)  Replication & Sharding out-of-the-box  Map/Reduce  Geospatial Indexes / Queries
  • 5. codecentric AG 5 Grundkonzept MongoDB-Server Server Database Collection Document Field Tabelle Zeile Spalte Relationales Pendant Aber … Flexibles Schema - Arrays - Rekursiv
  • 6. codecentric AG 6 Document { title: "MongoDB" versions: [ { major: 2, minor: 6}, { major: 2, minor: 4} ] }
  • 7. codecentric AG 8 CRUD = IFUR insert(…) find(…), findOne(…) update(…) remove()
  • 8. codecentric AG 9 Java Persistenz mit MongoDB  MongoDB Java Driver  Spring Data MongoDB  Morphia  Jongo  EclipseLink for MongoDB 
  • 9. codecentric AG 10 Java Persistenz mit MongoDB Konnektivität
  • 10. codecentric AG 11 Use Case db.order.find( {"items.quantity": ? } )
  • 11. codecentric AG 12 Mongo Java Driver
  • 12. codecentric AG 13 MongoDB Drivers  One wire protocol for all client languages  A driver implementation per language  Responsibilities:  Converting language dependent data structures   BSON  Generating ObjectId for _id field  Overview: http://www.mongodb.org/display/DOCS/Drivers
  • 13. codecentric AG 14 Java Driver  One JAR w/o further dependencies: <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.11.3</version> </dependency>  github: https://github.com/mongodb/mongo-java-driver
  • 14. codecentric AG 15 Java Driver: API Overview
  • 15. codecentric AG 16 Java Driver: Connect to MongoDB import com.mongodb.MongoClient; // Default: localhost:27017 mongo = new MongoClient(); // Sharding: mongos server mongo = new MongoClient("mongos01", 4711); // Replica set mongo = new MongoClient(Arrays.asList( new ServerAddress("replicant01", 10001), new ServerAddress("replicant02", 10002), new ServerAddress("replicant03", 10003) ));
  • 16. codecentric AG 17 Java Driver: Database / Collection import com.mongodb.DB; import com.mongodb.DBCollection; DB db = mongo.getDB("test"); DBCollection collection = db.getCollection("foo");
  • 17. codecentric AG 18 Java Driver: Documents import com.mongodb.BasicDBObject; import com.mongodb.DBObject; // insert document DBObject doc = new BasicDBObject(); doc.put("date", new Date()); doc.put("i", 42); collection.insert(doc);
  • 18. codecentric AG 19 Java Driver: Queries import com.mongodb.DBCursor; DBCursor cursor; cursor = collection.find(); // all documents // documents w/ {i: 42} cursor = collection.find( new BasicDBObject("i", 42) ); document = cursor.next(); ...
  • 19. codecentric AG 20 Java Driver: Order Use Case DB db = mongo.getDB("test"); DBCollection collection = db.getCollection("order"); DBObject order; List<DBObject> items = new ArrayList<DBObject>(); DBObject item; // order order = new BasicDBObject(); order.put("date", new Date()); order.put("custInfo" , "Tobias Trelle"); order.put("items", items); // items item = new BasicDBObject(); item.put("quantity", 1); item.put("price", 47.11); item.put("desc", "Item #1"); items.add(item); item = new BasicDBObject(); item.put("quantity", 2); item.put("price", 42.0); item.put("desc", "Item #2"); items.add(item); collection.insert(order);
  • 20. codecentric AG 21 Java Driver: Order Use Case DB db = mongo.getDB("test"); DBCollection collection = db.getCollection("order"); DBObject query; DBObject document; DBCursor cursor; query = new BasicDBObject("items.quantity", 2); cursor = collection.find(query); while ( cursor.hasNext() ) { document = cursor.next(); println(document); }
  • 21. codecentric AG 22 Spring Data MongoDB
  • 22. codecentric AG 23 Spring Data MongoDB – Fact Sheet Vendor Pivotal / SpringSource License Apache License, Version 2.0 Documentation http://www.springsource.org/spring-data/mongodb Main Features • Repository Support • Object/Document Mapping • Templating
  • 23. codecentric AG 24 Spring Data Common patterns for RDBMS and NoSQL data stores Spring Data RDBMS MongoDB Neo4j … Spring Data JPA CrudRepository PagingAndSortingRepository JpaRepository JPA JDBC Spring Data MongoDB MongoRepository MongoTemplate Spring Data Neo4j Spring Data … GraphRepository Neo4jTemplate Mongo Java Driver Embedded REST Quelle: http://www.infoq.com/articles/spring-data-intro
  • 24. codecentric AG 25 Spring Data MongoDB Templating  Resource abstraction  Configure connections to mongod / mongos node(s)  Collection lifecycle ( create, drop)  Map/Reduce / Aggregation Object Mapping  Annotation based: @Document, @Field, @Index etc.  Classes are mapped to collections, Java Objects to documents Repository Support  Queries are derived from methods signatures  Annotated Queries
  • 25. codecentric AG 26 Spring Data MongoDB: Configuration <!-- Connection to MongoDB server --> <mongo:db-factory host="localhost" port="27017" dbname="test" /> <!-- MongoDB Template --> <bean id="mongoTemplate„ class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/> </bean> <!-- Package w/ automagic repositories --> <mongo:repositories base-package="mongodb" />
  • 26. codecentric AG 28 Spring Data MongoDB: Object Mapping public class Order { @Id private String id; private Date date; @Field("custInfo") private String customerInfo; List<Item> items; ... } public class Item { private int quantity; private double price; @Field("desc") private String description; ... }
  • 27. codecentric AG 29 Spring Data MongoDB: Repository Support public interface OrderRepository extends MongoRepository<Order, String> { List<Order> findByItemsQuantity(int quantity); @Query( value = "{ custInfo: ?0 }", fields = "{_id:0, items:1}") List<Order> findOnlyItems(String name); }
  • 28. codecentric AG 30 Spring Data MongoDB: Additional Goodies  Map/Reduce / Aggregation framework  Index Management  Support for GridFS  Geopspatial indexes / queries  Optimistic Locking
  • 29. codecentric AG 31 Morphia
  • 30. codecentric AG 32 Morphia – Fact Sheet Vendor MongoDB Inc. License Apache License, Version 2.0 Documentation https://github.com/mongodb/morphia Main Features • Object/Document Mapping • Custom Query API • DAO support
  • 31. codecentric AG 33 Morphia: Object Mapping public class Order { @Id private ObjectId id; private Date date; @Property("custInfo") private String customerInfo; @Embedded List<Item> items; ... } public class Item { private int quantity; private double price; @Property("desc") private String description; ... }
  • 32. codecentric AG 34 Morphia: Queries public class OrderDao extends BasicDAO<Order, ObjectId> { List<Order> findByItemsQuantity(int quantity) { return find( createQuery().filter("items.quantity", quantity)) .asList(); } List<Order> findByItemsPriceGreaterThan(double price) { return find( createQuery().field("items.price").greaterThan(price) ) .asList(); } … }
  • 33. codecentric AG 35 Morphia: Queries public class OrderDao extends BasicDAO<Order, ObjectId> {  // Projection  List<Item> findItems(String customerName) {  List<Order> orders = find(createQuery().  field("custInfo").equal(customerName).  retrievedFields(true, "items")  ).asList();  // check for null in production code!  return orders.get(0).getItems();  } }
  • 34. codecentric AG 36 Morphia: Custom query syntax – why? Morphia Mongo Query = $eq !=, <> $neq >, <, >=,<= $gt, $lt, $gte, $lte in, nin $in, $nin elem $elemMatch … ….
  • 35. codecentric AG 37 Jongo
  • 36. codecentric AG 38 Jongo – Fact Sheet Developer Benoît Guérout, Yves Amsellem License Apache License, Version 2.0 Documentation http://jongo.org/ Main Features • Object/Document Mapping • Custom Query API
  • 37. codecentric AG 39 Jongo: Object Mapping public class Order { private ObjectId id; private Date date; @JsonProperty("custInfo") private String customerInfo; List<Item> items; … } public class Item { private int quantity; private double price; @JsonProperty("desc") private String description; … }
  • 38. codecentric AG 40 Jongo: Queries // Java driver API MongoClient mc = new MongoClient(); DB db = mc.getDB("odm_jongo"); // Jongo API entry point Jongo jongo = new Jongo(db); MongoCollection orders = jongo.getCollection("order"); // no DAO needed Iterable<Order> result = orders.find("{"items.quantity": #}", 2).as(Order.class); // Projection Iterable<X> result = orders.find().fields("{_id:0, date:1, custInfo:1}").as(X.class);
  • 39. codecentric AG 41 EclipseLink NoSQL
  • 40. codecentric AG 42 EclipseLink NoSQL MongoDB – Fact Sheet Vendor Eclipse Foundation License Eclipse Public License (EPL) Documentation http://www.eclipse.org/eclipselink/documentation/2.4/con cepts/nosql.htm Main Features • JPA API (Subset) • JPQL Query Language / Native Queries
  • 41. codecentric AG 43 EclipseLink NoSQL  Implements JPA API (subset)  JP-QL query are translated to native datastore queries  Oracle NoSQL, MongoDB
  • 42. codecentric AG 44 EclipseLink NoSQL MongoDB: Configuration <persistence version="2.0" …> <persistence-unit name="mongodb"> <class>hibernate.Order</class> <class>hibernate.Item</class> <properties>  <property name="eclipselink.target-database" value="org.eclipse.persistence.nosql.adapters.mongo.MongoPlatform"/> <property name="eclipselink.nosql.connection-spec" value="org.eclipse.persistence.nosql.adapters.mongo.MongoConnectionSpec"/> <property name="eclipselink.nosql.property.mongo.port" value="27017"/> <property name="eclipselink.nosql.property.mongo.host" value="127.0.0.1"/> <property name="eclipselink.nosql.property.mongo.db" value="odm_eclipselink"/> <property name="eclipselink.logging.level" value="FINE"/> </properties> </persistence-unit> </persistence>
  • 43. codecentric AG 45 EclipseLink NoSQL MongoDB : Object Mapping @Entity @NoSql(dataFormat=DataFormatType.MAPPED) public class Order { @GeneratedValue @Id @Field(name = "_id") private String id; private Date date; @Column(name = "custInfo") private String customerInfo; @ElementCollection private List<Item> items;
  • 44. codecentric AG 46 EclipseLink NoSQL MongoDB : Object Mapping @Embeddable @NoSql(dataFormat=DataFormatType.MAPPED) public class Item { private int quantity; private double price; @Column(name="desc") private String description; ...
  • 45. codecentric AG 47 EclipseLink NoSQL MongoDB : Queries // JPQL Order order = em.createQuery(  "SELECT o FROM Order o JOIN o.items i WHERE i.quantity = 2",  Order.class).getSingleResult(); // native Order order = (Order)em.createNativeQuery(  "db.ORDER.findOne({_id: "" + id + ""})",  Order.class).getSingleResult();
  • 46. codecentric AG 48 EclipseLink NoSQL MongoDB  Problems w/ nested native queries Uses relational API, TX required(?)
  • 47. codecentric AG 49 More JPA Providers for MongoDB  Hibernate OGM  Very early beta  No support for queries  Data Nucleus
  • 48. codecentric AG 50 Hibernate OGM: OgmEntityManager
  • 49. codecentric AG 51 Judge yourself … Spring Data MongoDB https://github.com/ttrelle/spring-data-examples Morphia https://github.com/ttrelle/morphia-mongodb-examples Jongo https://github.com/ttrelle/jongo-examples EclipseLink https://github.com/ttrelle/eclipselink-mongodb-examples
  • 50. codecentric AG 52 Summary ODM Annotations Queries Java Driver -- Nested BasicDBObject‘s Spring Data MongoDB Custom Interface w/ - derived queries - Native queries EclipseLink JPA + Custom JPQL: @Named(Native)Query + EntityManager Jongo Jackson JSON queries via collection wrapper Morphia Custom BasicDAO super class w/ 2 flavours of fluent API
  • 51. codecentric AG 53 Which one should I use? EclipseLink Spring Data MongoDB MongoDB Java Driver Morphia JPA JDBC MongoDB Jongo - Ready for production - Supported by MongoDB Inc. Mature - Ready for production - Active community - API mismatch The „better“ driver
  • 52. codecentric AG 54 MongoDB User Group Düsseldorf https://www.xing.com/net/mongodb-dus @MongoDUS MUG Düsseldorf
  • 53. codecentric AG 55 QUESTIONS? Tobias Trelle codecentric AG Merscheider Str. 1 42699 Solingen tel +49 (0) 212.233628.47 fax +49 (0) 212.233628.79 mail Tobias.Trelle@codecentric.de twitter @tobiastrelle www.codecentric.de blog.codecentric.de/en/author/tobias-trelle www.xing.com/net/mongodb-dus