Your SlideShare is downloading. ×
0
codecentric AG 1
Spring Data, Jongo & Co.
Java Persistenz-Frameworks für MongoDB
Tobias.Trelle@codecentric.de @tobiastrelle
codecentric AG 2
Tobias Trelle
- Senior IT Consultant @
codecentric AG (Düsseldorf)
- Organisator MongoDB
Usergruppe Düsse...
codecentric AG 3
Where have all my tables gone …
ORM is dead
long live ODM
codecentric AG 4
MongoDB?
 NoSQL-Datenbank / Open Source
 Dokumentenorientiert
 Hochperformant, horizontal skalierbar (...
codecentric AG 5
Grundkonzept MongoDB-Server
Server
Database
Collection
Document
Field
Tabelle
Zeile
Spalte
Relationales
P...
codecentric AG 6
Document
{
title: "MongoDB"
versions: [
{ major: 2, minor: 6},
{ major: 2, minor: 4}
]
}
codecentric AG 8
CRUD = IFUR
insert(…)
find(…), findOne(…)
update(…)
remove()
codecentric AG 9
Java Persistenz mit MongoDB
 MongoDB Java Driver
 Spring Data MongoDB
 Morphia
 Jongo
 EclipseLink f...
codecentric AG 10
Java Persistenz mit MongoDB
Konnektivität
codecentric AG 11
Use Case
db.order.find( {"items.quantity": ? } )
codecentric AG 12
Mongo Java Driver
codecentric AG 13
MongoDB Drivers
 One wire protocol for all client languages
 A driver implementation per language
 Re...
codecentric AG 14
Java Driver
 One JAR w/o further dependencies:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>...
codecentric AG 15
Java Driver: API Overview
codecentric AG 16
Java Driver: Connect to MongoDB
import com.mongodb.MongoClient;
// Default: localhost:27017
mongo = new ...
codecentric AG 17
Java Driver: Database / Collection
import com.mongodb.DB;
import com.mongodb.DBCollection;
DB db = mongo...
codecentric AG 18
Java Driver: Documents
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
// insert document...
codecentric AG 19
Java Driver: Queries
import com.mongodb.DBCursor;
DBCursor cursor;
cursor = collection.find(); // all do...
codecentric AG 20
Java Driver: Order Use Case
DB db = mongo.getDB("test");
DBCollection collection = db.getCollection("ord...
codecentric AG 21
Java Driver: Order Use Case
DB db = mongo.getDB("test");
DBCollection collection = db.getCollection("ord...
codecentric AG 22
Spring Data
MongoDB
codecentric AG 23
Spring Data MongoDB – Fact Sheet
Vendor Pivotal / SpringSource
License Apache License, Version 2.0
Docum...
codecentric AG 24
Spring Data
Common patterns for RDBMS and NoSQL data stores
Spring Data
RDBMS MongoDB Neo4j …
Spring Dat...
codecentric AG 25
Spring Data MongoDB
Templating
 Resource abstraction
 Configure connections to mongod / mongos node(s)...
codecentric AG 26
Spring Data MongoDB: Configuration
<!-- Connection to MongoDB server -->
<mongo:db-factory host="localho...
codecentric AG 28
Spring Data MongoDB: Object Mapping
public class Order {
@Id private String id;
private Date date;
@Fiel...
codecentric AG 29
Spring Data MongoDB: Repository Support
public interface OrderRepository extends
MongoRepository<Order, ...
codecentric AG 30
Spring Data MongoDB: Additional Goodies
 Map/Reduce / Aggregation framework
 Index Management
 Suppor...
codecentric AG 31
Morphia
codecentric AG 32
Morphia – Fact Sheet
Vendor MongoDB Inc.
License Apache License, Version 2.0
Documentation https://githu...
codecentric AG 33
Morphia: Object Mapping
public class Order {
@Id private ObjectId id;
private Date date;
@Property("cust...
codecentric AG 34
Morphia: Queries
public class OrderDao extends BasicDAO<Order, ObjectId> {
List<Order> findByItemsQuanti...
codecentric AG 35
Morphia: Queries
public class OrderDao extends BasicDAO<Order, ObjectId> {
 // Projection
 List<Item> ...
codecentric AG 36
Morphia: Custom query syntax – why?
Morphia Mongo Query
= $eq
!=, <> $neq
>, <, >=,<= $gt, $lt, $gte, $l...
codecentric AG 37
Jongo
codecentric AG 38
Jongo – Fact Sheet
Developer Benoît Guérout, Yves Amsellem
License Apache License, Version 2.0
Documenta...
codecentric AG 39
Jongo: Object Mapping
public class Order {
private ObjectId id;
private Date date;
@JsonProperty("custIn...
codecentric AG 40
Jongo: Queries
// Java driver API
MongoClient mc = new MongoClient();
DB db = mc.getDB("odm_jongo");
// ...
codecentric AG 41
EclipseLink NoSQL
codecentric AG 42
EclipseLink NoSQL MongoDB – Fact Sheet
Vendor Eclipse Foundation
License Eclipse Public License (EPL)
Do...
codecentric AG 43
EclipseLink NoSQL
 Implements JPA API (subset)
 JP-QL query are translated to native
datastore queries...
codecentric AG 44
EclipseLink NoSQL MongoDB: Configuration
<persistence version="2.0" …>
<persistence-unit name="mongodb">...
codecentric AG 45
EclipseLink NoSQL MongoDB : Object Mapping
@Entity
@NoSql(dataFormat=DataFormatType.MAPPED)
public class...
codecentric AG 46
EclipseLink NoSQL MongoDB : Object Mapping
@Embeddable
@NoSql(dataFormat=DataFormatType.MAPPED)
public c...
codecentric AG 47
EclipseLink NoSQL MongoDB : Queries
// JPQL
Order order = em.createQuery(
 "SELECT o FROM Order o JOIN ...
codecentric AG 48
EclipseLink NoSQL MongoDB
 Problems w/ nested native queries
Uses relational API, TX required(?)
codecentric AG 49
More JPA Providers for MongoDB
 Hibernate OGM
 Very early beta
 No support for queries
 Data Nucleus
codecentric AG 50
Hibernate OGM: OgmEntityManager
codecentric AG 51
Judge yourself …
Spring Data MongoDB
https://github.com/ttrelle/spring-data-examples
Morphia
https://git...
codecentric AG 52
Summary
ODM
Annotations
Queries
Java Driver -- Nested BasicDBObject‘s
Spring Data MongoDB Custom Interfa...
codecentric AG 53
Which one should I use?
EclipseLink
Spring Data
MongoDB
MongoDB Java Driver
Morphia
JPA
JDBC
MongoDB
Jon...
codecentric AG 54
MongoDB User Group Düsseldorf
https://www.xing.com/net/mongodb-dus
@MongoDUS
MUG Düsseldorf
codecentric AG 55
QUESTIONS?
Tobias Trelle
codecentric AG
Merscheider Str. 1
42699 Solingen
tel +49 (0) 212.233628.47
fax ...
Upcoming SlideShare
Loading in...5
×

Spring Data, Jongo & Co.

1,694

Published on

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

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,694
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
16
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "Spring Data, Jongo & Co."

  1. 1. codecentric AG 1 Spring Data, Jongo & Co. Java Persistenz-Frameworks für MongoDB Tobias.Trelle@codecentric.de @tobiastrelle
  2. 2. codecentric AG 2 Tobias Trelle - Senior IT Consultant @ codecentric AG (Düsseldorf) - Organisator MongoDB Usergruppe Düsseldorf - Autor MongoDB-Buch (dpunkt-Verlag)
  3. 3. codecentric AG 3 Where have all my tables gone … ORM is dead long live ODM
  4. 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. 5. codecentric AG 5 Grundkonzept MongoDB-Server Server Database Collection Document Field Tabelle Zeile Spalte Relationales Pendant Aber … Flexibles Schema - Arrays - Rekursiv
  6. 6. codecentric AG 6 Document { title: "MongoDB" versions: [ { major: 2, minor: 6}, { major: 2, minor: 4} ] }
  7. 7. codecentric AG 8 CRUD = IFUR insert(…) find(…), findOne(…) update(…) remove()
  8. 8. codecentric AG 9 Java Persistenz mit MongoDB  MongoDB Java Driver  Spring Data MongoDB  Morphia  Jongo  EclipseLink for MongoDB 
  9. 9. codecentric AG 10 Java Persistenz mit MongoDB Konnektivität
  10. 10. codecentric AG 11 Use Case db.order.find( {"items.quantity": ? } )
  11. 11. codecentric AG 12 Mongo Java Driver
  12. 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. 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. 14. codecentric AG 15 Java Driver: API Overview
  15. 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. 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. 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. 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. 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. 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. 21. codecentric AG 22 Spring Data MongoDB
  22. 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. 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. 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. 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. 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. 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. 28. codecentric AG 30 Spring Data MongoDB: Additional Goodies  Map/Reduce / Aggregation framework  Index Management  Support for GridFS  Geopspatial indexes / queries  Optimistic Locking
  29. 29. codecentric AG 31 Morphia
  30. 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. 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. 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. 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. 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. 35. codecentric AG 37 Jongo
  36. 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. 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. 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. 39. codecentric AG 41 EclipseLink NoSQL
  40. 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. 41. codecentric AG 43 EclipseLink NoSQL  Implements JPA API (subset)  JP-QL query are translated to native datastore queries  Oracle NoSQL, MongoDB
  42. 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. 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. 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. 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. 46. codecentric AG 48 EclipseLink NoSQL MongoDB  Problems w/ nested native queries Uses relational API, TX required(?)
  47. 47. codecentric AG 49 More JPA Providers for MongoDB  Hibernate OGM  Very early beta  No support for queries  Data Nucleus
  48. 48. codecentric AG 50 Hibernate OGM: OgmEntityManager
  49. 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. 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. 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. 52. codecentric AG 54 MongoDB User Group Düsseldorf https://www.xing.com/net/mongodb-dus @MongoDUS MUG Düsseldorf
  53. 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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×