Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
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 ...
Nächste SlideShare
Wird geladen in …5
×

Spring Data, Jongo & Co.

3.828 Aufrufe

Veröffentlicht am

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

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

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

×